Apa itu Docker Compose?
Jika aplikasi Docker Anda menyertakan lebih dari satu container (misalnya, server web dan database yang berjalan di container terpisah), membuat, menjalankan, dan menghubungkan container dari Dockerfile terpisah akan merepotkan dan memakan waktu. Docker Compose memecahkan masalah ini dengan mengizinkan Anda menggunakan file YAML untuk menentukan aplikasi multi-kontainer. Anda dapat mengonfigurasi wadah sebanyak yang Anda inginkan, bagaimana wadah itu harus dibangun dan dihubungkan, dan di mana data harus disimpan. Saat file YAML selesai, Anda dapat menjalankan satu perintah untuk membangun, menjalankan, dan mengonfigurasi semua container.
Panduan ini akan menjelaskan bagaimana docker-compose.yml
file diatur, dan tunjukkan cara menggunakannya untuk membuat beberapa konfigurasi aplikasi dasar.
Catatan Umumnya container dalam aplikasi yang dibangun menggunakan Docker Compose semuanya akan berjalan pada host yang sama. Mengelola container yang berjalan di host yang berbeda biasanya memerlukan alat tambahan, seperti Docker Swarm atau Kubernetes.
Sebelum Anda Mulai
Instal Docker CE
Anda memerlukan Linode dengan Docker CE yang diinstal untuk mengikuti langkah-langkah dalam panduan ini.
Untuk menginstal Docker CE (Edisi Komunitas), ikuti petunjuk dalam salah satu panduan di bawah ini:
-
Menginstal dan Menggunakan Docker di Ubuntu dan Debian
-
Memasang dan Menggunakan Docker di CentOS dan Fedora
Untuk instruksi lengkap tentang distribusi Linux lainnya, lihat bagian Instal Docker Engine dari dokumentasi resmi Docker.
Instal Docker Compose
-
Unduh versi terbaru Docker Compose. Periksa halaman rilis dan ganti
1.25.4
pada perintah di bawah ini dengan versi yang ditandai sebagai Rilis terbaru :sudo curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
-
Setel izin file:
sudo chmod +x /usr/local/bin/docker-compose
Penggunaan Dasar
Bagian ini akan meninjau contoh file Docker Compose yang diambil dari dokumentasi resmi Docker.
-
Buka
docker-compose.yml
di editor teks dan tambahkan konten berikut:- File:buruh pelabuhan -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
version: '3' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: db_data:
-
Simpan file dan jalankan Docker Compose dari direktori yang sama:
docker-compose up -d
Ini akan membangun dan menjalankan
db
danwordpress
kontainer. Sama seperti saat menjalankan satu wadah dengandocker run
,-d
flag memulai container dalam mode terpisah. -
Anda sekarang memiliki wadah WordPress dan wadah MySQL yang berjalan di host Anda. Arahkan ke
192.0.8.1:8000/wordpress
di browser web untuk melihat aplikasi WordPress yang baru Anda instal. Anda juga dapat menggunakandocker ps
untuk mengeksplorasi lebih lanjut konfigurasi yang dihasilkan:docker ps
-
Hentikan dan keluarkan wadah:
docker-compose down
Tulis Sintaks File
Sebuah docker-compose.yml
file diatur menjadi empat bagian:
Petunjuk | Gunakan |
---|---|
versi | Menentukan versi sintaks file Compose. Panduan ini akan menggunakan Versi 3 secara keseluruhan. |
layanan | Di Docker, layanan adalah nama untuk "Kontainer dalam produksi". Bagian ini mendefinisikan container yang akan dimulai sebagai bagian dari instance Docker Compose. |
jaringan | Bagian ini digunakan untuk mengkonfigurasi jaringan untuk aplikasi Anda. Anda dapat mengubah setelan jaringan default, menyambung ke jaringan eksternal, atau menentukan jaringan khusus aplikasi. |
volume | Memasang jalur tertaut pada mesin host yang dapat digunakan oleh penampung. |
Sebagian besar panduan ini akan berfokus pada penyiapan penampung menggunakan services
bagian. Berikut adalah beberapa arahan umum yang digunakan untuk menyiapkan dan mengonfigurasi container:
Petunjuk | Gunakan |
---|---|
gambar | Menyetel gambar yang akan digunakan untuk membangun wadah. Menggunakan direktif ini mengasumsikan bahwa gambar yang ditentukan sudah ada di host atau di Hub Docker. |
bangun | Direktif ini dapat digunakan sebagai pengganti image . Menentukan lokasi Dockerfile yang akan digunakan untuk membangun container ini. |
db | Dalam kasus file contoh Dockercompose, db adalah variabel untuk wadah yang akan Anda definisikan. |
mulai ulang | Memberitahu wadah untuk memulai ulang jika sistem dimulai ulang. |
volume | Memasang jalur tertaut pada mesin host yang dapat digunakan oleh penampung |
lingkungan | Tentukan variabel lingkungan yang akan diteruskan ke perintah run Docker. |
tergantung_pada | Menetapkan layanan sebagai ketergantungan untuk wadah yang ditentukan blok saat ini |
pelabuhan | Memetakan port dari container ke host dengan cara berikut:host:container |
tautan | Tautkan layanan ini ke layanan lain di file Docker Compose dengan menyebutkan namanya di sini. |
Banyak arahan konfigurasi lain yang tersedia. Lihat referensi Compose File untuk detailnya.
Hati-hati Contohdocker-compose.yml
di atas menggunakanenvironment
direktif untuk menyimpan kata sandi pengguna MySQL langsung di file YAML untuk diimpor ke wadah sebagai variabel lingkungan. Ini tidak disarankan untuk informasi sensitif di lingkungan produksi. Sebagai gantinya, informasi sensitif dapat disimpan dalam.env
yang terpisah file (yang tidak diperiksa ke dalam kontrol versi atau dipublikasikan) dan diakses dari dalamdocker-compose.yml
dengan menggunakanenv_file
arahan.
Membangun Aplikasi dari Awal
Buat docker-compose.yml
file satu bagian pada satu waktu untuk mengilustrasikan langkah-langkah membangun aplikasi multi-kontainer.
Mendefinisikan Layanan Sederhana:
-
Buat
docker-compose.yml
baru di editor teks dan tambahkan konten berikut:- File:buruh pelabuhan -compose.yml
1 2 3 4 5 6 7 8
version: '3' services: distro: image: alpine restart: always container_name: Alpine_Distro entrypoint: tail -f /dev/null
Setiap entri dalam
services
bagian akan membuat wadah terpisah ketikadocker-compose
dijalankan. Pada titik ini, bagian tersebut berisi satu wadah berdasarkan distribusi resmi Alpine:restart
direktif digunakan untuk menunjukkan bahwa container harus selalu dimulai ulang (misalnya setelah crash atau sistem di-boot ulang).container_name
direktif digunakan untuk mengganti nama container yang dibuat secara acak dan menggantinya dengan nama yang lebih mudah diingat dan digunakan.- Kontainer Docker keluar secara default jika tidak ada proses yang berjalan di dalamnya.
tail -f
adalah proses yang berkelanjutan, sehingga akan berjalan tanpa batas waktu dan mencegah container berhenti.entrypoint
default diganti agar container tetap berjalan.
-
Buka wadah Anda:
docker-compose up -d
-
Periksa status penampung Anda:
docker ps
Outputnya harus seperti berikut:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 967013c36a27 alpine "tail -f /dev/null" 3 seconds ago Up 2 seconds Alpine_Distro
-
Turunkan wadahnya:
docker-compose down
Tambahkan Layanan Tambahan
Dari sini Anda bisa mulai membangun ekosistem container. Anda dapat menentukan cara mereka bekerja sama dan berkomunikasi.
-
Buka kembali
docker-compos.yml
dan tambahkandatabase
layanan di bawah ini:- File:buruh pelabuhan -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
version: '3' services: distro: image: alpine container_name: Alpine_Distro restart: always entrypoint: tail -f /dev/null database: image: postgres:latest container_name: postgres_db volumes: - ../dumps:/tmp/ ports: - "5432:5432"
Sekarang ada dua layanan yang ditentukan:
- Distro
- Basis Data
Layanan Distro masih sama seperti sebelumnya. Server Database berisi instruksi untuk wadah postgres, dan arahan:
volumes: - ../dumps:/tmp
danports:-"5432:5432"
, direktif pertama memetakan/dumps
containerd folder ke/tmp
lokal kami map. Arahan kedua memetakan port container ke port host lokal. -
Periksa container yang sedang berjalan:
docker ps
Perintah ini menunjukkan status container, pemetaan port, nama, dan perintah terakhir yang dijalankan pada container tersebut. Penting untuk dicatat bahwa wadah postgres membaca “docker-entrypoint…” di bawah perintah. Skrip Entrypoint PostgresDocker adalah yang terakhir diluncurkan saat container dimulai.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ecc37246f6ef postgres:latest "docker-entrypoint..." About a minute ago Up About a minute 0.0.0.0:5432->5432/tcp postgres_db 35dab3e712d6 alpine "tail -f /dev/null" About a minute ago Up About a minute Alpine_Distro
-
Turunkan kedua wadah:
docker-compose down
Tambahkan Layanan nginx
-
Tambahkan wadah nginx agar aplikasi Anda dapat melayani situs web:
- File:buruh pelabuhan -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
version: '3' services: distro: image: alpine container_name: Alpine_Distro restart: always entrypoint: tail -f /dev/null database: image: postgres:latest container_name: postgres_db volumes: - ../dumps:/tmp/ ports: - "5432:5432" web: image: nginx:latest container_name: nginx volumes: - ./mysite.template:/etc/nginx/conf.d/mysite.template ports: - "8080:80" environment: - NGINX_HOST=example.com - NGINX_port=80 links: - database:db - distro
docker-compose
. ini file berisi beberapa arahan baru:lingkungan dan tautan . Arahan pertama menetapkan opsi tingkat waktu proses di dalam wadah.links
menciptakan jaringan ketergantungan antara wadah. Wadah nginx bergantung pada dua lainnya untuk dieksekusi. Selain itu, wadah yang sesuai akan dapat dijangkau pada nama host yang ditunjukkan oleh alias. Dalam hal ini, pingdb
dariweb
container akan mencapaidatabase
melayani. Meskipun Anda tidak memerlukanlinks
arahan untuk wadah untuk berbicara satu sama lain,links
dapat berfungsi sebagai failsafe saat memulai aplikasi docker-compose. -
Mulai Docker Compose dan periksa status container:
docker-compose up -d docker ps
Outputnya harus mirip dengan:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 55d573674e49 nginx:latest "nginx -g 'daemon ..." 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp nginx ad9e48b2b82a alpine "tail -f /dev/null" 3 minutes ago Up 3 minutes Alpine_Distro 736cf2f2239e postgres:latest "docker-entrypoint..." 3 minutes ago Up 3 minutes 0.0.0.0:5432->5432/tcp postgres_db
-
Uji nginx dengan menavigasi ke alamat IP publik Linode Anda, port
8080
di browser (misalnya192.0.2.0:8080
). Anda akan melihat halaman arahan nginx default ditampilkan.
Penyimpanan Data Persisten
Menyimpan data PostgreSQL langsung di dalam wadah tidak disarankan. Kontainer Docker dimaksudkan untuk diperlakukan sebagai sementara:kontainer aplikasi Anda dibuat dari awal saat menjalankan docker-compose up
dan dihancurkan saat menjalankan docker-compose down
. Selain itu, setiap crash atau restart yang tidak terduga pada sistem Anda akan menyebabkan data apa pun yang disimpan dalam wadah hilang.
Untuk alasan ini, penting untuk menyiapkan volume persisten pada host yang akan digunakan container database untuk menyimpan datanya.
-
Tambahkan
volumes
kedocker-compose.yml
dan editdatabase
layanan untuk merujuk ke volume:- File:buruh pelabuhan -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
version: '3' services: distro: image: alpine container_name: Alpine_Distro restart: always entrypoint: tail -f /dev/null database: image: postgres:latest container_name: postgres_db volumes: - data:/var/lib/postgresql ports: - "5432:5432" web: image: nginx:latest container_name: nginx volumes: - ./mysite.template:/etc/nginx/conf.d/mysite.template ports: - "8080:80" environment: - NGINX_HOST=example.com - NGINX_port=80 links: - database:db - distro volumes: data: external: true
-
external: true
memberitahu Docker Compose untuk menggunakan volume data eksternal yang sudah ada sebelumnya. Jika tidak ada volume bernamadata
hadir, memulai aplikasi akan menyebabkan kesalahan. Buat volumenya:docker volume create --name=data
-
Jalankan aplikasi seperti sebelumnya:
docker-compose up -d
Langkah Selanjutnya
Docker Compose adalah alat yang ampuh untuk mengatur kumpulan wadah yang dapat bekerja bersama. Hal-hal seperti aplikasi atau lingkungan pengembangan dapat menggunakan komposisi Docker. Hasilnya adalah lingkungan modular dan dapat dikonfigurasi yang dapat digunakan di mana saja.