Что будет интересного в 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 добавили поддержку секретов. Пока только одно хранилище. Это не интересно, но потенциально должно взлететь
  • лейблы для волюмов. Теперь волюмы можно фильтровать по лейблам и вообще творить всякие непотребства. Ура.

Выводы

В целом, релиз вышел отличным. Куча исправлений и багфиксов, множество нужных и очень полезных фичей. Некоторые штуки я, например, ждал больше года.
Естественно, пока ещё рано обновляться в прод, но я уже вовсю гоняю новые возможности локально и в деве.