Развертывание веб-приложения с Docker Compose и Ansible
Задание
Автоматизировать развертывание отказоустойчивого веб-приложения с использованием:
Docker Compose для оркестрации контейнеров
Ansible для автоматизации развертывания
Nginx в качестве reverse proxy с балансировкой нагрузки
MySQL/MariaDB с персистентным хранилищем
PHPMyAdmin для управления БД
Структура решения
Docker Compose конфигурация
Ansible роль для автоматизации
Настройка Nginx как reverse proxy
Docker Compose Конфигурация
Пример файла docker-compose.yml:
version: '3.8'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- web1
- web2
web1:
image: your-web-app-image # Заменить на Flask/WP образ
environment:
- DB_HOST=db
networks:
- app-network
web2:
image: your-web-app-image # Заменить на Flask/WP образ
environment:
- DB_HOST=db
networks:
- app-network
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: app_db
volumes:
- db_data:/var/lib/mysql
networks:
- app-network
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
PMA_HOST: db
ports:
- "8080:80"
depends_on:
- db
volumes:
db_data:
networks:
app-network:
Ansible Роль
Структура роли (roles/deploy/tasks/main.yml):
- name: Install Docker dependencies
apt:
name: "{{ item }}"
state: present
loop:
- apt-transport-https
- ca-certificates
- curl
- software-properties-common
- name: Add Docker GPG key
apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Add Docker repository
apt_repository:
repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable
state: present
- name: Install Docker
apt:
name: docker-ce
state: present
- name: Install Docker Compose
get_url:
url: https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-linux-x86_64
dest: /usr/local/bin/docker-compose
mode: '0755'
- name: Copy docker-compose files
copy:
src: docker-compose.yml
dest: /opt/app/
nginx.conf:
src: nginx.conf
dest: /opt/app/
- name: Start containers
command: docker-compose up -d
args:
chdir: /opt/app/
- name: Restore DB from dump
community.docker.docker_container_exec:
container: db
command: sh -c "mysql -u root -psecret app_db < /dump.sql"
when: dump_file_exists
Настройка Nginx как Reverse Proxy
Пример nginx.conf:
events {}
http {
upstream backend {
server web1:8000;
server web2:8000;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
Важные замечания
Для WordPress заменить
your-web-app-imageнаwordpress:php8.1-apacheНастроить правильные порты для приложения
Добавить health-check для контейнеров
Использовать секреты для чувствительных данных (env-файлы)
Настроить SSL/TLS при необходимости