Docker Compose
Введение | |
Установка | |
Проверить версию | |
Простейшая структура проекта | |
build | |
up | |
down | |
Пересобрать только один контейнер | |
Похожие статьи |
Введение
Docker Compose - это инструмент для определения и запуска многоконтейнерных приложений Docker.
Он использует файлы YAML для настройки служб приложения и выполняет процесс создания и запуска всех контейнеров с помощью одной команды.
Утилита docker-compose CLI позволяет пользователям выполнять команды на нескольких контейнерах одновременно, например, создавать
образы, масштабировать контейнеры, запускать контейнеры, которые были остановлены, и многое другое.
Команды, связанные с манипулированием образами или пользовательскими интерактивными опциями, не актуальны в Docker Compose,
поскольку они адресуются одному контейнеру.
Файл
docker-compose.yml
используется для определения служб приложения и включает в себя различные параметры конфигурации.
Например, параметр build определяет параметры конфигурации, такие как путь к файлу
Dockerfile
, параметр command позволяет
переопределять команды Docker по умолчанию и многое другое.
Первая публичная бета-версия Docker Compose (версия 0.0.1) была выпущена 21 декабря 2013 года.
Первая готовая к производству версия (1.0) была доступна 16 октября 2014 года.
Установка
Подробно про установку docker compose читайте
здесь
В
Debian
,
Ubuntu
и подобных
sudo apt-get -y update
sudo apt-get install -y docker-compose-plugin
В CentOS , Red Hat , Rocky и подобных
sudo yum -y update
sudo yum install -y docker-compose-plugin
Проверить версию
docker-compose -v
docker-compose version 1.27.4, build 40524192
Для второй версии - не нужен
docker compose version
Docker Compose version v2.14.1
В системе могут быть одновременно установлены обе версии compose
Простейшая структура проекта
Рассмотрим следующую структуру
lesson0 ├── docker-compose.yml ├── ubuntu-pytest │ └── Dockerfile └── ubuntu-web └── Dockerfile
Два докерфайла со стандартным названием Dockerfile лежат каждый в своей директории.
build
build это команда, которой docker-compose создаёт контейнеры по рецептам из докерфайлов.
Также build - это парамет в
docker-compose.yml
который показывает на директорию с докерфайлом.
Чтобы показать docker-compose где находится задуманный для данного сервиса докерфайл
нужно с помощью параметра build указать директорию в которой этот докерфайл лежит
services: pytester: build: ubuntu-pytest web: build: ubuntu-web
Пример докерфайла для ubuntu-pytest.
Он просто создаёт контейнер с
Ubuntu
, обновляет её и устанавливает несколько утилит.
# getting base image ubuntu FROM ubuntu:22.04 LABEL maintainer="andreyolegovich.ru" CMD ["echo", "Ubuntu-pytest image is creating"] RUN apt-get -y update \ && apt-get install -y dialog \ && apt-get install -y apt-utils \ && apt-get install -y tree vim \ && apt-get install -y curl gcc g++ make \ && apt-get -y update \ && apt-get -y upgrade
Сбилдить контейнеры можно командой
docker-compose build
Если это первый раз, то придётся подождать пока закончатся все операции
Когда контейры созданы, их нужно запустить
Запустить все контейнеры в проекте
docker-compose up
Creating network "lesson0_default" with the default driver Creating lesson0_pytester_1 ... done Creating lesson0_web_1 ... done Attaching to lesson0_pytester_1, lesson0_web_1 pytester_1 | Ubuntu-pytest image is creating web_1 | Ubuntu-pytest image is creating lesson0_pytester_1 exited with code 0 lesson0_web_1 exited with code 0
Автоматически создаётся сеть lesson0_default, в которой наши контейнеры могут обмениваться данными.
Разберём имя lesson0_pytester_1
lesson0 - это имя проекта, полученное из имени корневой директории.
pytester - это имя контейнера
1 - это номер экземпляра контейнера.
Для запуска в режиме демона используйте опцию -d
docker-compose up -d
Creating network "lesson0_default" with the default driver Creating lesson0_web_1 ... done Creating lesson0_pytester_1 ... done
Эти контейнеры видны после выполнения обычной команды docker ps -a
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4dcaba2ace93 lesson0_pytester "echo 'Ubuntu-pytest…" 3 minutes ago Exited (0) 3 minutes ago lesson0_pytester_1 2339db49d582 lesson0_web "echo 'Ubuntu-pytest…" 3 minutes ago Exited (0) 3 minutes ago lesson0_web_1
Также можно выполнить
docker-compose ps
Name Command State Ports -------------------------------------------------------------------- lesson0_pytester_1 echo Ubuntu-pytest image i ... Exit 0 lesson0_web_1 echo Ubuntu-web image is c ... Exit 0
Остановить все контейнеры проекта можно командой
docker-compose down
Removing lesson0_pytester_1 ... done Removing lesson0_web_1 ... done
qa-demo-project ├── docker-compose.yml ├── dockerfiles │ ├── Dockerfile.ubuntu │ ├── Dockerfile.ubuntu.js │ ├── Dockerfile.ubuntu.playwright │ └── Dockerfile.ubuntu.pytest ├── flask-service │ ├── Dockerfile │ ├── requirements.txt │ ├── src │ │ └── app.py │ └── venv │ ├── GNUmakefile ├── logs ├── README.md └── src ├── dev │ ├── app │ │ ├── __init__.py │ │ ├── file_helper.py │ │ ├── main.py │ │ ├── prod.py │ │ ├── psum.py │ │ ├── __pycache__ │ │ ├── quadratic.py │ │ └── test_example.py │ └── __init__.py ├── GNUmakefile └── tests ├── js │ └── src ├── pytest │ ├── requirements │ └── src └── robot ├── requirements └── src
docker-compose.yml
version: '3.7' services: ubuntu: # аналог docker run --name container_name: pytest_ubuntu image: pytest_ubuntu build: context: ./dockerfiles dockerfile: Dockerfile.ubuntu args: buildversion: 1 ports: - "3000:3000" volumes: - ./src:/opt tty: true command: tail -F /dev/null flaskservice: build: flask-service ports: - "5000:5000"
flask-service Dockerfile
# set base image (host OS) FROM python # set the working directory in the container WORKDIR /code # copy the dependencies file to the working directory COPY requirements.txt . # install dependencies RUN pip install -r requirements.txt # copy the content of the local src directory to the working directory COPY src/ . # command to run on container start CMD [ "python", "./app.py" ]
docker-compose build docker-compose up -d docker exec -it 7e3d2711b4ab bash python -m pytest -v tests/pytest/src/tests/app
# docker-compose.yml version: '3.8' services: pytest_ubuntu: container_name: pytest_ubuntu image: pytest_ubuntu # priveleged: true # user: root build: context: ./dockerfiles dockerfile: Dockerfile.ubuntu.pytest args: buildversion: 1 ports: - "3000:3000" networks: net1: ipv4_address: 10.5.0.2 extra_hosts: - flask.andrei.com:10.5.0.3 - jenkins.andrei.com:10.7.0.6 volumes: - ./src:/opt tty: true command: tail -F /dev/null flask_service: build: flask_service ports: - "5000:5000" networks: net1: ipv4_address: 10.5.0.3 extra_hosts: - jenkins.andrei.com:10.7.0.6 web: build: nginx ports: - "80:80" networks: net1: ipv4_address: 10.5.0.4 extra_hosts: - flask.andrei.com:10.5.0.3 - jenkins.andrei.com:10.7.0.6 robot_ubuntu: container_name: robot_ubuntu image: robot_ubuntu build: context: ./dockerfiles dockerfile: Dockerfile.ubuntu.robotfw args: buildversion: 1 ports: - "3001:3001" networks: net1: ipv4_address: 10.5.0.5 extra_hosts: - flask.andrei.com:10.5.0.3 - jenkins.andrei.com:10.7.0.6 volumes: - ./src:/opt tty: true command: tail -F /dev/null jenkins: # image specified in Dockerfile # image: jenkins/jenkins:lts restart: always privileged: true user: root build: context: ./dockerfiles dockerfile: Dockerfile.jenkins args: buildversion: 1 ports: - "8080:8080" - "50000:50000" container_name: jenkins networks: net1: ipv4_address: 10.5.0.6 jenkins: ipv4_address: 10.7.0.6 extra_hosts: - flask.andrei.com:10.5.0.3 volumes: - /var/run/docker.sock:/var/run/docker.sock - ./jenkins:/home networks: net1: driver: bridge ipam: config: - subnet: 10.5.0.0/16 gateway: 10.5.0.1 jenkins: driver: bridge ipam: config: - subnet: 10.7.0.0/16 gateway: 10.7.0.1
Пересобрать только один контейнер
Если вы внесли изменения только в один Dockerfile нет смысла выключать все контейнеры и собирать всё вместе. Можно уазать имя нужного контейнера и воспользоваться командой up с опциями --detach и --build
docker-compose up --detach --build container_name
Чтобы остановить и удалить только один контейнер а также удалить все связанные с ним безымянные образы нужно выполнить
docker-compose rm -s -v container_name