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="eth1.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

Похожие статьи
Docker Compose
Docker
Установка в Linux и Windows
Основы
build: Создание контейнеров + примеры
run: Опции запуска контейнера
Dockerfile
Остановить/удалить все контейнеры
exec: выполнить команду в контейнере
Установка docker compose в Linux
Видеоуроки
Ошибки
Make
Изображение баннера

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: