docker: images, containers


Образы и контейнеры Docker в картинках
Flatten a Docker container or image
Использование runit для своих сервисов

Images

Образы докера состоят из слоёв. Каждый слой является файловой системой в режиме «только для чтения». Слои создаются каждой инструкцией в Dockerfile и накладываются поверх предыдущего слоя.
Представьте, что ядро linux — это нулевой слой. Когда мы запускаем образ докера, данный слой надстраивается на слой ядра. Этот образ,первый слой, не изменяем(«только для чтения») и не содержит состояния.
Докер образ может быть надстроен над другим образом докера, который в свою очередь тоже может быть уже надстроенным над другим образом и т.д.
Первый слой образа называется базовым образом(base image), а все остальные слои за исключением последнего зовутся родительскими образами(parent image). Они наследуют св-ва и настройки из родительских образов, а также добавляют свою конфигурацию в Dockerfile.
Когда запускается контейнер, то докер берет образ и добавляет файловую систему в режиме «чтение-запись» поверх всех слоёв, попутно инициализируя настройки, такие как — ip адрес, имя,ID, лимит ресурсов.
Файловая система из образа монтируется , как «только для чтения» и любые изменения сделанные в запущенном контейнере производится на самом верхнем слое примантированом как «чтение-запись».
Т.к. ненужные слои раздувают образ, а AUFS имеет ограничение в 127 слоев, то в Dockerfile стремятся минимизировать инструкции путем выполнения сразу нескольких UNIX команд в одной инструкции RUN.

По умолчанию образы хранятся на Docker Hub.
Docker Hub — это онлайн хранилище предоставляемое Docker Inc.
Docker Hub предоставляет бесплатный репозитарий для публичных образов или за определенную плату приватный. Альтернативным приватным репозитарием может быть quay.io.

Имена образов могут быть следующими:
1. Имена имеющие в качестве префикса строку заканчивающуюся /, например billybones/centos. Данное пространство имен принадлежит пользователям. Это имена образов закаченных на Docker Hub самими пользователями. К примеру образ billybones/centos — здесь billybones это имя пользователя, а centos это его образ который он собирается закачать на
Docker Hub. Соответственно данный образ будет доступе остальным пользователям по имени billybones/linux.
2. Имена не содержащие никаких префиксов, такие как — debian,ubuntu, принадлежат кореновму пространству имен и контролируются Docker Inc.
Как привило такие имена резервируются под официальные образы.
3. Имена имеющие в качестве префикса доменное имя или ip адрес — это образы расположенные не на Docker Hub. Это может быть какой то локальный репозитарий образов пользователя или например какой-то еще третьей стороны, такой как quay.io.
Пример такого имени образа: 192.168.0.10:5000/wordpress, здесь 192.168.0.10 — это ip адрес сервера где находится репа, а 5000 это порт на котором запущен сервис репозитария.

Команды:

docker image ls

docker image ls — список образов в локальном хранилище
docker image ls -a — список всех образов в локальном хранилище

docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker@docker:~$

docker search

docker search ИМЯОБРАЗА — поиск образа на hub.docker.com
В качестве примера найдем образ alpine

docker search alpine --limit 3
NAME                  DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
alpine                A minimal Docker image based on Alpine Linux…   3810                [OK]                
mhart/alpine-node     Minimal Node.js built on Alpine Linux           363                                     
anapsix/alpine-java   Oracle Java 8 (and 7) with GLIBC 2.23 over A…   322                                     [OK]

docker pull

docker pull ИМЯ_ОБРАЗА — скачиваем образ из репы

docker image pull alpine
Using default tag: latest
latest: Pulling from library/alpine
ff3a5c916c92: Pull complete 
Digest: sha256:e1871801d30885a610511c867de0d6baca7ed4e6a2573d506bbec7fd3b03873f
Status: Downloaded newer image for alpine:latest

Проверяем, что образ скачался:

docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine              latest              3fd9065eaf02        5 months ago        4.15MB

docker image inspect

docker image inspect ИМЯ_ОБРАЗА — детальная инфа образа

docker image inspect alpine

