Коротко о Docker
Образ vs контейнер
Docker Pull - Примеры команды
Docker: Запуск Контейнера из Образа
Docker: Список Запущенных Контейнеров
Docker: Вход в Контейнер
Docker: Копирование Файлов и Папок
Docker: Логи Контейнера — Как Проверить
Docker: Удалить Образ — Удалить Все Образы — Удалить Неиспользуемые
Docker: Удалить Контейнер — Удалить Все Контейнеры

Docker: Образ vs Контейнер — Что Есть Что? — Основное Различие

В Docker-мире существуют такие понятия, как образы, контейнеры и слои.

Несмотря на то, что они тесно связаны — они отличаются, и в начале изучения Docker часто возникают сложности в понимании этих терминов.

В данной статье объясняется разница между образами, контейнерами и слоями.

Что Такое Образ в Docker?

Не Путайте: Сам по себе Docker-образ невозможно «запускать». Команда docker run берет Docker-образ в качестве темплейта и создает из него контейнер, который и запускается.

Образы создаются из Dockerfile с помощью команды docker build.

Образы хранятся в Docker-реестрах, как например Docker Hub и их можно скачать с помощью команды docker pull:

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
50aff78429b1: Pull complete 
f6d82e297bce: Pull complete 
275abb2c8a6f: Pull complete 
9f15a39356d6: Pull complete 
fc0342a94c89: Pull complete 
Digest: sha256:ec0e4e8bf2c1178e025099eed57c566959bb408c6b478c284c1683bc4298b683
Status: Downloaded newer image for ubuntu:latest

Чтобы просмотреть скачанные Docker-образы, выполните docker images:

$ docker images
REPOSITORY         TAG                IMAGE ID           CREATED            SIZE
ubuntu             latest             00fd29ccc6f1       2 weeks ago  

Что Такое Слои в Docker?

Образы в Docker так устроены, что они состоят из нескольких слоев.

Каждая инструкция из Dockerfile создает новый слой образа.

Каждый слой представляет собой набор отличий (diff) от предыдущего слоя.

Чтобы просмотреть все слоя образа, выполните команду docker history:

