Как развернуть приложение Docker Compose на нескольких виртуальных машинах

«Как развернуть приложение Docker Compose на нескольких виртуальных машинах» — вопрос из категории Devops, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для развертывания конфигурации Docker Compose на нескольких машинах используют инструменты автоматизации и оркестрации. Выбор зависит от сложности инфраструктуры и требований к отказоустойчивости.

1. Системы управления конфигурацией (Ansible)

Это декларативный и идемпотентный подход, который является отраслевым стандартом для автоматизации.

Почему это хорошо:

  • Надежность: Ansible гарантирует, что состояние серверов будет соответствовать описанному в плейбуке.
  • Масштабируемость: Легко управляет десятками и сотнями машин.

Пример плейбука deploy.yml:

- name: Deploy Docker Compose application
  hosts: all
  become: true
  tasks:
    - name: Create application directory
      file:
        path: /opt/app
        state: directory

    - name: Copy docker-compose.yml to remote host
      copy:
        src: ./docker-compose.yml
        dest: /opt/app/docker-compose.yml

    - name: Run docker-compose up
      community.docker.docker_compose:
        project_src: /opt/app
        state: present

2. Скрипты (Bash + SSH/SCP)

Подходит для простых задач или сред, где нет возможности установить Ansible.

Почему это хорошо:

  • Простота: Не требует установки дополнительных агентов, только SSH-доступ.

Пример скрипта:

#!/bin/bash
set -e # Прервать выполнение при ошибке

SERVERS=("user@vm1.example.com" "user@vm2.example.com")

for server in "${SERVERS[@]}"; do
  echo "Deploying to $server..."
  scp ./docker-compose.yml "$server:/opt/app/"
  ssh "$server" "cd /opt/app && docker-compose up -d --pull always"
done

echo "Deployment finished."

3. Оркестрация (Docker Swarm)

Нативное решение от Docker для создания кластера из нескольких машин. Docker Compose файлы используются для определения "стеков" сервисов.

Почему это хорошо:

  • Встроенные возможности: Обеспечивает балансировку нагрузки, отказоустойчивость и масштабирование "из коробки".

Пример использования:

# 1. На управляющей ноде инициализируем Swarm
# docker swarm init

# 2. Разворачиваем стек из файла docker-compose.yml
docker stack deploy -c docker-compose.yml my_app_stack