весь вывод приводить не буду, слишком большая «простыня». приведу пример с отфильтрованным выводом нужной опции, к примеру Architecture:

docker image inspect -f .{{.Architecture}} alpine
.amd64

docker image history

docker image history ИМЯ_ОБРАЗА — показывает все слои образа

docker image history alpine
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
3fd9065eaf02        5 months ago        /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
           5 months ago        /bin/sh -c #(nop) ADD file:093f0723fa46f6cdb…   4.15MB

docker image rm

docker image rm ИМЯ_ОБРАЗА — удаление образа
docker image prune — удаление не используемых образов (образов без тэгов)
docker image prune -a — удаление всех не используемых образов (не тэгированных и не используемых контейнерами)
Подробнее про prune…
В качестве примера удалим раннее скаченный образ alpine

docker image rm alpine
Untagged: alpine:latest
Untagged: alpine@sha256:e1871801d30885a610511c867de0d6baca7ed4e6a2573d506bbec7fd3b03873f
Deleted: sha256:3fd9065eaf02feaf94d68376da52541925650b81698c53c6824d92ff63f98353
Deleted: sha256:cd7100a72410606589a54b932cabd804a17f9ae5b42a1882bd56d263e02b6215

docker login

docker login — если явно не указывать сервер репозитарий,то по умолчанию логинемся на hub.docker.com

docker logout

docker logout — разлогиниваемся с репы

docker image tag

docker image tag — создаёт псевдоним(ссылку) TARGET_IMAGE, которая ссылается на SOURCE_IMAGE.

docker image push

docker image push ИМЯ_ОБРАЗА — закачать образ в репу
В качестве примера найдем образ busybox, скачаем себе локально на комп, создадим новую ссылку на него с помощью tag и закачаем на Docker Hub под своей учеткой.

Ищем busybox
docker search busybox --limit 3
NAME                 DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
busybox              Busybox base image.                             1279                [OK]                
radial/busyboxplus   Full-chain, Internet enabled, busybox made f…   19                                      [OK]
arm64v8/busybox      Busybox base image.                             1 

Скачиваем busybox:
docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
07a152489297: Pull complete 
Digest: sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
Status: Downloaded newer image for busybox:latest

Проверяем, что скачался:
docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              8c811b4aec35        3 weeks ago         1.15MB

Создаем ссылку:
docker image tag busybox:latest billybones/busybox
docker image ls
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
billybones/busybox   latest              8c811b4aec35        3 weeks ago         1.15MB
busybox              latest              8c811b4aec35        3 weeks ago         1.15MB

Логинимся на hub.docker.com:
docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: billybones                     
Password: 
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded

Закачиваем billybones/busybox на  hub.docker.com:
docker push billybones/busybox
The push refers to repository [docker.io/billybones/busybox]
432b65032b94: Mounted from library/busybox 
latest: digest: sha256:74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335 size: 527

Разлогиниваемся с hub.docker.com:
docker logout
Removing login credentials for https://index.docker.io/v1/

Удаляем оба образа с компа:
docker image rm billybones/busybox busybox
Untagged: billybones/busybox:latest
Untagged: billybones/busybox@sha256:74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335
Untagged: busybox:latest
Untagged: busybox@sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
Deleted: sha256:8c811b4aec35f259572d0f79207bc0678df4c736eeec50bc9fec37ed936a472a
Deleted: sha256:432b65032b9466b4dadcc5c7b11701e71d21c18400aae946b101ad16be62333a

Скачиваем наш образ billybones/busybox с hub.docker.com:
docker pull billybones/busybox
Using default tag: latest
latest: Pulling from billybones/busybox
07a152489297: Pull complete 
Digest: sha256:74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335
Status: Downloaded newer image for billybones/busybox:latest

Проверяем:
docker image ls
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
billybones/busybox   latest              8c811b4aec35        3 weeks ago         1.15MB

docker image build

docker image build — собрать образ из Dockerfile. Пример использования будет рассмотрен в следующих постах.

docker image save/docker image load

