Setiap beberapa tahun, industri pengembangan perangkat lunak mengalami perubahan paradigma. Salah satu fenomena ini dapat dilihat dari meningkatnya minat terhadap konsep layanan mikro. Meskipun layanan mikro bukanlah teknologi terbaru, popularitasnya baru saja meroket akhir-akhir ini.
Layanan monolitik besar kini digantikan oleh layanan mikro yang independen dan otonom. Layanan mikro dapat dianggap sebagai aplikasi yang melayani satu tujuan yang sangat spesifik. Misalnya, DBMS relasional, aplikasi Express, layanan Solr.
Saat ini, sulit membayangkan mengembangkan sistem perangkat lunak baru tanpa menggunakan layanan mikro. Dan situasi ini, pada gilirannya, membawa kita ke platform Docker.
Buruh pelabuhan
Panggung
Docker Tulis
Π’Π΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡ
Saat bekerja dengan Docker Compose, file YAML digunakan untuk mengonfigurasi layanan aplikasi dan mengatur interaksinya satu sama lain. Oleh karena itu, Docker Compose adalah alat untuk mendeskripsikan dan menjalankan aplikasi Docker multi-kontainer.
Dua kontainer berjalan pada sistem host
GNU Membuat
Program make
, pada dasarnya adalah alat untuk mengotomatiskan pembuatan program dan perpustakaan dari kode sumber. Secara umum, kita dapat mengatakan demikian make
berlaku untuk setiap proses yang melibatkan pelaksanaan perintah sewenang-wenang untuk mengubah beberapa bahan masukan menjadi beberapa bentuk keluaran, ke beberapa tujuan. Dalam kasus kami, perintahnya docker-compose
akan diubah menjadi tujuan abstrak (
Untuk memberitahu programnya make
tentang apa yang kita inginkan darinya, kita memerlukan file Makefile
.
Di kami Makefile
akan berisi perintah reguler docker
ΠΈ docker-compose
, yang dirancang untuk memecahkan banyak masalah. Yaitu, kita berbicara tentang merakit sebuah wadah, tentang memulainya, menghentikannya, memulai kembali, tentang mengatur login pengguna ke wadah, tentang bekerja dengan log wadah, dan tentang memecahkan masalah serupa lainnya.
Kasus Penggunaan Umum untuk Docker Compose
Bayangkan sebuah aplikasi web biasa yang memiliki komponen berikut:
- Basis data TimescaleDB (Postgres).
- Aplikasi Express.js.
- Ping (hanya sebuah wadah, tidak melakukan sesuatu yang istimewa).
Aplikasi ini membutuhkan 3 container Docker dan sebuah file docker-compose
, yang berisi petunjuk untuk mengelola kontainer ini. Setiap kontainer akan memiliki titik kontak yang berbeda. Misalnya dengan wadah timescale
akan dimungkinkan untuk bekerja dengan cara yang kira-kira sama seperti mereka bekerja dengan database. Yaitu, ini memungkinkan Anda untuk melakukan tindakan berikut:
- Masuk ke shell Postgres.
- Impor dan ekspor tabel.
- penciptaan
pg_dump
tabel atau database.
wadah aplikasi Express.js, expressjs
, mungkin memiliki kemampuan berikut:
- Memberikan data baru dari log sistem.
- Masuk ke shell untuk menjalankan perintah tertentu.
Berinteraksi dengan Kontainer
Setelah kita mengatur komunikasi antar container menggunakan Docker Compose, sekarang saatnya berkomunikasi dengan container tersebut. Di dalam sistem Docker Compose ada perintah docker-compose
, opsi pendukung -f
, yang memungkinkan Anda mentransfer file ke sistem docker-compose.yml
.
Dengan menggunakan kemampuan opsi ini, Anda dapat membatasi interaksi dengan sistem hanya pada container yang disebutkan dalam file docker-compose.yml
.
Mari kita lihat seperti apa interaksi dengan container saat menggunakan perintah docker-compose
. Jika kita membayangkan bahwa kita perlu login ke shell psql
, maka perintah terkait akan terlihat seperti ini:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Perintah yang sama yang tidak digunakan untuk mengeksekusi docker-compose
Dan docker
, mungkin terlihat seperti ini:
docker exec -it edp_timescale_1 psql -Upostgres
Harap dicatat bahwa dalam kasus seperti itu selalu lebih baik menggunakan perintah docker
, dan perintah docker-compose
, karena ini menghilangkan kebutuhan untuk mengingat nama kontainer.
Kedua perintah di atas tidak terlalu sulit. Namun jika kita menggunakan βpembungkusβ pada formulir tersebut Makefile
, yang akan memberi kita antarmuka dalam bentuk perintah sederhana dan akan memanggil perintah panjang serupa, maka hasil yang sama dapat dicapai seperti ini:
make db-shell
Sangat jelas kegunaannya Makefile
membuat bekerja dengan kontainer menjadi lebih mudah!
Contoh kerja
Berdasarkan diagram proyek di atas, kami akan membuat file 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 mengelola konfigurasi Docker Compose dan berinteraksi dengan container yang dijelaskannya, kami akan membuat file 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
Sebagian besar perintah yang dijelaskan di sini berlaku untuk semua kontainer, tetapi menggunakan opsi c=
memungkinkan Anda membatasi cakupan perintah ke satu wadah.
Setelah Makefile
siap, Anda dapat menggunakannya seperti ini:
make help
β mengeluarkan daftar semua perintah yang tersedia untukmake
.
Bantuan tentang perintah yang tersedia
make build
- merakit gambar dariDockerfile
. Dalam contoh kami, kami menggunakan gambar yang sudah adatimescale
ΠΈping
. Tapi gambarnyaapi
kami ingin mengumpulkan secara lokal. Inilah yang akan dilakukan setelah menjalankan perintah ini.
Membangun wadah Docker
make start
β meluncurkan semua kontainer. Untuk meluncurkan satu container saja, Anda dapat menggunakan perintah sepertimake start c=timescale
.
Menjalankan wadah skala waktu
Menjalankan wadah ping
make login-timescale
β masuk ke sesi bash wadahtimescale
.
Menjalankan bash dalam wadah skala waktu
make db-shell
- pintu masuk kepsql
dalam wadahtimescale
untuk mengeksekusi query SQL terhadap database.
Menjalankan psql dalam wadah timescaledb
make stop
β menghentikan kontainer.
Menghentikan kontainer skala waktu
make down
β menghentikan dan mengeluarkan kontainer. Untuk menghapus kontainer tertentu, Anda dapat menggunakan perintah ini untuk menentukan kontainer yang diinginkan. Misalnya -make down c=timescale
ΠΈΠ»ΠΈmake down c=api
.
Menghentikan dan menghapus semua container
Hasil
Meskipun Docker Compose memberi kita beragam perintah untuk mengelola container, terkadang perintah ini menjadi panjang dan sulit untuk diingat.
Metode penggunaan Makefile
membantu kami membangun interaksi yang cepat dan mudah dengan container dari sebuah file docker-compose.yml
. Yaitu, kita berbicara tentang hal berikut:
- Pengembang hanya berinteraksi dengan wadah proyek yang dijelaskan dalam
docker-compose.yml
, pekerjaan tidak terganggu oleh container lain yang sedang berjalan. - Jika ada perintah tertentu yang terlupakan, Anda dapat menjalankan perintah tersebut
make help
dan dapatkan bantuan tentang perintah yang tersedia. - Anda tidak perlu mengingat daftar argumen yang panjang untuk melakukan tindakan seperti mendapatkan entri log terbaru atau masuk ke sistem. Misalnya perintah seperti
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
berubah menjadimake db-shell
. - berkas
Makefile
Anda dapat secara fleksibel beradaptasi seiring berkembangnya proyek. Misalnya, mudah untuk menambahkan perintah untuk membuat cadangan database atau melakukan tindakan lainnya. - Jika tim pengembang besar menggunakan hal yang sama
Makefile
, ini menyederhanakan kolaborasi dan mengurangi kesalahan.
PS Di kami
Pembaca yang terhormat Bagaimana Anda mengotomatiskan Docker Compose?
Sumber: www.habr.com