Try   HackMD

Вводное упражнение по Docker

Логотип Docker

1. Что такое контейнер и как он работает?

Контейнер (container) - это определенная единица программного обеспечения, исполняемого в изолированной среде.

Фотография синего грузового контейнера

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

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

2. Что такое образ контейнера и как он устроен?

Образ контейнера (image) - это неизменяемый артефакт, включающий в себя все зависимости и код, необходимые для получения контейнера в определенном состоянии.

Фотография CD-ROM-диска

По своему функционалу образ контейнера аналогичен ISO-образу Live CD: вставил его в виртуальную машину, запустил и получил работающую систему с необходимым программным обеспечением.

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

3. Что такое volume?

Том (volume) - это изолированная файловая система, подключаемая к контейнерам и предназначенная для постоянного хранения файлов.

Фотография твердотельного накопителя

4. Что делает Docker Compose?

Docker Compose позволяет определять приложения, состоящие из Docker-контейнеров, с помощью конфигурационных файлов на языке YAML и запускать их.

Рисунок маскота Docker Compose

5. Как устроен docker-compose.yml от Вики?

docker-compose.yml

services: # определяем сервисы, т.е. некоторые обособленные вычислительные ресурсы, входящие в состав нашего приложения db: # определяем сервис БД и называем его db image: postgres:14-alpine # используем образ с легеньким дистрибутивом Alpine Linux и 14 версией PostgreSQL, поставялемый через Docker Hub environment: # определяем переменные окружения, используемые в данном сервисе POSTGRES_USER: wikijs # указываем имя пользователя БД POSTGRES_PASSWORD: wikijs # указываем пароль пользователя БД POSTGRES_DB: wiki # указываем название БД restart: unless-stopped # используем политику, при которой остановившийся сервис всегда будет перезапускаться, пока его не вырубят с помощью stop volumes: # определяем список используемых сервисом томов - db-data:/var/lib/postgresql/data # указываем, что том db-data нужно смонитровать в указанную директорию wiki: # определяем вервис самого приложения Вики и называем его wiki image: requarks/wiki:2 # используем образ Wiki.js версии 2, поставляемый разработчиком через Docker Hub depends_on: # указываем, от каких других сервисов зависит этот - db # указываем, что настоящему сервису необходим описанный выше сервис БД, и он должен быть запущен раньше настоящего environment: # определяем переменные окружения, используемые в данном сервисе DB_TYPE: postgres # уточняем тип СУБД, к которой будет подключаться приложение DB_HOST: db # указываем, что хост, на котором размещена СУБД, на самом деле является контейнером, запущенным для реализации сервиса db DB_PORT: 5432 # указываем TCP-порт, по которому приложение будет подключаться к СУБД DB_USER: wikijs # указываем имя пользователя БД DB_PASS: wikijs # указываем пароль пользователя БД DB_NAME: wiki # указываем название БД restart: unless-stopped # используем политику, при которой остановившийся сервис всегда будет перезапускаться, пока его не вырубят с помощью stop ports: # указываем, какие сетевые порты необходимо сделать доступными снаружи контейнера - "80:3000" # указываем, что TCP-порт 3000 внутри контейнера, реализующего данный сервис, необходимо пробросить на TCP-порт 80 снаружи этого контейнера volumes: # называем необходимые для работы приложения тома db-data: # объявляем том под названием db-data

6. Если закрыть терминал, в котором запущена Вика, то она остановится. Что нужно сделать, чтобы этого не проиошло?

Если запустить приложение с помощью команды docker compose up, то при закрытии привязанного терминала оно действительно остановится. Чтобы избежать этого, необходимо использовать опцию -d (--detach), которая говорит о том, что после запуска приложения терминал нужно отвязать. Приложение продолжит работу в фоновом режиме.

$ docker compose up -d