Мастер-класс по Docker
Часть 0. Подготовка
Воспользуйтесь учетными записями, которые были созданы ранее на мастер-классе по Linux.
Часть 1. Что такое Docker
Основано на материале Как работает Docker: подробный гайд от техлида | Skillbox
Docker — это платформа, которая позволяет упаковать в контейнер приложение со всем окружением и зависимостями, а затем доставить и запустить его в целевой системе.
Приложение, упакованное в контейнер, изолируется от операционной системы и других приложений. Поэтому разработчики могут не задумываться, в каком окружении будет работать их приложение, а инженеры по эксплуатации — единообразно запускать приложения и меньше заботиться о системных зависимостях.
Устройство и принцип р аботы Docker
Виртуализация в Docker реализуется на уровне ОС. Виртуальная среда запускается прямо из ядра основной операционной системы и использует её ресурсы.

В поставку Docker входят следующие компоненты:
- Docker host — это операционная система, на которую устанавливают Docker и на которой он работает.
- Docker daemon — служба, которая управляет Docker-объектами: сетями, хранилищами, образами и контейнерами.
- Docker client — консольный клиент, при помощи которого пользователи взаимодействуют с Docker daemon и отправляют ему команды, создают контейнеры и управляют ими.
- Docker image — это неизменяемый образ, из которого разворачивается контейнер.
- Docker container — развёрнутое и запущенное приложение.
- Docker Registry — репозиторий, в котором хранятся образы.
- Dockerfile — файл-инструкция для сб орки образа.
- Docker Compose — инструмент для управления несколькими контейнерами. Он позволяет создавать контейнеры и задавать их конфигурацию.
- Docker Desktop — GUI-клиент, который распространяется по GPL. Бесплатная версия работает на Windows, macOS, а с недавних пор и на Linux. Это очень удобный клиент, который отображает все сущности Docker и позволяет запустить однонодовый Kubernetes для компьютера.
Docker изначально создавался под Linux. Поэтому на Windows и macOS запускают виртуальную машину с Linux, а поверх неё — Docker. В macOS используют VirtualBox или QEMU, а в Windows — Hyper-V.
Схемы архитектуры Docker

Работа поверх виртуалок повышает потребление ресурсов. Поэтому Docker на macOS и Windows работает медленнее и с рядом ограничений. Для разработки это приемлемо, но "в бою" так делать никто не будет. На всех популярных платформах в проде используют Linux.
Чем виртуализация отличается от контейнеризации
Контейнеры и виртуальные машины — это разные способы виртуализации. Только виртуалка реализует её на уровне железа, а Docker — на уровне операционной системы.
Виртуальные компьютеры вполне полноценны. На них можно установить операционную систему любого семейства и работать в ней, например, через графический интерфейс в многопользовательском режиме, устанавливая и запуская множество приложений и сервисов.

Если цель виртуалки — полностью воспроизвести устройство компьютера, то основная цель Docker — создать среду для одного приложения. Виртуальная среда контейнера запускается внутри опер ационной системы. Ей не нужно виртуализировать оборудование — она использует его через ОС. Поэтому контейнеры Docker потребляют меньше ресурсов, быстрее развёртываются, проще масштабируются и меньше весят.
Сущности Docker
Docker работает с несколькими сущностями:
-
Docker image (образ). Это шаблон, по которому создают контейнеры. Его часто сравнивают со слоёным пирогом: мы накладываем слой файловой системы поверх слоя базового образа и получаем неизменяемый образ. В него можно установить приложение, конфигурации и зависимости. Другие образы могут наследоваться, поэтому если положить сверху слой файлов и закоммитить, то мы получим ещё один неизменяемый образ.

-
Dockerfile. Если Docker image — это пирог, то Dockerfile — рецепт его приготовления. В этом файле описаны основные инструкции для сборки образа: какой базовый образ взять, откуда и куда положить файлы и так далее.
-
Контейнер — это runtime-сущность на основе образа, приложение, которое мы развернули с помощью Docker. Можно провести такую аналогию: образ — это инсталлятор программы, а контейнер — уже запущенная программа.
При развёртывании контейнера поверх файловой системы создаётся ещё один изменяемый слой. Приложение внутри контейнера может записывать туда данные или редактировать их. После удаления контейнера данные стираются, но их можно сохранить с помощью volumes.
-
Docker Registry. Это репозиторий, в котором хранятся Docker-образы. Он может быть как локальным, так и публичным. Репозитории создают на платформах вроде Docker Hub и GitLab и размещают в них образы с описанием, разными версиями и тегами.

