2022-07-18
608

Использование Docker-compose

Описание

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

Вместо того, чтобы запускать контейнеры по отдельности и указывать большое количество параметров при запуске, их можно указать в файле. Файл должен называться docker-compose.yaml. С его помощью можно одной командой запустить большое количество контейнеров с нужными параметрами. Позволяет определить контейнерное приложение, состоящее из набора контейнеров, которые должны работать вместе.

Конфигурацию можно разделить на несколько файлов, например docker-compose.yaml, docker-compose-1.yaml, docker-compose-2.yaml. При этом в docker-compose.yaml будут содержатся общие настройки, а в других файлах различия.

Если установлен Docker-desktop, docker-compose устанавливается вместе с ним, если устанавливается консольная версия docker-ce, то docker-compose нужно установить отдельно.

Установка Docker-compose

Установка в CentOS:
добавление репозитория со свежей версией docker
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
установка docker-compose
yum install docker-compose-plugin
Установка в Ubuntu:
добавление ключа репозитория
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
добавление репозитория
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
установка docker-compose
apt install update
apt install docker-compose

Команды Docker-compose

  • docker compose version вывод версии
  • docker compose build сборка образа перед запуском, работает если в файле docker-compose.yaml указана инструкция build
  • docker compose up запуск контейнеров, при этом файл обязательно должен называться docker-compose.yaml и быть в каталоге из которого выполняется команда
  • docker compose up -d запуск контейнеров в фоне
  • docker compose -f docker/docker-compose.yaml up запуск контейнеров с указанием пути к файлу
  • docker compose -f docker-compose.1.yaml -f docker-compose.2.yaml up запуск контейнеров из нескольких файлов
  • docker compose down остановить и удалить все контейнеры
  • docker compose -f docker/docker-compose.yaml down остановить и удалить контейнеры, которые были созданы по файлу
  • docker compose ps вывод списка запущенных контейнеров
  • docker compose stop остановить все контейнеры
  • docker compose start запустить все ранее остановленные контейнеры
  • docker compose run --rm test-nginx запустить один из контейнеров, описанных в файле
  • docker compose run --rm db psql -h db -U postgres dbname запуск psql в одном из контейнеров

Инструкции файла docker-compose.yaml

Полный список есть в документации.

image

Указывает образ, с которого будет запускаться контейнер.

Пример
image: nginx

build

Указывает dockerfile, по которому собирается образ для запуска https://docs.docker.com/compose/compose-file/build/
build:
  context: ./test-dockerfile  #указывается каталог с dockerfile, можно указать или относительный или абсолютный путь

blkio_config

Параметры, определяющие лимиты ввода-вывода для контейнера.

device_read_bps, device_write_bps - устанавливает ограничение скорости для операций чтения/записи на указанном устройстве в килобайтах или мегабайтах. Каждый элемент в списке должен иметь два ключа:
path - путь к устройству;
rate - скорость в килобайтах или мегабайтах.

device_read_iops, device_write_iops - устанавливает ограничение в операциях в секунду для операций чтения/записи на данном устройстве. Каждый элемент в списке должен иметь два ключа:
path - путь к устройству;
rate - число, определяющее допустимое количество операций в секунду.

weight - устанавливает долю полосы пропускания, выделенной для контейнера, по сравнению с другими контейнерами. Принимает целое значение от 10 до 1000, по умолчанию используется значение 500.

weight_device - устанавливает долю полосы пропускания, по устройствам. Принимает целое значение от 10 до 1000, по умолчанию используется значение 500. Каждый элемент в списке должен иметь два ключа:
path - путь к устройству;
rate - число, определяющее долю полосы пропускания.

Пример
blkio_config:
  weight: 300
  weight_device:
    - path: /dev/sda
      weight: 400
  device_read_bps:
    - path: /dev/sdb
      rate: '12mb'
  device_read_iops:
    - path: /dev/sdb
      rate: 120
  device_write_bps:
    - path: /dev/sdb
      rate: '1024k'
  device_write_iops:
    - path: /dev/sdb
      rate: 30

command

Переопределяет команду по умолчанию, объявленную образом контейнера, то есть изменяет CMD, которая записана в образе.

Пример
command: python app.py
или
command: ["python", "app.py"]

container_name

Указывает пользовательское имя контейнера, а не сгенерированное имя по умолчанию.

Пример
container_name: container-name

depends_on

Определяет зависимости запуска и завершения работы между контейнерами.

Пример
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

environment

Определяет переменные среды, передаваемые в контейнер.

Пример
environment:
  RACK_ENV: development
  SHOW: "true"
  USER_INPUT:
Или
environment:
  - RACK_ENV=development
  - SHOW=true
  - USER_INPUT

hostname

Объявляет пользовательское имя хоста, которое будет использоваться для контейнера.

labels

Добавляет метаданные к контейнеру.

Пример
labels:
  com.example.description: "Accounting webapp"
  com.example.department: "Finance"
  com.example.label-with-empty-value: ""
Или
labels:
  - "com.example.description=Accounting webapp"
  - "com.example.department=Finance"
  - "com.example.label-with-empty-value"

Определяет сетевую ссылку на контейнеры.

Пример
web:
  links:
    - db
    - db:database
    - redis

networks

Определяет сети, к которым подключены контейнеры. Docker-compose самостоятельно создает сеть и подключает к ней контейнеры.

Пример
services:
  some-service:
    networks:
      - some-network
      - other-network

ipv4_address, ipv6_address

Указывает статический ip-адрес контейнера.

Пример
services:
  frontend:
    image: awesome/webapp
    networks:
      front-tier:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10

networks:
  front-tier:
    ipam:
      driver: default
      config:
        - subnet: "172.16.238.0/24"
        - subnet: "2001:3984:3989::/64"

mac_address

Задает mac-адрес контейнера.

ports

Открывает порты контейнеров для основной системы.

Пример
ports:
  - "3000"
  - "8080:80"

restart

Определяет политику, которая будет применятся при выключении контейнера.

Пример
restart: "no" #не перезапускать
restart: always #перезапускать всегда
restart: on-failure #
restart: unless-stopped #

user

Переопределяет пользователя, используемого для запуска процесса контейнера. По умолчанию используется root.

volumes

Определяет том для подключения к контейнеру.

Пример
services:
  frontend:
    image: awesome/webapp
    volumes:
      - type: volume
        source: test-volume
        target: /etc/test-volume-dir

volumes:
  test-volume:

Примеры файла docker-compose.yaml

Самый простой пример:
services:
  test-nginx:
    image: nginx
  test-apache:
    image: httpd
Пример:
services:
  test-nginx:
    image: nginx
    ports: 
      - "8080:80"
    networks:
      - test-network

  test-apache:
    image: httpd
    ports: 
      - "8081:80"
    networks:
      - test-network
    volumes:
      - test-volume:/etc/test-volume-dir

  test-my_image:
    build:                            #указывается если нужно запустить контейнер предварительно собрав его образ из dockerfile
      context: /home/test-dockerfile  #указывается каталог с dockerfile, можно указать или относительный или абсолютный путь
    networks:
      - test-network

volumes:
  test-volume:

networks:
  test-network: {}