$ docker history 00fd29ccc6f1
IMAGE         CREATED       CREATED BY                                      SIZE
00fd29ccc6f1  2 weeks ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>     2 weeks ago   /bin/sh -c mkdir -p /run/systemd && echo '...   7B
<missing>     2 weeks ago   /bin/sh -c sed -i 's, except the top one,/...   2.76kB
<missing>     2 weeks ago   /bin/sh -c rm -rf /var/lib/apt/lists/*          0B
<missing>     2 weeks ago   /bin/sh -c set -xe   && echo '#!/bin/sh' >...   745B
<missing>     2 weeks ago   /bin/sh -c #(nop) ADD file:f5a2d04c3f3cafa...   111MB

Каждый слой Docker-образа доступен только для чтение (read-only).

Что Такое Docker-контейнер?

Основное Различие: Основное различие между образом и контейнером — в доступном для записи верхнем слое.

Контейнеры создаются из образов с помощью команды docker run, а выполнив команду docker ps можно узнать какие контейнеры в данный момент запущены.

$ docker run -it ubuntu /bin/bash
root@af588b25a4ad:/# 

$ docker ps
CONTAINER ID   IMAGE    COMMAND      CREATED         STATUS         PORTS   NAMES
af588b25a4ad   ubuntu   "/bin/bash"  24 seconds ago  Up 23 seconds          jovial

Чтобы создать контейнер, движок Docker берет образ, добавляет доступный для записи верхний слой и инициализирует различные параметры (сетевые порты, имя контейнера, идентификатор и лимиты ресурсов).

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

Коротко о Docker

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

Коротко о Docker

Docker: Pull — Примеры Команды

Команда docker pull служит для скачивания Docker-образов из регистра.

По умолчанию, команда docker pull скачивает образы с Docker Hub, но также имеется возможность указать приватный регистр и скачивать с него.

Перед выполнением команды docker pull необходимо найти скачиваемый образ в Docker-регистре.

В приведенных ниже примерах я покажу, как скачивать Docker-образ CentOS с официального репозитория.

Команда Docker Pull

Синтаксис команды docker pull:

$ docker pull [ОПЦИИ] [ПУТЬ/]ИМЯ_ОБРАЗА[:ТЕГ]

Скачать Последнюю Версию

Скачать последнюю версию образа:

$ docker pull centos

— или —

$ docker pull centos:latest

Скачать Определенную Версию

Скачать определенную версию образа:

$ docker pull centos:centos7.4.1708

— или —

$ docker pull centos:7.4.1708

Скачать Все Образы

Скачать все образы с тегами:

$ docker pull -a centos

Docker Pull из Приватного Регистра

Синтаксис команды docker pull для скачивания образа из приватного репозитория:

$ docker pull [ОПЦИИ] АДРЕС:ПОРТ[/ПУТЬ]/ИМЯ_ОБРАЗА[:TAG]

Пример скачивания Docker-образов из приватного регистра:

$ docker pull registry.example.com:5000/test-image
$ docker pull registry.example.com:5000/projects/test-image:0.2
$ docker pull -a registry.example.com:5000/projects/test-image

Если регистр защищен паролем, прежде чем скачивать образ необходимо будет аутентифицироваться:

$ docker login registry.example.com:5000

Docker: Запуск Контейнера из Образа

Команда docker run служит для запуска Docker-контейнеров из образов.

В этой статье я расскажу, как запускать контейнер из образа на примере последнего официального базового Docker-образа Ubuntu.

Я покажу, как установить apache2 внутри контейнера с Ubuntu и как сохранить этот контейнер в качестве нового образа.

И в конце я покажу, как из этого нового образа в интерактивном и фоновом режимах запускать контейнеры.

Запуск Контейнера из Образа в Docker

Не Путайте: Сам по себе Docker-образ невозможно «запускать». Команда docker run берет Docker-образ в качестве темплейта и создает из него контейнер, который и запускается.

Найдите необходимый образ на Docker Hub:

$ docker search ubuntu
NAME                            DESCRIPTION             STARS  OFFICIAL  AUTOMATED
ubuntu                          Ubuntu is a Debian...   6759   [OK]       
dorowu/ubuntu-desktop-lxde-vnc  Ubuntu with openss...   141              [OK]
rastasheep/ubuntu-sshd          Dockerized SSH ser...   114              [OK]
ansible/ubuntu14.04-ansible     Ubuntu 14.04 LTS w...   88               [OK]
ubuntu-upstart                  Upstart is an even...   80     [OK]

Скачайте Docker-образ из репозитория с помощью команды docker pull:

$ docker pull ubuntu

Запустите контейнер из Docker-образа:

$ docker run -it ubuntu /bin/bash
root@e485d06f2182:/#

Когда вы выполняете docker run ОБРАЗ, движок Docker берет ОБРАЗ, добавляет доступный для записи верхний слой и инициализирует различные параметры (сетевые порты, имя контейнера, идентификатор и лимиты ресурсов).

Установите веб-сервер apache2 внутри контейнера, а затем выйдите из него:

root@e485d06f2182:/# apt update
root@e485d06f2182:/# apt install apache2 -y
root@e485d06f2182:/# exit

Из остановленного контейнера, в котором вы установили apache2, создайте новый образ и назовите его apache_snapshot:

$ docker commit e485d06f2182 apache_snapshot

Чтобы просмотреть все образы на Docker-хосте, выполните:

$ docker images REPOSITORY          TAG           IMAGE ID            CREATED             SIZE apache_snapshot     latest        13037686eac3        22 seconds ago      249MB ubuntu              latest        00fd29ccc6f1        3 weeks ago         111MB

Теперь из нового Docker-образа вы можете запускать контейнеры в интерактивном режиме:

$ docker run -it apache_snapshot /bin/bash

Либо вы можете из этого Docker-образа запустить контейнер в фоновом режиме с портом :80 внутри Docker-контейнера проброшенным на порт :8080 Docker-хоста:

$ docker run -d -p 8080:80 apache_snapshot /usr/sbin/apache2ctl -D FOREGROUND

В этом случае, чтобы убедиться что apache2 внутри контейнера запущен, просто откройте http://localhost:8080/ и вы увидите стартовую страницу: «Apache2 Ubuntu Default Page».

Docker: Список Запущенных Контейнеров

По умолчанию, команда docker ps выводит только список запущенных Docker-контейнеров.

С помощью определенных опций есть возможность просмотра списка всех Docker-контейнеров и возможность фильтрации по только остановленным контейнерам.

Ниже вы найдете как отобразить список всех Docker-контейнеров и как просмотреть только запущенные или только остановленные Docker-контейнеры.

Просмотр Запущенных Docker-контейнеров

Чтобы просмотреть список запущенных Docker-контейнеров, выполните следующую команду:

$ docker ps

Просмотр Остановленных Docker-контейнеров

Чтобы вывести список остановленных Docker-контейнеров, выполните:

$ docker ps --filter "status=exited"

— or —

$ docker ps -f "status=exited"

Список Всех Docker-контейнеров

Чтобы получить список всех без исключения Docker-контейнеров, выполните:

$ docker ps -a

— or —

$ docker ps --all

Docker: Вход в Контейнер

Команда docker exec служит для выполнения команд внутри запущенных Docker-контейнеров.

С помощь данной команды существует возможность входа в уже запущенный Docker-контейнер и старта bash-сессии.

В этом посте я покажу как войти в Docker-контейнер и запустить в нем интерактивную оболочку bash.

Как Войти В Docker-Контейнер

Чтобы узнать имя или ID контейнера, выполните команду docker ps:

$ docker ps
CONTAINER ID  IMAGE    COMMAND  CREATED      STATUS      PORTS  NAMES
72ca2488b353  my_image          X hours ago  Up X hours         my_container

Войдите в Docker-контейнер по имени или ID контейнера и запустите интерактивную оболочку bash:

$ docker exec -it 72ca2488b353 bash

Если внутри контейнера не удастся найти оболочку bash, вы увидите что-то вроде следующего сообщения:

oci runtime error: exec failed: container_linux.go:265: starting container process caused «exec: \»bash\»: executable file not found in $PATH»

В этом случае вы можете войти в Docker-контейнер и затупить простую оболочку sh:

$ docker exec -it 72ca2488b353 sh

Для входа в Docker-контейнер используются следующе опции:

ОпцияОписание
-i--interactiveОставить STDIN открытым, даже если контейнер запущен в неприкрепленном режиме
-t--ttyЗапустить псевдотерминал

Команда docker cp служит для копирования файлов и папок между Docker-контейнером и хостом.

Имеется возможность копирования файлов или папок как с хоста в контейнер, так и обратно из контейнера на хост.

В приведенных ниже примерах я копирую файлы, но принцип копирования папок абсолютно аналогичен.

Копирование в Docker

Чтобы узнать имя или ID контейнера, выполните команду docker ps:

$ docker ps
CONTAINER ID  IMAGE    COMMAND  CREATED      STATUS      PORTS  NAMES
72ca2488b353  my_image          X hours ago  Up X hours         my_container

Скопировать файл с хоста в контейнер:

$ docker cp foo.txt 72ca2488b353:/foo.txt

Скопировать файл с Docker-контейнера на хост:

$ docker cp 72ca2488b353:/foo.txt foo.txt

Docker: Логи Контейнера — Как Проверить

Команда docker logs служит для получения доступа к логам контейнера.

В этом посте я показываю как проверить логи Docker-контейнера, просмотреть временные метки и как сделать tail или grep этих логов.

Я также покажу как найти где хранятся логи Docker-контейнера.

Выполните команду docker ps, чтобы получить список запущенных контейнеров и узнать имя или ID контейнера, логи которого вы бы хотели проверить:

$ docker ps
CONTAINER ID  IMAGE    COMMAND  CREATED      STATUS      PORTS  NAMES
72ca2488b353  my_image          X hours ago  Up X hours         my_container

Проверить Логи Docker-контейнера

Проверить логи Docker-контейнера:

$ docker logs container

Вывести логи Docker-контейнера с временными метками:

$ docker logs container --timestamps

Показать Docker-логи начиная с определенной даты:

$ docker logs container --since ГГГГ-ММ-ДД

Показать Docker-логи с определенного времени:

$ docker logs container --since ГГГГ-ММ-ДДTЧЧ:ММ

Например, показать Docker-логи начиная с 11 утра:

$ docker logs container --since 2018-01-30T11:00

Tail Docker-логов

Имеется возможность как вывода только последних логов в Docker, так и непрерывного вывода логов контейнера в режиме реального времени.

Сделать tail последних N строк из логов:

$ docker logs container --tail N

Сделать tail -f (непрерывный вывод) логов Docker-контейнера:

$ docker logs container --follow

Grep Docker-логов

Сделать grep логов Docker-контейнера:

$ docker logs container | grep pattern

Например, показать только логи содержащие ошибки:

$ docker logs container | grep -i error

Местонахождение Логов Docker-контейнера

Узнать где хранятся логи Docker-контейнера:

$ docker inspect --format='{{.LogPath}}' container

Docker: Удалить Образ — Удалить Все Образы — Удалить Неиспользуемые

Чтобы удалить конкретный Docker-образ в первую очередь необходимо узнать его IMAGE ID сделав листинг всех Docker-образов.

Когда образ для удаления определен он может быть удален с помощью команды docker rmi.

Также из командной строки можно удалить только неиспользуемые Docker-образы (неиспользуемые ни одним из контейнеров) или, если необходимо, вы можете принудительно удалить все загруженные и сохраненные локально Docker-образы

Список Docker-образов

Список всех локальных Docker-образов:

$ docker images

Удалить Docker-образ

Удалить Docker-образ по IMAGE ID:

$ docker rmi <image>

Принудительно удалить Docker-образ:

$ docker rmi -f <image>

Удалить Неиспользуемые Docker-образы

Удалить все неиспользуемые Docker-образы:

$ docker image prune -a -f

Удалить Все Docker-образы

Принудительно удалить все Docker-образы:

$ docker rmi -f $(docker images -q)

Чтобы удалить конкретный Docker-контейнер в первую очередь необходимо узнать его CONTAINER ID или NAME сделав листинг всех Docker-контейнеров.

Когда контейнер для удаления определен он может быть удален с помощью команды docker rm.

Также из командной строки можно удалить только остановленные (неиспользуемые) Docker-контейнеры или, если необходимо, вы можете принудительно удалить все Docker-контейнеры

Docker: Удалить Контейнер — Удалить Все Контейнеры

Чтобы удалить конкретный Docker-контейнер в первую очередь необходимо узнать его CONTAINER ID или NAME сделав листинг всех Docker-контейнеров.

Когда контейнер для удаления определен он может быть удален с помощью команды docker rm.

Также из командной строки можно удалить только остановленные (неиспользуемые) Docker-контейнеры или, если необходимо, вы можете принудительно удалить все Docker-контейнеры

Список Docker-контейнеров

Список запущенных Docker-контейнеров:

$ docker ps

Список всех Docker-контейнеров:

$ docker ps -a

Удалить Docker-контейнер

Удалить Docker-контейнер по CONTAINER ID или NAME:

$ docker rm <container>

Принудительно удалить запущенный Docker-контейнер:

$ docker rm -f <container>

Удалить Все Docker-контейнеры

Удалить все остановленные (неиспользуемые) Docker-контейнеры:

$ docker container prune -f

Принудительно удалить все Docker-контейнеры, включая запущенные контейнеры:

$ docker rm -f $(docker ps -a -q)