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:
- Di bawah bagian
services
, tambahkan entri baru dengan nama deskriptif untuk layanan Anda (mis.web
,database
,redis
). - 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. - (Opsional) Jika Anda perlu membangun gambar kustom, gunakan kunci
build
sebagai gantinyaimage
, dan berikan konteks pembangunan (biasanya path ke Dockerfile Anda). - (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. - (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:
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:
- Di bawah bagian
networks
, tambahkan entri baru dengan nama deskriptif untuk jaringan Anda (mis.frontend
,backend
). - (Opsional) Tentukan driver jaringan dan opsi menggunakan kunci
driver
dandriver_opts
. - Di bagian
services
, gunakan kuncinetworks
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:
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:
- Di bawah bagian
volumes
, tambahkan entri baru dengan nama deskriptif untuk volume Anda (mis.db_data
,app_uploads
). - Di bagian
services
, gunakan kuncivolumes
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:
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:
$ 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
:
$ 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:
$ 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
:
$ 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:
$ 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:
$ 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
:
$ 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:
$ 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.