docker image save ИМЯ_ОБРАЗА > ИМЯ_архива.tar — сохранить образ в tar архив
docker image load — загрузить образ из tar архива

Сохраянем образ в tar архив:
docker image save billybones/busybox > mybusybox.tar
или так
docker image save -o mybusybox2.tar billybones/busybox

Проверяем:
ls -sh mybusybox.tar
1,4M mybusybox.tar

Удаляем скаченный образ billybones/busybox:
docker image rm billybones/busybox:latest 
Untagged: billybones/busybox:latest
Deleted: sha256:8c811b4aec35f259572d0f79207bc0678df4c736eeec50bc9fec37ed936a472a
Deleted: sha256:432b65032b9466b4dadcc5c7b11701e71d21c18400aae946b101ad16be62333a

Проверяем:
docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

Загружаем образ из tar архива:
docker image load < mybusybox.tar
или так
docker image load -i mybusybox.tar

Проверяем:
docker image ls
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
billybones/busybox   latest              8c811b4aec35        3 weeks ago         1.15MB

docker image import

docker image import — импорт содержимого из tar архива для создания образа. Используется совместно с командой docker container export. При импорте не включает метаданные и историю.

Containers

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

Команды:

docker container creat

docker container create ИМЯ_ОБРАЗА — создать контейнер без его запуска

docker container start

docker container start ИМЯ/ID_контейнера — запустить контейнер

docker container run

docker container run ИМЯ_ОБРАЗА — создать и запустить контейнер (т.е. включает в себя create и start)
Записываемый(изменяемый) слой добавляется на вершину всех слоёв. Все изменения делаемые с файловой системой контейнера между запусками сохраняются, но при этом данные изменения не затрагивают нижележащие слои.

Для примера создадим и запустим контейнер с nginx образом:

docker container run --rm -p 80:80 -h nginxhost -d --name mycontainer nginx

где
--rm - контейнер автоматическое удалится при его остановке
-h - указываем имя хоста, которое мы будем видеть при заходе в консоль
-p 80:80 - мапим/форвардим порты(из нашей публичной сети в приватную сеть создаваемую докером при старте конейнера(формат HOST_PORT:CONTAINER_PORT))
-d - запуск контенйра в бэкграунде
--name - данный ключ даёт возможость задать имя конейнера
nginx - указываем какой образ запускать. 
Сперва проверяется локальное хранилище образов на компе. Если нужный образ отсутвует, то он качается с репы (по умолчанию hub.docker.com).Если не укзана версия (тэг) то качается самая последняя версия образа.

проверяем в браузере:
http://127.0.0.1/

docker container ls

docker container ls — смотрим запущенные контейнеры
docker container ls -a — смотрим все сущетвующие контейнеры

docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
09e664dd8d61        nginx               "nginx -g 'daemon of…"   16 minutes ago      Up 16 minutes       0.0.0.0:80->80/tcp   mycontainer

docker container stop

docker container stop ИМЯ/ID_контейнера — «мягко» останавливем конейтер

docker container restart

docker container restart ИМЯ/ID_контейнера — перезапуск контейнера

docker container kill

docker container kill ИМЯ/ID_контейнера — «жестко» останавливем конейтер

docker container pause

docker container pause ИМЯ/ID_контейнера — «заморозить» контейнер

docker container unpause

docker container unpause ИМЯ/ID_контейнера — «разморозить» контейнер

docker container rm

docker container rm ИМЯ/ID_контейнера — удаляем контейнер, можно одновременно указывать несколько ИМЯ/ID_контейнера
Если контейнер запущен, то удалить его этой командой не получится. Нужно будет воспользоватся ключем -f чтоб форсировать удаление.

docker container top

docker container top ИМЯ/ID_конейнера — списко процессов в контейнере

docker container top mycontainer
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                19146               19130               0                   13:11               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            19201               19146               0                   13:11               ?                   00:00:00            nginx: worker process

docker container inspect

docker container inspect ИМЯ/ID_конейнера — детальная информация о контейнере (volumes,network...)

docker container inspect mycontainer -f  .{{.NetworkSettings.IPAddress}}
.172.17.0.2

