Traffine I/O

Bahasa Indonesia

2022-06-13

Menjalankan Multi-kontainer dengan Docker Compose

Pengenalan

Dalam artikel ini, saya akan menjelaskan cara menjalankan multi-kontainer dengan Docker Compose, termasuk dasar-dasar, struktur file Compose, mendefinisikan layanan, mengkonfigurasi jaringan dan volume, serta mengelola siklus hidup aplikasi.

Struktur File Compose

File Docker Compose adalah file YAML yang mendefinisikan layanan, jaringan, dan volume untuk aplikasi multi-kontainer Anda. File tersebut biasanya diberi nama docker-compose.yml dan ditempatkan di root direktori proyek Anda. Struktur dasar file Compose meliputi elemen-elemen utama berikut:

  • version
    Menentukan versi format file Compose. Versi yang berbeda mendukung fitur dan sintaks yang berbeda.

  • services
    Daftar layanan yang membentuk aplikasi Anda. Setiap layanan sesuai dengan kontainer dan didefinisikan oleh gambar Docker atau konteks pembangunan.

  • networks (Opsional)
    Daftar jaringan kustom untuk aplikasi Anda. Jaringan memungkinkan komunikasi antara layanan Anda dan dapat dikonfigurasi dengan driver dan opsi tertentu.

  • volumes (Opsional)
    Daftar volume bernama untuk aplikasi Anda. Volume menyediakan penyimpanan persisten untuk kontainer Anda dan dapat digunakan untuk berbagi data antara layanan.

Mendefinisikan Layanan

Layanan adalah komponen inti dari aplikasi Anda dan didefinisikan dalam bagian layanan file Compose Anda. Setiap layanan mewakili kontainer dan dibangun dari gambar Docker atau konteks pembangunan. Untuk mendefinisikan layanan, ikuti langkah-langkah berikut:

  1. Di bawah bagian services, tambahkan entri baru dengan nama deskriptif untuk layanan Anda (mis. web, database, redis).
  2. Tentukan gambar Docker yang akan digunakan untuk layanan menggunakan kunci image. Anda dapat menggunakan gambar resmi dari Docker Hub atau gambar kustom dari repositori pribadi Anda.
  3. (Opsional) Jika Anda perlu membangun gambar kustom, gunakan kunci build sebagai gantinya image, dan berikan konteks pembangunan (biasanya path ke Dockerfile Anda).
  4. (Opsional) Gunakan kunci depends_on untuk menentukan layanan apa saja yang diperlukan oleh layanan saat ini. Hal ini memastikan bahwa layanan yang bergantung akan mulai sebelum layanan saat ini.
  5. (Opsional) Konfigurasikan setelan tambahan untuk layanan, seperti ports, volumes, environment, networks, dan lain-lain.

Berikut adalah contoh file Compose yang mendefinisikan layanan web, layanan Redis, dan layanan PostgreSQL dengan saling bergantung:

docker-compose.yml
version: '3.9'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - app
  app:
    build: ./app
    depends_on:
      - redis
      - db
  redis:
    image: redis:alpine
  db:
    image: postgres:13-alpine
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydb

Pada contoh di atas, layanan web bergantung pada layanan app, sedangkan layanan app bergantung pada kedua layanan redis dan db. Konfigurasi ini memastikan bahwa layanan dimulai dengan urutan yang benar: redis dan db akan dimulai terlebih dahulu, diikuti oleh app, dan terakhir, web.

Mengkonfigurasi Jaringan

Secara default, Docker Compose membuat satu jaringan default untuk aplikasi Anda dan menghubungkan semua layanan ke jaringan tersebut. Namun, Anda dapat mendefinisikan jaringan kustom untuk kontrol yang lebih detail atas komunikasi antara layanan Anda. Untuk membuat jaringan kustom, ikuti langkah-langkah berikut:

  1. Di bawah bagian networks, tambahkan entri baru dengan nama deskriptif untuk jaringan Anda (mis. frontend, backend).
  2. (Opsional) Tentukan driver jaringan dan opsi menggunakan kunci driver dan driver_opts.
  3. Di bagian services, gunakan kunci networks untuk setiap layanan yang ingin Anda hubungkan ke jaringan kustom. Tentukan nama jaringan sebagai item daftar di bawah kunci jaringan.

Berikut adalah contoh file Compose yang mendefinisikan dua jaringan kustom dan menghubungkan berbagai layanan ke jaringan tersebut:

docker-compose.yml
version: '3.9'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - app
    networks:
      - frontend
  app:
    build: ./app
    depends_on:
      - redis
      - db
    networks:
      - frontend
      - backend
  redis:
    image: redis:alpine
    networks:
      - backend
  db:
    image: postgres:13-alpine
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydb
    networks:
      - backend

networks:
  frontend:
  backend:

Pada contoh di atas, kita membuat dua jaringan kustom: frontend dan backend. Layanan web dan app terhubung ke jaringan frontend, sedangkan layanan app, redis, dan db terhubung ke jaringan backend. Konfigurasi ini mengisolasi komponen frontend dan backend dari aplikasi.

Mengkonfigurasi Volume

Docker Compose memungkinkan Anda membuat volume bernama untuk menyimpan data dan membagikannya antar layanan. Untuk membuat volume bernama, ikuti langkah-langkah berikut:

  1. Di bawah bagian volumes, tambahkan entri baru dengan nama deskriptif untuk volume Anda (mis. db_data, app_uploads).
  2. Di bagian services, gunakan kunci volumes untuk setiap layanan yang ingin Anda pasang volume bernama tersebut. Tentukan sumber (nama volume) dan target (titik pasang di kontainer) dalam format <source>:<target>.

Berikut adalah contoh file Compose yang mendefinisikan volume bernama dan memasangkannya ke layanan PostgreSQL:

docker-compose.yml
version: '3.9'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - app
  app:
    build: ./app
    depends_on:
      - redis
      - db
  redis:
    image: redis:alpine
  db:
    image: postgres:13-alpine
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydb
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

Pada contoh di atas, kita membuat volume bernama db_data dan memasangkannya ke direktori /var/lib/postgresql/data di kontainer layanan db. Konfigurasi ini memastikan bahwa data PostgreSQL dijaga selama restart kontainer dan dapat dibagikan antar layanan jika diperlukan.

Membangun dan Menjalankan Aplikasi dengan Docker Compose

Membangun citra Docker Anda

Jika file Compose Anda menentukan layanan yang memerlukan pembuatan citra Docker kustom, Anda perlu membangun citra tersebut sebelum memulai aplikasi Anda. Untuk membangun citra yang didefinisikan dalam file Compose Anda, jalankan perintah berikut di direktori yang sama dengan docker-compose.yml Anda:

bash
$ docker-compose build

Perintah ini akan membangun semua citra yang diperlukan untuk layanan Anda, seperti yang didefinisikan dalam file Compose. Jika Anda hanya perlu membangun layanan tertentu, Anda dapat menentukan nama layanan setelah perintah build:

bash
$ docker-compose build <service_name>

Memulai layanan dan kontainer

Setelah citra Anda dibangun, Anda dapat memulai aplikasi Anda menggunakan Docker Compose. Untuk memulai layanan dan membuat kontainer untuk mereka, jalankan perintah berikut:

bash
$ docker-compose up

Secara default, perintah ini akan berjalan di foreground, menampilkan log dari semua layanan di konsol. Untuk menjalankan layanan Anda di detached mode (background), gunakan flag -d:

bash
$ docker-compose up -d

Anda juga dapat menentukan skala yang diinginkan untuk setiap layanan dengan menggunakan flag --scale diikuti oleh nama layanan dan jumlah replika:

bash
$ docker-compose up --scale <service_name>=<number_of_replicas>

Menghentikan dan menghapus kontainer

Untuk menghentikan layanan Anda dan menghapus kontainer yang terkait, gunakan perintah berikut:

bash
$ docker-compose down

Perintah ini akan menghentikan semua layanan yang berjalan, menghapus kontainer, dan juga menghapus jaringan dan volume yang didefinisikan dalam file Compose Anda. Jika Anda ingin menghentikan layanan tanpa menghapus kontainer, jaringan, dan volume, gunakan perintah stop:

bash
$ docker-compose stop

Skala layanan

Jika aplikasi Anda memerlukan scaling horizontal, Docker Compose memudahkan untuk menyesuaikan jumlah replika untuk setiap layanan. Untuk men-skala layanan tertentu, gunakan perintah scale diikuti dengan nama layanan dan jumlah replika yang diinginkan:

bash
$ docker-compose up -d --scale <service_name>=<number_of_replicas>

Perlu diingat bahwa men-skala layanan mungkin memerlukan konfigurasi tambahan, seperti load balancing atau data partitioning, tergantung pada sifat aplikasi Anda.

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!