Основы Docker: Docker Compose
Docker Compose — это инструмент для определения и запуска многоконтейнерных Docker-приложений. С помощью Compose вы используете YAML-файл для настройки служб вашего приложения. Затем, с помощью одной команды, вы создаете и запускаете все службы из вашей конфигурации.
Основные понятия Docker Compose
docker-compose.yml(илиdocker-compose.yaml): YAML-файл, в котором определяются службы, сети и тома вашего приложения.- Служба (Service): Контейнер, который выполняет определенную функцию в вашем приложении (например, веб-сервер, база данных, кэш). Службы определяются в файле
docker-compose.yml. - Проект (Project): Набор взаимосвязанных служб, определенных в файле
docker-compose.yml. - Сеть (Network): Изолированная среда, в которой могут взаимодействовать контейнеры. Compose автоматически создает сети для вашего проекта, но вы также можете определить собственные сети.
- Том (Volume): Механизм для сохранения данных, созданных контейнерами, и обмена данными между контейнерами и хост-машиной.
Установка Docker Compose
Docker Compose обычно устанавливается вместе с Docker Desktop. Если вы используете Linux, возможно, вам потребуется установить его отдельно. Инструкции по установке можно найти на официальном сайте Docker: https://docs.docker.com/compose/install/.
После установки вы сможете использовать команду docker-compose (или docker compose, в зависимости от версии) в своей командной строке или терминале.
Использование Docker Compose
1. Создание файла docker-compose.yml
В корне вашего проекта создайте файл с именем docker-compose.yml (или docker-compose.yaml). Этот файл описывает службы, сети и тома вашего приложения.
Вот пример простого файла docker-compose.yml для веб-приложения с базой данных:
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
networks:
- mynetwork
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: mysecretpassword
MYSQL_DATABASE: mydatabase
volumes:
- db_data:/var/lib/mysql
networks:
- mynetwork
volumes:
db_data:
networks:
mynetwork:Разберем этот пример:
version: "3.9": Указывает версию формата файла Docker Compose.services: Секция, определяющая службы вашего приложения.web: Служба веб-сервера.image: nginx:latest: Использует образnginx:latestиз Docker Hub.ports: - "80:80": Публикует порт 80 хост-машины на порт 80 контейнера.volumes: - ./html:/usr/share/nginx/html: Монтирует локальную директорию./htmlв директорию/usr/share/nginx/htmlвнутри контейнера.depends_on: - db: Указывает, что службаwebзависит от службыdb(база данных). Compose запуститdbпередweb.networks: - mynetwork: Подключает службуwebк сетиmynetwork.
db: Служба базы данных MySQL.image: mysql:8.0: Использует образmysql:8.0из Docker Hub.environment: ...: Устанавливает переменные окружения для контейнера MySQL (пароль root, имя базы данных).volumes: - db_data:/var/lib/mysql: Монтирует именованный томdb_dataв директорию/var/lib/mysqlвнутри контейнера (где MySQL хранит свои данные).networks: - mynetwork: Подключает службуdbк сетиmynetwork.
volumes: Секция, определяющая тома.db_data: Именованный том для хранения данных MySQL.
networks: Секция, определяющая сети.mynetwork: Пользовательская сеть, к которой подключены службыwebиdb.
2. Запуск приложения
После создания файла docker-compose.yml перейдите в директорию, содержащую этот файл, в командной строке и выполните команду:
docker-compose up(или docker compose up, в зависимости от версии)
Compose создаст и запустит все службы, определенные в вашем файле docker-compose.yml. Вы увидите логи контейнеров в терминале.
Чтобы запустить приложение в фоновом режиме (detached mode), добавьте флаг -d:
docker-compose up -d3. Остановка приложения
Чтобы остановить приложение, выполните команду:
docker-compose down(или docker compose down)
Эта команда остановит и удалит контейнеры, сети и тома, созданные командой docker-compose up.
4. Другие полезные команды
docker-compose ps(илиdocker compose ps): Отображает статус служб вашего приложения.docker-compose logs <service_name>(илиdocker compose logs <service_name>): Просматривает логи определенной службы.docker-compose exec <service_name> <command>(илиdocker compose exec <service_name> <command>): Выполняет команду внутри контейнера определенной службы. Например,docker-compose exec web bashоткроет оболочку внутри контейнераweb.docker-compose build(илиdocker compose build): Собирает образы, определенные в секцииbuildфайлаdocker-compose.yml.docker-compose pull(илиdocker compose pull): Скачивает образы, используемые в файлеdocker-compose.yml.
5. Использование переменных окружения
Вы можете использовать переменные окружения в файле docker-compose.yml. Compose автоматически подставит значения переменных, определенных в вашей системе.
version: "3.9"
services:
web:
image: nginx:${NGINX_VERSION:-latest}
ports:
- "${WEB_PORT:-80}:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
networks:
- mynetwork
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-mysecretpassword}
MYSQL_DATABASE: ${DB_NAME:-mydatabase}
volumes:
- db_data:/var/lib/mysql
networks:
- mynetwork
volumes:
db_data:
networks:
mynetwork:В этом примере используются переменные окружения NGINX_VERSION, WEB_PORT, DB_ROOT_PASSWORD и DB_NAME. Если эти переменные не определены в системе, будут использованы значения по умолчанию (например, latest для NGINX_VERSION).
6. Расширение файлов Compose
Вы можете использовать несколько файлов Compose для разделения конфигурации вашего приложения на части. Например, вы можете иметь файл docker-compose.yml для основной конфигурации и файл docker-compose.override.yml для переопределения определенных параметров (например, для разработки).
Compose автоматически прочитает файлы docker-compose.yml и docker-compose.override.yml (если он существует) и объединит их.
7. Сборка образов
Вместо использования готовых образов из Docker Hub, вы можете указать Compose собирать образы из Dockerfile.
version: "3.9"
services:
web:
build:
context: ./web
dockerfile: Dockerfile
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- app
networks:
- mynetwork
app:
build: ./app
volumes:
- ./app:/app
environment:
DB_HOST: db
depends_on:
- db
networks:
- mynetwork
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: mysecretpassword
MYSQL_DATABASE: mydatabase
volumes:
- db_data:/var/lib/mysql
networks:
- mynetwork
volumes:
db_data:
networks:
mynetwork:В этом примере службы web и app собираются из Dockerfile. build.context указывает путь к директории, содержащей Dockerfile, а build.dockerfile (необязательно) указывает имя Dockerfile (по умолчанию Dockerfile). Если указан только build, то context по умолчанию равен текущей директории, а dockerfile по умолчанию равен Dockerfile.
Docker Compose значительно упрощает управление многоконтейнерными приложениями. С помощью него вы можете легко определять, запускать и масштабировать ваше приложение, используя декларативный подход.