docker container stats

docker container stats ИМЯ/ID_конейнера — вывод в реалтайме используемых ресурсов контейнером cpu,ram,hdd

docker container stats mycontainer --no-stream
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
09e664dd8d61        mycontainer         0.00%               2.836MiB / 7.636GiB   0.04%               10.9kB / 2.05kB     0B / 0B             2

docker container logs

docker container logs ИМЯ/ID_конейнера — все что пишется в STDOUT контейнера можно промотреть данной командой

docker container logs mycontainer 
172.17.0.1 - - [20/Jun/2018:03:11:37 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0" "-"
2018/06/20 03:11:38 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "127.0.0.1"
172.17.0.1 - - [20/Jun/2018:03:11:38 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0" "-"
172.17.0.1 - - [20/Jun/2018:03:11:38 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0" "-"
2018/06/20 03:11:38 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "127.0.0.1"

docker container exec

docker container exec ИМЯ/ID_контейнера RUNCOMMAND — выполнет команду в запущеном контейнере

Запускаем контейнер c debian и запускаем в нём процесс tail:
docker container run -d --name debian debian tail -f /dev/null

Проверяем:
docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
886b9659abfe        debian              "bash"              12 seconds ago      Up 11 seconds                           debian

Запускаем bash с опциями интерактивного режима:
docker container exec -it debian bash
root@24fd363ac8ed:/# 
Если нажать ctrl+d или набрать exit, то мы выйдем из консоли и контейнер остановиться, если же нажать ctrl+p и ctrl+q то мы просто выйдем из консоли но контейре продолжит работу. Обратно приатачиться к контейнеру можно командой docker container attach ИМЯ/ID_контейнера или docker container -a ИМЯ/ID_контейнера

docker container run -it

docker container run -it ИМЯ_ОБРАЗА RUNCOMMAND — запускаем контейнер и входим в интерактивный режим контейнера с выполнением запущенной команды

docker container run -it --name myalpine alpine sh
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
ff3a5c916c92: Pull complete 
Digest: sha256:e1871801d30885a610511c867de0d6baca7ed4e6a2573d506bbec7fd3b03873f
Status: Downloaded newer image for alpine:latest
/ #

docker container diff

docker container diff ИМЯ/ID_контейнера — показывает какие изменения случились с файловой системой контейнера после его создания.

Создаем контейнер:
docker container run -d  --name debian debian touch {abc,def}
89cc147e1ab0694274af8df6e35ac78d2997506a9dce8a1a0107e51d4e38e64b
docker container diff debian
A /abc
A /def

docker container cp

docker container cp CONTAINER_PATH HOST_PATH
docker container cp HOST_PATH CONTAINER_PATH
т.е. если необходимо скопировать папку/файл между хостовой тачкой и контейнером то используются данне команды.

Создаём контейнер:
docker run -dit --name debian  debian bash

На хостовой машинке создаем текстовый файл:
echo "Some text" > HostToCont.txt

Копируем его в контейнер:
docker container cp HostToCont.txt debian:/

Проверяем:
docker container exec debian sh -c "ls -l /HostToCont.txt"
-rw-rw-r-- 1 1000 1000 10 Jun 20 06:34 /HostToCont.txt

В контейнере создаем текстовый файл:
docker container exec debian bash -c "echo 'TextText' > /ContToHost.txt"

Копируем файл с контейнера на хостовую тачку:
docker container cp debian:/ContToHost.txt ./

Проверяем:
ls -l ContToHost.txt
-rw-r--r-- 1 1000 1000 9 июн 20 16:37 ContToHost.txt

>docker container export

docker container export -o ИМЯ_АРХИВА.tar ИМЯ/ID_контейнера
или так
docker container export ИМЯ/ID_контейнера > ИМЯ_АРХИВА.tar
экспорт файловой системы контейнера в tar архив. Данный архив затем можно загрузить командой docker image import.
При использовании команды export архиваируется только файловая система. Метаданные указанные при использовании опций — EXPOSE, CMD, ENTRYPOINT будут утеряны. Также тома не вкючаются в архив.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *