Provision Host

Provision Host #

Sebelum bisa menjalankan container, host yang akan menjadi container runtime perlu disiapkan: Docker Engine diinstal, daemon dikonfigurasi, user yang tepat punya akses, dan runtime siap menerima workload. Mengotomasi provisioning host Docker dengan Ansible memastikan setiap host dalam cluster berjalan dengan konfigurasi yang identik — tidak ada variasi yang bisa menyebabkan “bekerja di host A tapi tidak di host B”.

Instalasi Docker Engine #

Instalasi Docker yang benar membutuhkan beberapa langkah: menambahkan repository resmi, menginstal paket yang tepat, dan memastikan versi yang konsisten:

# roles/docker/tasks/install.yml
---
- name: Hapus versi Docker lama jika ada
  apt:
    name:
      - docker
      - docker-engine
      - docker.io
      - containerd
      - runc
    state: absent

- name: Install prerequisite
  apt:
    name:
      - ca-certificates
      - curl
      - gnupg
      - lsb-release
    state: present
    update_cache: true

- name: Tambahkan Docker GPG key
  apt_key:
    url: https://download.docker.com/linux/ubuntu/gpg
    keyring: /etc/apt/keyrings/docker.gpg
    state: present

- name: Tambahkan repository Docker
  apt_repository:
    repo: >
      deb [arch={{ ansible_architecture }}
      signed-by=/etc/apt/keyrings/docker.gpg]
      https://download.docker.com/linux/ubuntu
      {{ ansible_distribution_release }} stable      
    filename: docker
    state: present

- name: Install Docker Engine
  apt:
    name:
      - docker-ce={{ docker_version }}
      - docker-ce-cli={{ docker_version }}
      - containerd.io
      - docker-buildx-plugin
      - docker-compose-plugin
    state: present
    update_cache: true
# roles/docker/defaults/main.yml
docker_version: "5:24.0.7-1~ubuntu.22.04~jammy"
docker_daemon_config:
  log-driver: json-file
  log-opts:
    max-size: "100m"
    max-file: "3"
  storage-driver: overlay2

Konfigurasi Docker Daemon #

Docker daemon bisa dikonfigurasi melalui file /etc/docker/daemon.json:

# roles/docker/tasks/configure.yml
---
- name: Buat direktori konfigurasi Docker
  file:
    path: /etc/docker
    state: directory
    owner: root
    group: root
    mode: '0755'

- name: Deploy konfigurasi Docker daemon
  template:
    src: daemon.json.j2
    dest: /etc/docker/daemon.json
    owner: root
    group: root
    mode: '0644'
    validate: "python3 -c 'import json; json.load(open(\"%s\"))'"
  notify: Restart Docker
{# roles/docker/templates/daemon.json.j2 #}
{
  "log-driver": "{{ docker_daemon_config['log-driver'] }}",
  "log-opts": {
    "max-size": "{{ docker_daemon_config['log-opts']['max-size'] }}",
    "max-file": "{{ docker_daemon_config['log-opts']['max-file'] }}"
  },
  "storage-driver": "{{ docker_daemon_config['storage-driver'] }}",
{% if docker_registry_mirrors is defined and docker_registry_mirrors | length > 0 %}
  "registry-mirrors": {{ docker_registry_mirrors | to_json }},
{% endif %}
  "live-restore": true,
  "userland-proxy": false
}

live-restore: true memungkinkan container tetap berjalan saat Docker daemon di-restart — penting untuk zero-downtime maintenance.


Manajemen User Docker #

Secara default, hanya root yang bisa menjalankan perintah Docker. Tambahkan user ke grup docker agar bisa menjalankan container tanpa sudo:

# roles/docker/tasks/users.yml
---
- name: Pastikan grup docker ada
  group:
    name: docker
    state: present

- name: Tambahkan user ke grup docker
  user:
    name: "{{ item }}"
    groups: docker
    append: true
  loop: "{{ docker_users }}"
# group_vars/dockerhosts.yml
docker_users:
  - deployer
  - ansible-deploy
User yang masuk ke grup docker secara efektif punya akses root ke host — mereka bisa mount filesystem root sebagai volume ke dalam container. Ini adalah trade-off yang perlu dipahami. Di production, pertimbangkan menggunakan rootless Docker atau membatasi akses Docker hanya ke service account yang diperlukan.

Verifikasi Instalasi #

Setelah setup selesai, verifikasi bahwa Docker berjalan dengan benar:

# roles/docker/tasks/verify.yml
---
- name: Pastikan Docker service berjalan
  systemd:
    name: docker
    state: started
    enabled: true

- name: Verifikasi Docker bisa menjalankan container
  command: docker run --rm hello-world
  register: docker_test
  changed_when: false

- name: Pastikan versi Docker sesuai
  command: docker version --format "{{ '{{' }}.Server.Version{{ '}}' }}"
  register: docker_installed_version
  changed_when: false

- name: Tampilkan versi Docker yang terinstal
  debug:
    msg: "Docker version: {{ docker_installed_version.stdout }}"

Setup Logging Driver yang Tepat #

Log container yang tidak diatur bisa memenuhi disk server dengan cepat:

- name: Konfigurasi log rotation untuk Docker
  template:
    src: docker-logrotate.j2
    dest: /etc/logrotate.d/docker-containers
{# templates/docker-logrotate.j2 #}
/var/lib/docker/containers/*/*.log {
    rotate 7
    daily
    compress
    missingok
    delaycompress
    copytruncate
}

Ringkasan #

  • Selalu hapus versi Docker lama sebelum instalasi versi baru untuk menghindari konflik.
  • Pin versi Docker di defaults/main.yml — update Docker yang tidak terkontrol bisa membreak container yang berjalan.
  • daemon.json adalah tempat utama konfigurasi Docker: log driver, storage driver, registry mirror. Selalu validasi JSON-nya sebelum deploy.
  • live-restore: true di daemon.json memungkinkan container tetap berjalan saat Docker daemon di-restart — penting untuk maintenance zero-downtime.
  • Grup docker memberikan akses setara root — batasi hanya untuk user yang benar-benar membutuhkannya.
  • Konfigurasi log rotation sejak awal — container yang banyak dan aktif bisa menghabiskan disk dalam hitungan hari jika log tidak dibatasi.

← Sebelumnya: Common Mistake   Berikutnya: Deploy Container →

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