Содержание

Образ контейнера Docker

Образ контейнера – это единый двоичный файл с уникальным идентификатором, который хранит всё, что необходимо для работы контейнера. Образ контейнера полностью определяется текстовым файлом Dockerfile, который содержит инструкции о том, как собирать контейнер.

Обычно готовый образ контейнера загружается из того или иного реестра контейнеров.

Ближайшая аналогия

Образ контейнера больше всего похож на iso-файл дистрибутива операционной системы. Подобно тому, как из одного iso-файла ту или иную ОС можно установить на неограниченное количество компьютеров, аналогичным образом из одного образа можно развернуть неограниченное количество так называемых контейнеров. Каждый из которых по сути будет напоминать установку небольшой операционной системы, только не обязательно на отдельную машину, а можно и как бы в соседнюю папку.

Действительно, если из скачанного образа развернуть два контейнера, то, несмотря на то, что они развёрнуты на одной физической машине, внутри себя они будут думать, что каждый из них это отдельная инсталляция ОС со своей файловой системой, своим cpu и каким-то объёмом ram. Каждый контейнер можно остановить и это будет аналогично выключению компьютера. Все данные сохранятся внутри файловой системы каждого из контейнеров. После запуска контейнера ему снова будут доступны все данные на его файловой системе.

Однако, стоит отметить, что поскольку в современных распределённых приложениях данные не принято хранить на файловых системах контейнеров, то возможность тушить и запускать заново контейнер обычно не используется. Как правило если контейнер завершает работу (аварийно или принудительно, например, при перезапуске пода), то контейнер убивается, а из образа при следующем запуске просто создаётся новый контейнер. Благо разворачивание контейнера из образа происходит очень быстро. И тем не менее, продолжая аналогию с iso-образом ОС, можно сказать, что это как будто при каждом выключении компьютера, с него сносят ОС, а при включении накатывают заново.

Типичные образы

Кастомные базовые образы (Base image)

Если у вас есть завёрнутая в tar архив файловая система какого-то дистрибутива Линукс, то на её основе можно создать контейнер с нуля, следуя инструкциям на официальном сайте.

Типовые базовые образы (Parent image)

Докер в своём хабе предлагает набор готовых базовых образов (обычно это образы тех или иных операционных систем), на основе которых предлагается делать производные образы, как бы устанавливая в эти образы необходимое дополнительное ПО. Собственно когда мы хотим контейнеризировать наше приложение, мы и должны выбрать базовый образ с той или иной ОС. И прописать в Dockerfile, как в эту ОС в базовом образе установить наше приложение. И на основе этого описания в Dockerfile может быть создан производный образ, содержащий и запускающий контейнеры не только с исходной ОС, но и нашим приложением внутри.

Образы с приложениями

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

Поиск и скачивание образов

Поиск

Поиск на хабе (если не заблокирован):

[root@centos7 ~]# docker search haproxy

Чтобы искать только официальные образы, можно использовать опцию –filter «is-official=true» команды docker search:

[root@centos7 ~]# docker search haproxy --filter "is-official=true"

Скачивание

Образ скачивается командой pull:

[root@centos7 ~]# docker pull haproxy
Using default tag: latest
Trying to pull repository [docker.io/library/haproxy](http://docker.io/library/haproxy) ...
latest: Pulling from [docker.io/library/haproxy](http://docker.io/library/haproxy)
177e7ef0df69: Pull complete
....

Если не указать версию, то будет скачана версия с тегом latest. Поскольку автор образа в любой момент может его обновить, то в любой момент под тегом latest может оказаться какая-то новая версия, которая будет работать не так, как ожидается. Поэтому в производственной среде рекомендуется всегда указывать конкретную версию:

[root@centos7 ~]# docker pull haproxy:1.5
Trying to pull repository [docker.io/library/haproxy](http://docker.io/library/haproxy) ...
1.5: Pulling from [docker.io/library/haproxy](http://docker.io/library/haproxy)
177e7ef0df69: Already exists
....

Теперь, когда образ скачан из хаба на конкретную машину, из него можно разворачивать неограниченное количество контейнеров, как бы делая установку программы или ОС из этого образа.

Работа с образами

Просмотреть список скачанных образов можно командой docker images:

[root@centos7 ~]# docker images
REPOSITORY                    TAG       IMAGE ID       CREATED        SIZE
nginx                         latest    4f67c83422ec   4 weeks ago    188MB
haproxy                       latest    7d650bb22abb   4 weeks ago    102MB
[gcr.io/k8s-minikube/kicbase](http://gcr.io/k8s-minikube/kicbase)   v0.0.44   5a6e59a9bdc0   7 weeks ago    1.26GB
mysql                         latest    fcd86ff8ce8c   2 months ago   578MB
ubuntu                        latest    bf3dc08bfed0   2 months ago   76.2MB
httpd                         latest    356125da0595   2 months ago   147MB

Команда docker images с опцией -q вернет только идентификаторы образов. Удалить все имеющиеся в локальном кэше образы, можно воспользовавшись такой командой:

[root@centos7 ~]# docker rmi $(docker images -q)

Работа с данными образов через REST

Если пускает на хаб, то можно получить дополнительную информацию об образах через REST API:

[user@centos7 ~]$ curl https://registry.hub.docker.com/v1/search?q=haproxy | python -m json.tool
...
{
"num_pages": 120,
"num_results": 2986,
"page": 1,
"page_size": 25,
.....

Следующий пример покажет список тегов образа:

[user@centos7 ~]$ curl https://registry.hub.docker.com/v1/repositories/haproxy/tags | python -m json.tool
...
{
"layer": "",
"name": "latest"
},
{
"layer": "",
"name": "1"
},
.....