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

Ответ

Для развертывания конфигурации 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

Ответ 18+ 🔞

Ах ты ж ёпта, ну и тема подкинули! Слушай, тут про развертывание этого вашего Docker Compose на куче машин. В общем, вариантов — овердохуища, но я тебе сейчас популярно разжую, как это всё работает, чтобы ты не сидел, как Герасим, и не мычал «Му-му», блядь, когда что-то пойдёт не так.

Первый вариант — это 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

Видишь? Всё чётко, без лишней суеты. Создал папку, скопировал файл, поднял сервисы. И так на всех машинах, которые ты указал. Масштабируется — хоть на сотню серверов, блядь, закинь.

Второй вариант — это скрипты на Bash, с SSH и SCP.

Тут всё просто, как три копейки, но и доверия, ёпта, ноль. Подходит, если у тебя три машины и ты не хочешь заморачиваться с Ansible. Но будь готов, что в какой-то момент скрипт может накрыться медным тазом, и ты останешься с носом.

Вот пример скрипта:

#!/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."

Всё, в рот меня чих-пых! Просто копируешь файл на каждую машину и запускаешь docker-compose up. Но если что-то пойдёт не так — пиши пропало, блядь. Придёшь, а там половина сервисов не запустилась, и ты сидишь, как дурак, и думаешь: «И кто же, сука, серит на крыше?».

Третий вариант — Docker Swarm, нативное решение от самих Docker'овцев.

Это уже серьёзно, блядь. Ты создаёшь кластер из машин, и они работают как единое целое. Балансировка нагрузки, отказоустойчивость — всё из коробки. Твой docker-compose.yml превращается в «стек» сервисов, который можно развернуть одной командой.

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

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

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

И всё, блядь! Сервисы сами распределятся по нодам, и если одна машина накроется, то Docker Swarm перенесёт контейнеры на другую. Красота, да и только! Но тут, конечно, нужно понимать, как это всё работает, а то можно так накосячить, что мало не покажется.

Итог, блядь:
Выбирай инструмент по потребностям. Если нужно надёжно и масштабируемо — Ansible. Если просто и быстро на паре машин — Bash-скрипты. А если хочешь полноценный кластер с отказоустойчивостью — Docker Swarm. Главное — не путай их, а то получится, как в той сказке: «Ядра — чистый изумруд! Да не я дрочистый, блядь, изумруд!!».