This Task focuses on automating the deployment of a multi-container application using Ansible. The goal is to install Docker, configure the environment, and deploy a containerized application with Docker Compose on multiple servers. The project follows Infrastructure as Code (IaC) principles to ensure consistency and automation.
+----------------------+ | User Request | +----------+-----------+ | v +----------------+ | Nginx | --> Reverse Proxy +----------------+ | +-------------------------------------+ | Docker Network | +-------------------------------------+ | | +------------+ +--------------+ | Flask | | MySQL | --> Database +------------+ +--------------+ | +---------------+ | Redis | --> Caching Layer +---------------+
Create an Ansible playbook to install Docker, configure the user, and deploy the application.
inventory.ini
)[web_servers] server1 ansible_host=192.168.1.10 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_rsa server2 ansible_host=192.168.1.11 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_rsa
docker-setup.yml
)--- - name: Install Docker and Deploy Application hosts: web_servers become: yes tasks: - name: Install required packages apt: name: - docker.io - docker-compose - python3-pip - python3-docker state: present update_cache: yes - name: Add user to Docker group user: name: ubuntu groups: docker append: yes - name: Start Docker service systemd: name: docker state: started enabled: yes - name: Copy Docker Compose file to remote servers copy: src: ./docker-compose.yml dest: /home/ubuntu/docker-compose.yml - name: Deploy Application with Docker Compose command: docker-compose -f /home/ubuntu/docker-compose.yml up -d args: chdir: /home/ubuntu/
The docker-compose.yml file defines the multi-container application with services for:
docker-compose.yml
version: '3.8' services: web: image: myflaskapp:latest build: ./app container_name: flask_app restart: always ports: - "5000:5000" environment: - DATABASE_URL=mysql://user:password@db/mydb - REDIS_URL=redis://redis:6379 depends_on: - db - redis db: image: mysql:5.7 container_name: mysql_db restart: always environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: mydb MYSQL_USER: user MYSQL_PASSWORD: password ports: - "3306:3306" volumes: - db_data:/var/lib/mysql redis: image: redis:alpine container_name: redis_cache restart: always ports: - "6379:6379" nginx: image: nginx:latest container_name: nginx_proxy restart: always ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf depends_on: - web volumes: db_data:
Step 1: Clone the Repository
git clone https://github.com/your-repo/dockerized-app.git cd dockerized-app ansible-playbook -i inventory.ini docker-setup.yml
Step 2: Run the Ansible Playbook
ansible-playbook -i inventory.ini docker-setup.yml
docker ps
mysql -u user -p -h 127.0.0.1 -P 3306
docker-compose logs -f
This project provides an automated way to deploy a multi-container application using Docker Compose and Ansible. It ensures scalability, consistency, and ease of management.