Часть 2. Установка Docker на Ubuntu
Изучить актуальный способ установки в статье Установка Docker Engine в Ubuntu.
Альтернативный способ установки можно узнать здесь.
Часть 3. Команды управления контейнерами и образами
Основано на статьях:
Теперь, когда все необходимое установлено, пора взяться за работу. В этом разделе мы запустим контейнер Busybox на нашей системе и попробуем запустить docker run.
Для начала, запустите следующую команду:
sudo docker pull busybox
Внимание: в зависимости от того, как вы устанавливали Docker на свою систему, возможно появление сообщения permission denied. Если вы на Маке, то удостоверьтесь, что движок Docker запущен. Если вы на Линуксе, то запустите эту команду с sudo. Или можете создать группу docker чтобы избавиться от этой проблемы.
Команда pull скачивает образ busybox из регистра Docker и сохраняет его локально. Можно использовать команду docker images, чтобы посмотреть список образов в системе.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest a416a98b71e2 2 months ago 4.26MB
Docker Run
Отлично! Теперь давайте запустим Docker-контейнер с этим образом. Для этого используем волшебную команду docker run:
sudo docker run busybox
Подождите, ничего не произошло! Это баг? Ну, нет. Под капотом произошло много всего. Docker-клиент нашел образ (в нашем случае, busybox), загрузил контейнер и запустил команду внутри этого контейнера. Мы сделали docker run busybox, но не указали никаких команд, так что контейнер загрузился, запустилась пустая команда и программа завершилась. Ну, да, как-то обидно, так что давайте сделаем что-то поинтереснее.
$ sudo docker run busybox echo "hello from busybox"
hello from busybox
Ура, наконец-то какой-то вывод. В нашем случае клиент Docker послушно запустил команду echo внутри контейнера, а потом вышел из него. Вы, наверное, заметили, что все произошло очень быстро. А теперь представьте себе, как нужно загружать виртуальную машину, запускать в ней команду и выключать ее. Теперь ясно, почему говорят, что контейнеры быстрые!
Теперь давайте взглянем на команду docker ps. Она выводит на экран список всех запущенных контейнеров.
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Контейнеров сейчас нет, поэтому выводится пустая строка. Не очень полезно, поэтому давайте запустим более полезный вариант: docker ps -a:
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71d2473b229b busybox "echo 'hello from bu…" 44 seconds ago Exited (0) 44 seconds ago vibrant_burnell
bb2b610d6370 busybox "sh" About a minute ago Exited (0) About a minute ago kind_tesla
Теперь виден список всех контейнеров, которые мы запускали. В колонке STATUS можно заметить, что контейнеры завершили свою работу несколько минут назад.
Вам, наверное, интересно, как запустить больше одной команды в контейнере. Давайте попробуем:
$ sudo docker run -it busybox sh
/ # ls
bin dev etc home lib lib64 proc root sys tmp usr var
/ # uptime
22:51:29 up 5 min, 0 users, load average: 0.00, 0.00, 0.00
Команда run с флагом -it подключает интерактивный tty в контейнер. Теперь можно запускать сколько угодно много команд внутри. Попробуйте.
На этом захватывающий тур по возможностям команды docker run закончен. Скорее всего, вы будете использовать эту команду довольно часто. Так что важно, чтобы мы поняли как с ней обращаться. Чтобы узнать больше о run, используйте docker run --help, и увидите полный список поддерживаемых флагов. Скоро мы увидим еще несколько способов использования docker run.
Перед тем, как продолжать, давайте вкратце рассмотрим удаление контейнеров. Мы видели выше, что с помощью команды docker ps -a все еще можно увидеть остатки завершенных контейнеров. На протяжении этого пособия, вы будете запускать docker run несколько раз, и оставшиеся, бездомные контейнеры будут съедать дисковое пространство. Так что я взял за правило удалять контейнеры после завершения работы с ними. Для этого используется команда docker rm. Просто скопируйте ID (можно несколько) из вывода выше и передайте параметрами в команду.
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
830d6d332ef5 busybox "sh" About a minute ago Exited (0) 7 seconds ago nice_matsumoto
71d2473b229b busybox "echo 'hello from bu…" 2 minutes ago Exited (0) 2 minutes ago vibrant_burnell
bb2b610d6370 busybox "sh" 3 minutes ago Exited (0) 3 minutes ago kind_tesla
$ sudo docker rm 830d6d332ef5 71d2473b229b bb2b610d6370
830d6d332ef5
71d2473b229b
bb2b610d6370
При удалении идентификаторы будут снова выведены на экран. Если нужно удалить много контейнеров, то вместо ручного копирования и вставления можно сделать так:
sudo docker rm $(sudo docker ps -a -q -f status=exited)
Эта команда удаляет все контейнеры, у которых статус exited. Флаг -q возвращает только численные ID, а флаг -f фильтрует вывод на основе предоставленных условий. Последняя полезная деталь — команде docker run можно передать флаг --rm, тогда контейнер будет автоматически удаляться при завершении. Это очень полезно для разовых запусков и экспериментов с Docker.
Также можно удалять ненужные образы командой docker rmi:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest a416a98b71e2 2 months ago 4.26MB
aladin@ubuntu:~$ sudo docker rmi busybox
Untagged: busybox:latest
Untagged: busybox@sha256:3fbc632167424a6d997e74f52b878d7cc478225cffac6bc977eedfe51c7f4e79
Deleted: sha256:a416a98b71e224a31ee99cff8e16063554498227d2b696152a9c3e0aa65e5824
Deleted: sha256:3d24ee258efc3bfe4066a1a9fb83febf6dc0b1548dfe896161533668281c9f4f