Ansible vs Docker Compose #
Pertanyaan yang sering muncul saat mulai menggunakan Ansible untuk container: “Kenapa tidak pakai Docker Compose saja?” Keduanya bisa mendefinisikan dan menjalankan container — tapi dengan filosofi yang sangat berbeda. Memahami perbedaan ini bukan soal mana yang lebih baik secara absolut, melainkan soal kapan menggunakan yang mana, dan bagaimana keduanya bisa saling melengkapi.
Perbedaan Filosofi #
Docker Compose:
Fokus: mendefinisikan dan menjalankan multi-container application
Scope: satu host, satu aplikasi
State: deklaratif tapi terbatas pada container lifecycle
Strengths: simple, cepat untuk dev environment, YAML yang intuitif
Ansible:
Fokus: configuration management dan otomasi infrastruktur
Scope: banyak host, banyak aplikasi, seluruh infrastruktur
State: deklaratif + kondisional + cross-host coordination
Strengths: multi-host, idempoten, integrasi dengan sistem lain
Apa yang Docker Compose Lakukan Lebih Baik #
Docker Compose unggul untuk mendefinisikan multi-container application yang saling bergantung:
# docker-compose.yml — sangat ekspresif untuk mendefinisikan stack
version: "3.9"
services:
web:
image: myapp:2.1.0
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
environment:
DATABASE_URL: postgresql://app:secret@db/myapp
ports:
- "8080:8080"
networks:
- app-net
db:
image: postgres:15-alpine
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "app"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app-net
redis:
image: redis:7-alpine
networks:
- app-net
volumes:
db-data:
networks:
app-net:
depends_on dengan condition: service_healthy adalah fitur Docker Compose yang sangat berguna — container web tidak akan start sampai database benar-benar siap menerima koneksi.
Apa yang Ansible Lakukan Lebih Baik #
Ansible unggul saat kamu perlu melakukan lebih dari sekadar menjalankan container:
# Ansible bisa melakukan semua ini dalam satu run:
- name: Provision infrastructure lengkap
hosts: appservers
tasks:
# 1. Setup OS dan dependencies
- include_role:
name: common
- include_role:
name: docker
# 2. Deploy file konfigurasi (yang tidak bisa dilakukan Compose)
- name: Deploy konfigurasi nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
# 3. Setup SSL certificate
- name: Deploy SSL certificate
copy:
src: "files/ssl/{{ inventory_hostname }}.crt"
dest: /etc/ssl/certs/app.crt
# 4. Konfigurasi firewall
- name: Buka port yang diperlukan
ufw:
rule: allow
port: "{{ item }}"
loop: ['80', '443']
# 5. BARU kemudian deploy container
- name: Deploy docker-compose stack
community.docker.docker_compose_v2:
project_src: /opt/app
state: present
Pola Terbaik: Gunakan Keduanya #
Pola yang paling umum di production adalah Ansible untuk provisioning host, Docker Compose untuk mendefinisikan aplikasi:
Ansible bertanggung jawab atas:
├── Provisioning VM/server
├── Instalasi Docker Engine
├── Konfigurasi OS (user, firewall, sysctl)
├── Distribusi file konfigurasi dan sertifikat
├── Mendeploy file docker-compose.yml ke server
└── Menjalankan docker compose up
Docker Compose bertanggung jawab atas:
├── Mendefinisikan service dan dependency antar container
├── Konfigurasi network antar container
└── Mendefinisikan volume yang diperlukan
# Ansible mendeploy dan menjalankan Docker Compose stack
- name: Deploy aplikasi menggunakan Docker Compose
hosts: appservers
tasks:
- name: Buat direktori aplikasi
file:
path: /opt/myapp
state: directory
owner: deployer
- name: Deploy docker-compose.yml dari template
template:
src: docker-compose.yml.j2
dest: /opt/myapp/docker-compose.yml
owner: deployer
- name: Deploy file .env dari vault
template:
src: env.j2
dest: /opt/myapp/.env
owner: deployer
mode: '0600'
no_log: true
- name: Pull image terbaru
community.docker.docker_compose_v2:
project_src: /opt/myapp
pull: always
- name: Jalankan stack Docker Compose
community.docker.docker_compose_v2:
project_src: /opt/myapp
state: present
recreate: auto # Recreate container jika konfigurasi berubah
Kapan Tidak Menggunakan Docker Compose #
Docker Compose tidak cocok untuk:
Banyak host: Compose hanya untuk satu host.
Untuk multi-host, gunakan Docker Swarm atau Kubernetes.
Infrastruktur kompleks: Compose tidak bisa setup firewall,
menginstall package, atau mengkonfigurasi OS.
State yang kompleks: Compose tidak punya conditional logic,
tidak bisa cek kondisi sebelum bertindak.
Ringkasan #
- Docker Compose unggul untuk mendefinisikan multi-container application —
depends_on, healthcheck, dan network definition sangat ekspresif.- Ansible unggul untuk provisioning host, konfigurasi OS, dan orkestrasi multi-host — jauh di luar kemampuan Compose.
- Pola terbaik: Ansible untuk menyiapkan host dan mendeploy file Compose, Docker Compose untuk mendefinisikan container stack.
- Gunakan
community.docker.docker_compose_v2untuk menjalankan Compose dari Ansible —recreate: autootomatis memperbarui container yang konfigurasinya berubah.- Docker Compose tidak menggantikan Ansible, dan Ansible tidak menggantikan Compose — keduanya punya peran yang komplementer.