Docker Compose memungkinkan Anda mengelola beberapa container Docker dan sumber daya terkaitnya seperti volume dan jaringan. Anda menulis file YAML deklaratif yang digunakan Compose untuk membuat tumpukan penampung Anda.
docker-compose.yml
Your Anda file dapat menjadi berulang saat Anda bekerja dengan tumpukan yang kompleks. Layanan mungkin berbagi opsi konfigurasi, menyebabkan Anda menduplikasi bagian file Anda. Pembaruan selanjutnya dapat menyebabkan kesalahan jika Anda lupa memperbarui setiap bagian dari suatu bagian.
Karena file Compose adalah file YAML biasa, Anda dapat memanfaatkan fitur YAML bawaan untuk memodulasi definisi tumpukan Anda. Jangkar, alias, dan ekstensi memungkinkan Anda mengabstraksi bagian YAML menjadi blok yang dapat digunakan kembali. Anda dapat menambahkan referensi ke bagian di setiap tempat yang dibutuhkan.
Apa Itu Jangkar?
Jangkar YAML adalah fitur yang memungkinkan Anda mengidentifikasi item dan kemudian merujuknya ke tempat lain di file Anda. Jangkar dibuat menggunakan &
tanda. Tanda tersebut diikuti dengan nama alias. Anda dapat menggunakan alias ini nanti untuk mereferensikan nilai setelah jangkar.
Berikut cara menggunakan anchor untuk menghindari pengulangan kebijakan restart container:
services: httpd: image: httpd:latest restart: &restartpolicy unless-stopped mysql: image: mysql:latest restart: *restartpolicy
Jangkar direferensikan menggunakan *
karakter dan aliasnya. Anda harus memastikan tidak ada spasi di antara &
/*
karakter dan nama alias berikut.
Contoh ini menunjukkan bagaimana nilai satu baris dapat digunakan kembali dengan jangkar. Mengubah kebijakan mulai ulang tumpukan sekarang dapat dilakukan di satu tempat, tanpa mengedit layanan satu per satu.
Jangkar Multi-Baris
Jangkar dapat memiliki nilai multi-baris. Anda membuatnya menggunakan sintaks yang sama sebagai jangkar satu baris. Ini berguna saat Anda perlu memberikan serangkaian detail konfigurasi ke beberapa layanan.
services: first: image: my-image:latest environment: &env - CONFIG_KEY - EXAMPLE_KEY - DEMO_VAR second: image: another-image:latest environment: *env
second
service sekarang akan menarik variabel lingkungan yang sama dengan first
. Kami tidak perlu mengulang daftar variabel lingkungan, membuatnya jauh lebih mudah dipelihara di masa mendatang.
Memperluas Nilai Jangkar
Contoh lingkungan di atas mengambil nilai jangkar dan menggunakannya apa adanya. Anda akan sering ingin memperpanjang jangkar untuk menambahkan nilai tambahan. Anda dapat melakukannya dengan sintaks alternatif.
Ubah second
layanan sebagai berikut:
services: second: image: another-image:latest environment: <<: *env - AN_EXTRA_KEY - SECOND_SPECIFIC_KEY
Layanan sekarang menarik konfigurasi lingkungan dasar dari env
jangkar. Kunci tambahan kemudian ditambahkan ke daftar lingkungan. Anda juga dapat mengganti kunci yang ada yang ditentukan oleh jangkar.
Menggunakan Bidang Ekstensi
Pendekatan lain untuk modularisasi adalah bidang ekstensi. Ini adalah fragmen YAML tingkat atas khusus yang akan diabaikan oleh Docker.
Docker biasanya mencoba menginterpretasikan node apa pun di root file Compose. Pengurai akan mengabaikan bidang ekstensi yang diawali dengan x-
. Anda dapat menggunakan bidang ini untuk merangkum konfigurasi bersama untuk referensi nanti. Gabungkan bidang ekstensi dengan jangkar ke bagian abstrak dari definisi layanan Anda.
x-env: &env environment: - CONFIG_KEY - EXAMPLE_KEY services: first: <<: *env image: my-image:latest second: <<: *env image: another-image:latest
File Compose ini merupakan penyempurnaan lebih lanjut dari contoh yang ditunjukkan di atas. Variabel lingkungan tidak lagi menjadi milik salah satu layanan. Mereka telah diangkat sepenuhnya, ke dalam x-env
bidang ekstensi.
Ini mendefinisikan node baru yang berisi environment
bidang. Jangkar YAML digunakan (&env
) sehingga kedua layanan dapat mereferensikan nilai bidang ekstensi.
Komposabilitas
Memanfaatkan fitur-fitur ini memungkinkan Anda memecah file Compose menjadi potongan-potongan mandiri. Ini membantu Anda menghindari definisi layanan yang terlalu berulang. Apa pun yang umum untuk lebih dari satu layanan harus diangkat ke bidang ekstensi.
Selain membantu pemeliharaan, praktik ini mengomunikasikan niat Anda kepada kolaborator lain. Jelas bahwa setiap bidang ekstensi tingkat atas berisi bidang umum. Mereka tidak terikat pada layanan tertentu dan dapat digunakan kembali secara bebas.
Jangkar dan bidang ekstensi memungkinkan Anda menulis definisi layanan Anda dari blok YAML yang dapat digunakan kembali. Dengan menjaga agar setiap bidang tetap kecil, layanan Anda dapat mencampur dan mencocokkan bagian konfigurasi dari jangkar yang tersedia. Memelihara file Compose Anda seharusnya tidak terlalu merepotkan.
Pendekatan Lain untuk Modularitas
Selain jangkar dan ekstensi, jangan lupa Anda selalu dapat membagi definisi Tulis Anda menjadi beberapa file Tulis. Ini mungkin diperlukan jika Anda memiliki lebih dari beberapa layanan individual.
Menggunakan beberapa file Tulis memungkinkan Anda mengalokasikan setiap layanan filenya sendiri. Anda juga dapat membuat file override, di mana nilai node diganti atau diperpanjang. Compose akan menggabungkan semua file menjadi satu untuk membuat konfigurasi runtime akhir.
service.yml
services: service: image: my-image:latest
service-dev.yml
services: service: environment: - DEV_MODE=true
Dalam contoh ini, menerapkan kedua file Compose akan menghasilkan satu layanan, my-image:latest
, dengan DEV_MODE
himpunan variabel lingkungan. Untuk menggunakan beberapa file dengan Compose CLI, teruskan -f
bendera:
docker-compose -f service.yml -f service-dev.yml up -d
File digabungkan dalam urutan yang ditentukan.
Ringkasan
File Docker Compose bisa menjadi berat dan berulang. Jika Anda menghabiskan waktu untuk menyalin nilai, pertimbangkan untuk mengabstraksikan bagian layanan Anda ke dalam blok YAML khusus.
Fitur seperti jangkar dan ekstensi membantu pemeliharaan dan membuat pengalaman penulisan lebih mudah. Tidak semua file Compose akan mendapat manfaat – beberapa layanan mungkin memiliki sedikit kesamaan satu sama lain – jadi nilai tumpukan spesifik Anda sebelum memulai.