Образ контейнера – это единый двоичный файл с уникальным идентификатором, который хранит всё, что необходимо для работы контейнера. Образ контейнера полностью определяется текстовым файлом Dockerfile, который содержит инструкции о том, как собирать контейнер.
Обычно готовый образ контейнера загружается из того или иного реестра контейнеров.
Образ контейнера больше всего похож на iso-файл дистрибутива операционной системы. Подобно тому, как из одного iso-файла ту или иную ОС можно установить на неограниченное количество компьютеров, аналогичным образом из одного образа можно развернуть неограниченное количество так называемых контейнеров. Каждый из которых по сути будет напоминать установку небольшой операционной системы, только не обязательно на отдельную машину, а можно и как бы в соседнюю папку.
Действительно, если из скачанного образа развернуть два контейнера, то, несмотря на то, что они развёрнуты на одной физической машине, внутри себя они будут думать, что каждый из них это отдельная инсталляция ОС со своей файловой системой, своим cpu и каким-то объёмом ram. Каждый контейнер можно остановить и это будет аналогично выключению компьютера. Все данные сохранятся внутри файловой системы каждого из контейнеров. После запуска контейнера ему снова будут доступны все данные на его файловой системе.
Однако, стоит отметить, что поскольку в современных распределённых приложениях данные не принято хранить на файловых системах контейнеров, то возможность тушить и запускать заново контейнер обычно не используется. Как правило если контейнер завершает работу (аварийно или принудительно, например, при перезапуске пода), то контейнер убивается, а из образа при следующем запуске просто создаётся новый контейнер. Благо разворачивание контейнера из образа происходит очень быстро. И тем не менее, продолжая аналогию с iso-образом ОС, можно сказать, что это как будто при каждом выключении компьютера, с него сносят ОС, а при включении накатывают заново.
Если у вас есть завёрнутая в tar
архив файловая система какого-то дистрибутива Линукс, то на её основе можно создать контейнер с нуля, следуя инструкциям на официальном сайте.
Докер в своём хабе предлагает набор готовых базовых образов (обычно это образы тех или иных операционных систем), на основе которых предлагается делать производные образы, как бы устанавливая в эти образы необходимое дополнительное ПО. Собственно когда мы хотим контейнеризировать наше приложение, мы и должны выбрать базовый образ с той или иной ОС. И прописать в 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 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" }, .....