Ansible vs Docker Compose

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_v2 untuk menjalankan Compose dari Ansible — recreate: auto otomatis memperbarui container yang konfigurasinya berubah.
  • Docker Compose tidak menggantikan Ansible, dan Ansible tidak menggantikan Compose — keduanya punya peran yang komplementer.

← Sebelumnya: Deploy Container   Berikutnya: Image Build →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact