Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Валерий Кравец, Оптимизация docker-образов
Search
brabadu
June 26, 2020
Programming
260
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Валерий Кравец, Оптимизация docker-образов
brabadu
June 26, 2020
More Decks by brabadu
See All by brabadu
Tanok - Elm Arhictecture in JS
brabadu
2
740
Other Decks in Programming
See All in Programming
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
170
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.5k
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
140
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
3
1.5k
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
510
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.4k
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
500
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
440
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
9.1k
共通化で考えるべきは、実装より公開する型だった
codeegg
0
250
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
140
Featured
See All Featured
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
460
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
220
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Tell your own story through comics
letsgokoyo
1
1k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
Accessibility Awareness
sabderemane
1
160
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
180
The Pragmatic Product Professional
lauravandoore
37
7.4k
How to train your dragon (web standard)
notwaldorf
97
6.7k
Optimizing for Happiness
mojombo
378
71k
Transcript
None
КТО Я ТАКОЙ? КТО Я ТАКОЙ?
КРАВЕЦ ВАЛЕРИЙ КРАВЕЦ ВАЛЕРИЙ DevOps команды EvoPay Человеком с синдромом
DevOps головного мозга Забавный пункт
NODE JS DOCKER IMAGE NODE JS DOCKER IMAGE МЕНЬШЕ ЧЕМ
БАЗОВЫЙ МЕНЬШЕ ЧЕМ БАЗОВЫЙ
А ЗАЧЕМ БЫЛО А ЗАЧЕМ БЫЛО ПАКОВАТЬ NODEJS В DOCKER?
ПАКОВАТЬ NODEJS В DOCKER?
О ПРОЕКТЕ О ПРОЕКТЕ Ссылка на проект: продвинутый командный месседжер
15 микросвервисов backend на NodeJS Chanty
ЗАЧЕМ ЗАЧЕМ ОПТИЗИРОВАТЬ? ОПТИЗИРОВАТЬ?
None
ВХОДНЫЕ ПРОБЛЕМЫ: ВХОДНЫЕ ПРОБЛЕМЫ: размеры образов время старта новой версии
me to market docker registry 200 Gb нет нормльного способа чистить docker registry проблемы с обновлением nodejs
ПУТИ ОПТИМИЗАЦИИ ПУТИ ОПТИМИЗАЦИИ
ПРОСТЫЕ: ПРОСТЫЕ: смена дистибутива базового image оптимизация слоев кеширование мультистейдженоговая
сборка магические тулы СЛОЖНЫЕ: СЛОЖНЫЕ: Distroless images магия JavaScript инструментария
СМЕНА ДИСТИБУТИВА БАЗОВОГО IMAGE СМЕНА ДИСТИБУТИВА БАЗОВОГО IMAGE FROM node:12-buster
# 886MB FROM node:12-stretch-slim # 156MB FROM node:12-alpine # 89.3MB
РАБОТАЕТ ДЛЯ: РАБОТАЕТ ДЛЯ: NodeJS PHP Go Etc НЕ РАБОТАЕТ
ДЛЯ: НЕ РАБОТАЕТ ДЛЯ: Python
ОПТИМИЗАЦИЯ СЛОЕВ ОПТИМИЗАЦИЯ СЛОЕВ
None
RUN apk add --no-cache --virtual .build-deps \ bash \ git
\ build-base \ openssh-client RUN npm i -g npm RUN npm install RUN npm build # Cleanup build dependencies RUN apk del -f .build-deps
RUN set -xe \ && apk add --no-cache --virtual .build-deps
\ bash \ git \ build-base \ openssh-client \ && npm i -g npm \ && npm install \ && npm build \ && apk del -f .build-deps
ПРЕИМУЩЕСТВА: ПРЕИМУЩЕСТВА: Меньшее количество слоев Нет мусора в конечном image
Размер конечного docker image Безопасность конечного имеджа НЕДОСТАТКИ: НЕДОСТАТКИ: Время сборки Невозможность переиспользования
МУЛЬТИСТЕЙДЖЕНОГОВАЯ СБОРКА МУЛЬТИСТЕЙДЖЕНОГОВАЯ СБОРКА # Stage 1 FROM node:12-alpine as
Builder RUN set -xe \ && apk add --no-cache \ git \ build-base \ openssh-client \ && npm i -g npm \ && npm install \ && npm build # Stage 2 FROM node:12-alpine as app COPY --from=Builder /app/build /app COPY --from=Builder /usr/share/misc/magic.mgc /usr/share/misc/mag
ПРЕИМУЩЕСТВА: ПРЕИМУЩЕСТВА: Возможность вынести стейдж 1 отдельно Возможность кеширования и
переиспользования Больше читабельности Нет забот с очисткой НЕДОСТАТКИ: НЕДОСТАТКИ: Необходимость понимать внешние зависимости Время конечной сборки
МАГИЧЕСКИЕ ТУЛЫ МАГИЧЕСКИЕ ТУЛЫ Опытный колега docker-slim
None
DISTROLESS IMAGES DISTROLESS IMAGES свой от Google
ПОЧЕМУ СВОЙ? ПОЧЕМУ СВОЙ? Image Size Node v10 Node version
gcr.io/distroless/nodejs 81 MB only 10.17 node:10-alpine 77 MB from 10 to 14 own image 42MB any
КАК СДЕЛАТЬ СВОЙ DISTROLESS IMAGE КАК СДЕЛАТЬ СВОЙ DISTROLESS IMAGE
FROM node:12-alpine as base RUN apk add \ binutils \ ca-certificates \ gawk \ && mkdir /build \ && strip --strip-all /usr/local/bin/node \ && ldd /usr/local/bin/node \ | awk '/=>/{print $3}' \ | while read LIB_PATH; \ do cp --parents $LIB_PATH /build/;\ done \ && cp --parents /etc/ssl/certs/ca-certificates.crt /build/ FROM scratch COPY --from=base /usr/local/bin/node /usr/local/bin/node
ПРЕИМУЩЕСТВА: ПРЕИМУЩЕСТВА: Экономия места Безопасность НЕДОСТАТКИ: НЕДОСТАТКИ: Не всем подойдет
отсутствие shell и core-u ls Необходимость понимать и прописывать внешние зависимости
None
None
JAVASCRIPT ИНСТРУМЕНТАРИЙ JAVASCRIPT ИНСТРУМЕНТАРИЙ webpack webpack-merge
webpack.config.js webpack.config.js var path = require('path'); var webpack = require('webpack');
var fs = require('fs'); const merge = require('webpack-merge'); const tools = require('server-lib/tools/build'); var entries = {}; for (var i = 0; i < tools.length; i++) { entries[tools[i]] = './node_modules/server-lib/tools/'+tools[ } console.log(entries) module.exports = merge( require('server-utils/webpack.config.js'), require('server-lib/webpack.config.js'),
И ЧТО ЭТО ДАЛО? И ЧТО ЭТО ДАЛО? Object Size
sources 0.15 MB ./node_modules 108 MB server.js 15 MB
ЧТО В ИТОГЕ? ЧТО В ИТОГЕ? Image Size Node v12
node:10-alpine 77 MB own/node:12-distroless 42 MB own/node:12-builder 386 MB app:web-api 60 MB
ПРЕИМУЩЕСТВА: ПРЕИМУЩЕСТВА: Мы забыли о вопросах с Docker registry Практический
мгновенное обновление на проде Использование build image для локальной разработки Огромная безопасность, нечего ломать Четка декларация зависимостей
НЕДОСТАТКИ: НЕДОСТАТКИ: Не всем подойдет отсутствие shell и core-u ls
Сложность с осознанием своих зависимостей Требует времени и усилий
None
None