Setiap beberapa tahun, industri pembangunan perisian mengalami anjakan paradigma. Salah satu daripada fenomena ini boleh diiktiraf sebagai minat yang semakin meningkat dalam konsep perkhidmatan mikro. Walaupun perkhidmatan mikro bukanlah teknologi terbaharu, baru-baru ini popularitinya benar-benar meroket.
Perkhidmatan monolitik yang besar kini digantikan oleh perkhidmatan mikro yang bebas dan autonomi. Perkhidmatan mikro boleh dianggap sebagai aplikasi yang berfungsi untuk tujuan tunggal dan sangat khusus. Sebagai contoh, ia boleh menjadi DBMS hubungan, aplikasi Express, perkhidmatan Solr.
Hari ini, sukar untuk membayangkan membangunkan sistem perisian baharu tanpa menggunakan perkhidmatan mikro. Dan keadaan ini, seterusnya, membawa kita ke platform Docker.
buruh pelabuhan
Pelantar
Docker Compose
Π’Π΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡ
Apabila bekerja dengan Docker Compose, fail YAML digunakan untuk mengkonfigurasi perkhidmatan aplikasi dan mengatur interaksi mereka antara satu sama lain. Oleh itu Docker Compose ialah alat untuk menerangkan dan menjalankan aplikasi Docker berbilang bekas.
Dua bekas berjalan pada sistem hos
GNU Buat
Program make
, pada asasnya adalah alat untuk mengautomasikan pembinaan program dan perpustakaan daripada kod sumber. Secara umum, kita boleh mengatakan bahawa make
terpakai kepada sebarang proses yang melibatkan pelaksanaan arahan sewenang-wenangnya untuk mengubah beberapa bahan input kepada beberapa bentuk output, kepada beberapa matlamat. Dalam kes kami, arahan docker-compose
akan diubah menjadi matlamat abstrak (
Untuk memberitahu program make
tentang apa yang kita mahu daripadanya, kita memerlukan fail Makefile
.
Dalam kami Makefile
akan mengandungi arahan biasa docker
ΠΈ docker-compose
, yang direka untuk menyelesaikan banyak masalah. Iaitu, kita bercakap tentang memasang bekas, tentang memulakannya, menghentikannya, memulakannya semula, tentang mengatur log masuk pengguna ke bekas, tentang bekerja dengan log kontena, dan tentang menyelesaikan masalah lain yang serupa.
Kes Penggunaan Biasa untuk Docker Compose
Mari bayangkan aplikasi web biasa yang mempunyai komponen berikut:
- Pangkalan data TimescaleDB (Postgres).
- Aplikasi Express.js.
- Ping (hanya bekas, tidak melakukan sesuatu yang istimewa).
Aplikasi ini memerlukan 3 bekas Docker dan satu fail docker-compose
, yang mengandungi arahan untuk menguruskan bekas ini. Setiap bekas akan mempunyai titik sentuh yang berbeza. Contohnya, dengan bekas timescale
ia mungkin berfungsi dengan cara yang hampir sama seperti ia berfungsi dengan pangkalan data. Iaitu, ia membolehkan anda melakukan tindakan berikut:
- Log masuk ke dalam shell Postgres.
- Import dan eksport jadual.
- penciptaan
pg_dump
jadual atau pangkalan data.
bekas aplikasi Express.js, expressjs
, mungkin mempunyai keupayaan berikut:
- Menyediakan data baharu daripada log sistem.
- Log masuk ke shell untuk melaksanakan arahan tertentu.
Berinteraksi dengan Bekas
Setelah kami menyediakan komunikasi antara bekas menggunakan Docker Compose, tiba masanya untuk berkomunikasi dengan bekas tersebut. Dalam sistem Docker Compose terdapat arahan docker-compose
, pilihan sokongan -f
, yang membolehkan anda memindahkan fail ke sistem docker-compose.yml
.
Menggunakan keupayaan pilihan ini, anda boleh mengehadkan interaksi dengan sistem hanya kepada bekas yang disebut dalam fail docker-compose.yml
.
Mari kita lihat bagaimana interaksi dengan bekas apabila menggunakan arahan docker-compose
. Jika kita membayangkan bahawa kita perlu log masuk ke dalam shell psql
, maka arahan yang sepadan mungkin kelihatan seperti ini:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Perintah yang sama yang tidak digunakan untuk melaksanakan docker-compose
Dan docker
, mungkin kelihatan seperti ini:
docker exec -it edp_timescale_1 psql -Upostgres
Sila ambil perhatian bahawa dalam kes sedemikian adalah lebih baik untuk menggunakan arahan docker
, dan perintah docker-compose
, kerana ini menghapuskan keperluan untuk mengingati nama bekas.
Kedua-dua arahan di atas tidak begitu sukar. Tetapi jika kita menggunakan "pembungkus" dalam bentuk Makefile
, yang akan memberi kita antara muka dalam bentuk arahan mudah dan dengan sendirinya akan memanggil arahan panjang yang serupa, maka hasil yang sama boleh dicapai seperti ini:
make db-shell
Ia agak jelas bahawa penggunaan Makefile
menjadikan kerja dengan bekas lebih mudah!
Contoh kerja
Berdasarkan rajah projek di atas, kami akan mencipta fail berikut docker-compose.yml
:
version: '3.3'
services:
api:
build: .
image: mywebimage:0.0.1
ports:
- 8080:8080
volumes:
- /app/node_modules/
depends_on:
- timescale
command: npm run dev
networks:
- webappnetwork
timescale:
image: timescale/timescaledb-postgis:latest-pg11
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
command: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]
volumes:
- ./create_schema.sql:/docker-entrypoint-initdb.d/create_schema.sql
networks:
- webappnetwork
ping:
image: willfarrell/ping
environment:
HOSTNAME: "localhost"
TIMEOUT: 300
networks:
webappnetwork:
driver: bridge
Untuk mengurus konfigurasi Docker Compose dan berinteraksi dengan bekas yang diterangkannya, kami akan mencipta fail berikut Makefile
:
THIS_FILE := $(lastword $(MAKEFILE_LIST))
.PHONY: help build up start down destroy stop restart logs logs-api ps login-timescale login-api db-shell
help:
make -pRrq -f $(THIS_FILE) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
build:
docker-compose -f docker-compose.yml build $(c)
up:
docker-compose -f docker-compose.yml up -d $(c)
start:
docker-compose -f docker-compose.yml start $(c)
down:
docker-compose -f docker-compose.yml down $(c)
destroy:
docker-compose -f docker-compose.yml down -v $(c)
stop:
docker-compose -f docker-compose.yml stop $(c)
restart:
docker-compose -f docker-compose.yml stop $(c)
docker-compose -f docker-compose.yml up -d $(c)
logs:
docker-compose -f docker-compose.yml logs --tail=100 -f $(c)
logs-api:
docker-compose -f docker-compose.yml logs --tail=100 -f api
ps:
docker-compose -f docker-compose.yml ps
login-timescale:
docker-compose -f docker-compose.yml exec timescale /bin/bash
login-api:
docker-compose -f docker-compose.yml exec api /bin/bash
db-shell:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Kebanyakan arahan yang diterangkan di sini digunakan untuk semua bekas, tetapi menggunakan pilihan c=
membolehkan anda mengehadkan skop arahan kepada satu bekas.
Selepas Makefile
siap, anda boleh menggunakannya seperti ini:
make help
β mengeluarkan senarai semua arahan yang tersedia untukmake
.
Bantuan pada arahan yang tersedia
make build
- memasang imej daripadaDockerfile
. Dalam contoh kami, kami menggunakan imej sedia adatimescale
ΠΈping
. Tetapi imejapi
kami ingin mengumpul secara tempatan. Inilah yang akan dilakukan selepas melaksanakan arahan ini.
Membina bekas Docker
make start
β melancarkan semua bekas. Untuk melancarkan hanya satu bekas, anda boleh menggunakan arahan sepertimake start c=timescale
.
Menjalankan bekas skala masa
Menjalankan bekas ping
make login-timescale
β log masuk ke sesi bash bekastimescale
.
Menjalankan bash dalam bekas skala masa
make db-shell
- pintu masuk kepsql
dalam bekastimescale
untuk melaksanakan pertanyaan SQL terhadap pangkalan data.
Menjalankan psql dalam bekas timescaledb
make stop
- memberhentikan bekas.
Menghentikan bekas skala masa
make down
β memberhentikan dan mengeluarkan bekas. Untuk mengalih keluar bekas tertentu, anda boleh menggunakan arahan ini menentukan bekas yang dikehendaki. Sebagai contoh -make down c=timescale
ataumake down c=api
.
Menghentikan dan memadam semua bekas
Keputusan
Walaupun Docker Compose memberi kami set perintah yang kaya untuk mengurus bekas, kadangkala arahan ini boleh menjadi panjang dan sukar untuk diingati.
Kaedah penggunaan Makefile
membantu kami mewujudkan interaksi yang cepat dan mudah dengan bekas daripada fail docker-compose.yml
. Iaitu, kita bercakap tentang perkara berikut:
- Pembangun berinteraksi hanya dengan bekas projek yang diterangkan dalam
docker-compose.yml
, kerja tidak diganggu oleh bekas lain yang sedang berjalan. - Sekiranya arahan tertentu terlupa, anda boleh melaksanakan arahan itu
make help
dan dapatkan bantuan pada arahan yang tersedia. - Anda tidak perlu mengingati senarai panjang argumen untuk melakukan tindakan seperti mendapatkan entri log terkini atau log masuk ke dalam sistem. Sebagai contoh, arahan seperti
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
bertukar menjadimake db-shell
. - fail
Makefile
Anda boleh menyesuaikannya secara fleksibel apabila projek itu berkembang. Sebagai contoh, adalah mudah untuk menambah arahan untuk membuat sandaran pangkalan data atau melakukan sebarang tindakan lain. - Jika sekumpulan besar pembangun menggunakan yang sama
Makefile
, ini menyelaraskan kerjasama dan mengurangkan ralat.
PS Dalam kami
Pembaca yang dihormati! Bagaimanakah anda mengautomasikan Docker Compose?
Sumber: www.habr.com