Что будет интересного в Docker 1.13
Обновление докера — это не только ценный мех неработающее апи и новые баги, но и несколько полезных и любопытных фичей. Я внимательно почитал СHANGELOG и заметил кучу всего интересного.
Builder
--cache-from
Отличная новость для всех, кто собирает докер в CI. Эта опция делает возможным на агентах пулить уже собранные имеджи и использовать их как кеш при docker build
. Пример:
☁ docker build -t ctrlok/tmp .
Sending build context to Docker daemon 4.096 kB
Step 1/4 : FROM ubuntu
---> 104bec311bcd
Step 2/4 : RUN mkdir /some
---> Running in 06b3c7fac6b2
---> 151b1b22e57e
Removing intermediate container 06b3c7fac6b2
Step 3/4 : RUN touch /some/file
---> Running in e8c20531d556
---> 48ea9ff35623
Removing intermediate container e8c20531d556
Step 4/4 : RUN touch /some/file2
---> Running in 93b77770c964
---> 3b29b5325583
Removing intermediate container 93b77770c964
Successfully built 3b29b5325583
☁ docker push ctrlok/tmp
...
☁ docker rmi ctrlok/tmp
Untagged: ctrlok/tmp:latest
...
☁ docker pull ctrlok/tmp
...
☁ docker build -t ctrlok/tmp --cache-from ctrlok/tmp .
Sending build context to Docker daemon 4.096 kB
Step 1/4 : FROM ubuntu
---> 104bec311bcd
Step 2/4 : RUN mkdir /some
---> Using cache
---> ca00f8cebfd5
Step 3/4 : RUN touch /some/file
---> Using cache
---> fb46e873d527
Step 4/4 : RUN touch /some/file2
---> Using cache
---> 8d88585516d9
Successfully built 8d88585516d9
Удобно, практично, надо будет такое же сделать в rocker.
--squash
Вторая отличная новость — сквош имеджей. Если при сборке указать опцию --squash
, то докер наложит все изменения оверлейной fs друг на друга до уровня FROM
.
☁ du -sh *
4.0K Dockerfile
100M bigfile
☁ docker build -t ctrlok/tmp1 --squash .
Sending build context to Docker daemon 104.9 MB
Step 1/3 : FROM busybox
---> 8a4698b1752b
Step 2/3 : ADD bigfile ./
---> 74a284cb9e4f
Removing intermediate container 469de34d707e
Step 3/3 : RUN rm bigfile
---> Running in e489bf4c661b
---> 307dee68fdd3
Removing intermediate container e489bf4c661b
Successfully built 307dee68fdd3
☁ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ctrlok/tmp1 latest 2299eb293332 2 hours ago 1.11 MB
<none> <none> 307dee68fdd3 2 hours ago 106 MB
Как видим, кеш остается ( образ 307dee68fdd3
), но образ ctrlok\tmp1
весит всего 1.11 MB
.
Фишка крутая и пригодится многим. Ясное дело, она всё равно не заменяет IMPORT
и EXPORT
из rocker, потому что сжатие происходит только до родительского образа. То есть задача «собрать образ стандартными средствами докера так, чтобы в нём был только один бинарник» остаётся нетривиальной.
--compress
Как вам известно, докер, когда собирает образ, передаёт весь контекст (каталог) на сервер, даже если файлы из этого контекста не используются в docker файле. Это очень сильно замедляет сборку в случае больших каталогов или удалённого соединения.
Конечно, можно складывать все неиспользуемые файлы в .dockerignore
, но это не очень удобно. Особенно если используется несколько докерфайлов.
В rocker, кстати, передаются только используемые файлы для каждой сборки.
В любом случае, в версии docker 1.13 появится опция --compress
, которая сжимает контекст перед отправкой. Для примера я создал в каталоге файл из нулей в 100MB:
☁ time docker build -t ctrlok/tmp1 --squash .
Sending build context to Docker daemon 104.9 MB
Step 1/2 : FROM busybox
---> 8a4698b1752b
Step 2/2 : RUN touch 1
---> Using cache
---> 8232d556854e
Successfully built 8232d556854e
docker build -t ctrlok/tmp1 --squash . 0.13s user 0.32s system 26% cpu 1.716 total
☁ time docker build -t ctrlok/tmp1 --squash --compress .
Sending build context to Docker daemon 102.1 kB
Step 1/2 : FROM busybox
---> 8a4698b1752b
Step 2/2 : RUN touch 1
---> Using cache
---> 8232d556854e
Successfully built 8232d556854e
docker build -t ctrlok/tmp1 --squash --compress . 0.65s user 0.05s system 64% cpu 1.090 total
Ускорение очень даже заметное.
Но с другой стороны, я попробовал использовать эту опцию на каких-то реальных данных (много бинарников, картинок и мелких файлов):
☁ find . -type f | wc -l
40799
☁ du -sh .
423M .
☁ time docker build -t ctrlok/tmp1 --squash .
Sending build context to Docker daemon 354 MB
Step 1/2 : FROM busybox
---> 8a4698b1752b
Step 2/2 : RUN touch 1
---> Using cache
---> 8232d556854e
Successfully built 8232d556854e
docker build -t ctrlok/tmp1 --squash . 2.35s user 4.39s system 31% cpu 21.110 total
☁ time docker build -t ctrlok/tmp1 --squash --compress .
Sending build context to Docker daemon 136.2 MB
Step 1/2 : FROM busybox
---> 8a4698b1752b
Step 2/2 : RUN touch 1
---> Using cache
---> 8232d556854e
Successfully built 8232d556854e
docker build -t ctrlok/tmp1 --squash --compress . 21.75s user 6.08s system 74% cpu 37.302 total
Получилось почти в два раза медленнее.
Я попробовал убрать архивы и уже сжатые изображения, ситуация немного улучшилась, но в целом всё равно надо думать о том, что вам важнее, — CPU или ширина канала.
API
docker stack deploy
из compose.yml
Одно из самых ожидаемых нововведений. Теперь можно просто деплоить или создавать новые сервисы прямо из compose.yml
!
☁ docker stack deploy -c ./compose.yml new_1
Ignoring unsupported options: build
Creating network new_1_default
Creating service new_1_web
Creating service new_1_redis
☁ docker stack services new_1
ID NAME MODE REPLICAS IMAGE
j8likjfnv15v new_1_web replicated 0/1 ctrlok/tmp:latest
rmhe0lecfllk new_1_redis replicated 1/1 redis:alpine
Я прямо жду не дождусь, когда появится возможность построить какое-то гибкое dev-окружение на основе этой фичи!
CRIU снапшоты (или чекпоинты)
Базовая поддержка создания CRIU снапшотов. В принципе ничего нового, но можно делать прямо в докере. Пока я вижу не так много вариантов применения этой технологии, но вообще интересно.
Новые клиенты могут общаться со старыми серверами
Наконец-то! Я не раз задавался вопросом, почему этого нельзя было сделать раньше.
Теперь если вы обновите свой докер локально на новую сборку, вы сможете общаться с серверами, на которых установлен старый докер. Например, в моём случае локально установлен 1.13 RC5, но на боевом сервере 1.12.3:
☁ docker version
Client:
Version: 1.13.0-rc5
API version: 1.24
Go version: go1.7.3
Git commit: 43cc971
Built: Thu Jan 5 03:07:30 2017
OS/Arch: darwin/amd64
Server:
Version: 1.12.3
API version: 1.24 (minimum version )
Go version: go1.6.3
Git commit: 6b644ec
Built: Wed Oct 26 22:01:48 2016
OS/Arch: linux/amd64
Experimental: false
Runtime
--experimental
Флаг для демона, который включает экспериментальные фичи. Больше никакой чехарды с отдельными бинарями. Чистый win!
--shutdown-timeout
и --stop-timeout
Добавлены флаги, при помощи которых можно задать таймаут перед убийством демонов. --shutdown-timeout
для докер демона и --stop-timeout
для конкретного контейнера. Очень правильная штука с хорошей реализацией.
--init
Флаг --init
для докер демона или при docker run
запустит tini init демон перед CMD. Особенно мне понравилась возможность запускать свой docker-init процесс, что может стать логичным продолжением идей habitat.
/metrics
Метрики теперь в удобном виде и собраны вместе.
Остальное
- поддержка
--net
флага на этапе сборки - в нумерацию шагов в выводе консоли добавили общее количество шагов
- notary обновили до 0.42
- несколько изменений в логах:
- fluentd драйвер теперь может писать в unix сокет
- AWS log driver поддерживает теги
- возможность делать
docker run
в swarm-mode overlay сети при помощи флага--attachable
(!!!) - в вывод
docker network inspect
добавили отображение пиров - docker плагины вывели из экспериментального режима и добавили поддержку динамической перезагрузки auth плагинов
- в swarm добавили поддержку секретов. Пока только одно хранилище. Это не интересно, но потенциально должно взлететь
- лейблы для волюмов. Теперь волюмы можно фильтровать по лейблам и вообще творить всякие непотребства. Ура.
Выводы
В целом, релиз вышел отличным. Куча исправлений и багфиксов, множество нужных и очень полезных фичей. Некоторые штуки я, например, ждал больше года.
Естественно, пока ещё рано обновляться в прод, но я уже вовсю гоняю новые возможности локально и в деве.