Mengikuti Docker + Laravel =? Saya ingin berbicara tentang cara yang agak tidak biasa untuk menggunakan utilitas pembuat docker.
Sebagai permulaan, bagi mereka yang tidak tahu mengapa komposisi buruh pelabuhan diperlukan. Ini adalah utilitas yang memungkinkan Anda untuk menjalankan pada host terpisah satu set layanan terkait yang dikemas dalam wadah buruh pelabuhan. Versi awal ditulis dengan python dan dapat diinstal dengan dua cara:
- melalui manajer paket sistem operasi (
apt install docker-compose
untuk Ubuntu dan yum install docker-compose.noarch
for Centos) - via python dependency manager (
pip install docker-compose
)
Masalah dengan metode pertama adalah bahwa biasanya dalam repositori sistem operasi docker-compose versi lama. Ini merupakan masalah jika Anda perlu menggunakan versi terbaru dari docker daemon atau menggunakan fitur-fitur khusus untuk versi spesifik dari format file docker-compose.yaml (matriks fitur yang didukung oleh versi format dan versi utilitas docker-compose dapat ditemukan di situs web buruh pelabuhan resmi).
Sekarang pengembang buruh pelabuhan menulis ulang utilitas saat bepergian , membuat kesalahan, sebenarnya mengemas skrip python dengan lingkungan ke dalam satu paket dan menyediakannya sebagai file biner, yang memungkinkan Anda untuk menginstalnya dengan cara berikut (ini adalah metode yang direkomendasikan saat ini):
Kami melihat versi terbaru di https://github.com/docker/compose/releases dan mengunduhnya
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
mengatur hak untuk menjalankan aplikasi
$ sudo chmod +x /usr/local/bin/docker-compose
Selain itu, Anda dapat mengatur penyelesaian otomatis untuk perintah penerjemah bash dan zsh
periksa instalasi
$ docker-compose --version docker-compose version 1.22.0, build 1719ceb
Saya percaya bahwa satu biner sangat keren, karena kita tidak perlu menarik dependensi python. Ya, dan secara umum - mungkin lingkungan python kita benar-benar rusak pada mesin target, yang ingin kita konfigurasi !!!

Contoh kebingungan di lingkungan python
Tetapi masih ada jalan ke-4, yang ingin saya bicarakan. Ini adalah kemampuan untuk menjalankan docker-compose melalui docker. Memang, sudah ada gambar resmi yang dikumpulkan di Docker Hub ( https://hub.docker.com/r/docker/compose/ ). Mengapa mereka dibutuhkan?
- jika kita ingin bekerja dengan beberapa versi docker-compose secara bersamaan (walaupun biasanya versi stabil terakhir sudah cukup)
- jika kami tidak memiliki python atau tidak ingin menggunakannya (misalnya, kami memiliki distribusi CoreOS Container Linux yang ringan)
- digunakan dalam pipa CI / CD.
Ayo kita coba!
Seperti yang biasa kami lakukan meluncurkan kontainer:
$ docker-compose up -d
Melalui utilitas yang dikemas dalam wadah buruh pelabuhan:
$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v "$PWD:/rootfs/$PWD" -w="/rootfs/$PWD" docker/compose:1.13.0 up -d
Terlalu bertele-tele, ya? Otak dapat rusak untuk mengingat semua parameter ini. Karena itu, kami akan mencoba membuat hidup kami lebih mudah dan menulis pembungkus dalam bahasa shell. Tapi pertama-tama, mari kita lihat parameter yang dilewati:
--rm
- menghapus wadah sementara setelah berhenti, mis. kami tidak meninggalkan sampah di sistem-v /var/run/docker.sock:/var/run/docker.sock
- tanpa ini, komposisi buruh pelabuhan tidak akan dapat terhubung ke daemon buruh pelabuhan pada host-v "$PWD:/rootfs/$PWD" -w="/rootfs/$PWD"
- memungkinkan Anda untuk meneruskan direktori saat ini di dalam wadah sehingga utilitas melihat file pembuat docker-compose
Kami masih kekurangan kemampuan untuk menginterpolasi nilai-nilai dalam file docker-compose. Ini adalah proses dimana utilitas menggantikan variabel lingkungan dalam file YAML. Misalnya, dalam sebuah fragmen
version: "2.1" services: pg: image: postgres:9.6 environment: POSTGRES_USER: ${POSTGRES_DB_USER} POSTGRES_PASSWORD: ${POSTGRES_DB_PASSWORD}
variabel POSTGRES_DB_USER
dan POSTGRES_DB_PASSWORD
akan dibaca dari lingkungan. Hal ini memungkinkan untuk mem-tempel file-file penyusun buruh pelabuhan dengan tingkat kenyamanan tertentu. Yaitu kita perlu menangkap lingkungan dari mesin host dan memindahkannya ke dalam wadah.
Mari kita selesaikan masalahnya dengan menulis skrip bash.
#!/bin/sh # TMPFILE=$(mktemp) # env > "${TMPFILE}" # VERSION="1.13.0" # docker-compose docker run \ --rm \ -e PWD="$PWD" \ --env-file "${TMPFILE}" \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "$PWD:/rootfs/$PWD" \ -w="/rootfs/$PWD" \ docker/compose:"${VERSION}" \ "$@" # rm "{$TMPFILE}"
Baris tambahan muncul:
-e PWD="$PWD"
- untuk berjaga-jaga, teruskan direktori saat ini--env-file "${TMPFILE}"
- di sini semua variabel lingkungan lainnya ditransfer dari mesin hostdocker/compose:"${VERSION}"
- nama gambar, ambil versi dari variabel"$@"
- konstruksi ini memungkinkan Anda untuk menggunakan skrip seolah-olah itu adalah utilitas pembuat docker, mis. secara transparan meneruskan argumennya ke wadah buruh pelabuhan.
Kita dapat menyimpan skrip, misalnya, di /usr/local/bin/docker-compose
, atur flag eXecute di atasnya dan gunakan. Skrip di atas tidak berpura-pura 100% bebas dari kesalahan atau kekurangan dan lebih merupakan ilustrasi dari metode ini.
Kami sendiri menggunakan jalur pipa CI / CD dengan cara ini. Ini bahkan menghemat lalu lintas sampai batas tertentu. Gambar target buruh pelabuhan diambil dari cache lokal.