Her birkaç yılda bir, yazılım geliştirme endüstrisi bir paradigma değişikliğine uğrar. Bu olgulardan biri, mikro hizmet kavramına artan ilgi olarak kabul edilebilir. Mikro hizmetler en yeni teknoloji olmasa da, popülaritesi ancak son zamanlarda kelimenin tam anlamıyla hızla arttı.
Büyük monolitik hizmetlerin yerini artık bağımsız, özerk mikro hizmetler alıyor. Mikro hizmet, tek ve çok özel bir amaca hizmet eden bir uygulama olarak düşünülebilir. Örneğin ilişkisel bir DBMS, Express uygulaması, Solr hizmeti olabilir.
Bugünlerde mikro hizmetler kullanmadan yeni bir yazılım sistemi geliştirmeyi hayal etmek zor. Bu durum da bizi Docker platformuna götürüyor.
liman işçisi
platform
Docker Oluşturma
Teknoloji
Docker Compose ile çalışırken uygulama hizmetlerini yapılandırmak ve birbirleriyle etkileşimlerini düzenlemek için bir YAML dosyası kullanılır. Bu nedenle Docker Compose, çok kapsayıcılı Docker uygulamalarını tanımlamaya ve çalıştırmaya yönelik bir araçtır.
Bir ana sistemde çalışan iki konteyner
GNU Yap
Program make
, esasen programların ve kitaplıkların kaynak kodundan oluşturulmasını otomatikleştirmeye yönelik bir araçtır. Genel olarak şunu söyleyebiliriz make
Bazı girdi malzemelerini bazı çıktı biçimlerine, bazı amaçlara dönüştürmek için rastgele komutların yürütülmesini içeren herhangi bir süreç için geçerlidir. Bizim durumumuzda komutlar docker-compose
soyut hedeflere dönüştürülecek (
Programı anlatmak için make
ondan ne istediğimiz hakkında bir dosyaya ihtiyacımız var Makefile
.
В нашем Makefile
düzenli komutlar içerecek docker
и docker-compose
birçok sorunu çözmek için tasarlanmıştır. Yani bir konteynerin montajından, başlatılmasından, durdurulmasından, yeniden başlatılmasından, konteynere kullanıcı girişinin organize edilmesinden, konteyner günlükleriyle çalışmaktan ve diğer benzer sorunların çözülmesinden bahsediyoruz.
Docker Compose için Tipik Kullanım Durumları
Aşağıdaki bileşenlere sahip normal bir web uygulaması hayal edelim:
- TimescaleDB veritabanı (Postgres).
- Express.js uygulaması.
- Ping (yalnızca bir kap, özel bir şey yapmaz).
Bu uygulamanın 3 Docker kapsayıcısına ve bir dosyaya ihtiyacı olacak docker-compose
Bu kapsayıcıların yönetilmesine ilişkin talimatları içeren. Her konteynerin farklı temas noktaları olacaktır. Örneğin bir konteyner ile timescale
veritabanlarıyla çalıştıkları gibi yaklaşık olarak aynı şekilde çalışmak mümkün olacaktır. Yani aşağıdaki eylemleri gerçekleştirmenize olanak tanır:
- Postgres kabuğuna giriş yapılıyor.
- Tabloların içe ve dışa aktarımı.
- oluşturma
pg_dump
tablolar veya veritabanları.
Express.js uygulama kapsayıcısı, expressjs
, aşağıdaki yeteneklere sahip olabilir:
- Sistem günlüğünden yeni veriler sağlanması.
- Belirli komutları yürütmek için kabuğa giriş yapın.
Konteynerlerle Etkileşim
Docker Compose kullanarak konteynerler arasında iletişim kurduktan sonra sıra bu konteynerlerle iletişim kurmaya gelir. Docker Compose sisteminde bir komut var docker-compose
, destekleyici seçenek -f
, sisteme bir dosya aktarmanıza olanak tanır docker-compose.yml
.
Bu seçeneğin yeteneklerini kullanarak sistemle etkileşimi yalnızca dosyada belirtilen kaplarla sınırlandırabilirsiniz. docker-compose.yml
.
Komutları kullanırken kapsayıcılarla etkileşimlerin nasıl göründüğüne bir göz atalım docker-compose
. Eğer kabuğa giriş yapmamız gerektiğini hayal edersek psql
, o zaman karşılık gelen komutlar şöyle görünebilir:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Yürütmek için kullanılmayan aynı komut docker-compose
Ve docker
, şöyle görünebilir:
docker exec -it edp_timescale_1 psql -Upostgres
Lütfen bu gibi durumlarda komutu kullanmanın her zaman tercih edildiğini unutmayın. docker
ve komut docker-compose
, çünkü bu kapsayıcı adlarını hatırlama ihtiyacını ortadan kaldırır.
Yukarıdaki komutların her ikisi de o kadar da zor değil. Ancak formda bir "sarmalayıcı" kullanırsak Makefile
bize basit komutlar şeklinde bir arayüz verecek ve kendisi de benzer uzun komutları çağıracaksa, aynı sonuçlara şu şekilde ulaşılabilir:
make db-shell
kullanıldığı oldukça açıktır. Makefile
konteynerlerle çalışmayı çok daha kolay hale getiriyor!
Çalışma örneği
Yukarıdaki proje şemasına dayanarak aşağıdaki dosyayı oluşturacağız. 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
Docker Compose yapılandırmasını yönetmek ve tanımladığı kapsayıcılarla etkileşim kurmak için aşağıdaki dosyayı oluşturacağız. 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
Burada açıklanan komutların çoğu tüm kapsayıcılar için geçerlidir ancak bu seçenek kullanıldığında c=
bir komutun kapsamını tek bir kapsayıcıyla sınırlamanıza olanak tanır.
Sonra Makefile
hazır, şu şekilde kullanabilirsiniz:
make help
- mevcut tüm komutların bir listesinin yayınlanmasımake
.
Mevcut komutlarla ilgili yardım
make build
- bir görüntünün birleştirilmesiDockerfile
. Örneğimizde mevcut görselleri kullandıktimescale
иping
. Ama görüntüapi
Yerel olarak toplamak istiyoruz. Bu komutu yürüttükten sonra yapılacak olan tam olarak budur.
Docker konteyneri oluşturma
make start
— tüm konteynerlerin başlatılması. Yalnızca bir kapsayıcıyı başlatmak için aşağıdaki gibi bir komut kullanabilirsiniz:make start c=timescale
.
Zaman ölçeği kapsayıcısını çalıştırma
Bir ping kapsayıcısını çalıştırma
make login-timescale
— konteynerin bash oturumuna giriş yapıntimescale
.
Bash'ı zaman ölçeği kapsayıcısında çalıştırma
make db-shell
- e girişpsql
bir kaptatimescale
Veritabanında SQL sorguları yürütmek için.
Zaman ölçeklendirilmiş bir kapsayıcıda psql'yi çalıştırma
make stop
— konteynerlerin durdurulması.
Zaman ölçeği kapsayıcısını durdurma
make down
- Konteynerlerin durdurulması ve çıkarılması. Belirli bir kapsayıcıyı kaldırmak için, istediğiniz kapsayıcıyı belirterek bu komutu kullanabilirsiniz. Örneğin -make down c=timescale
veyamake down c=api
.
Tüm kapsayıcıların durdurulması ve silinmesi
sonuçlar
Docker Compose bize konteynerleri yönetmek için zengin bir komut seti sunsa da, bazen bu komutlar uzun olabilir ve hatırlanması zor olabilir.
Kullanım metodu Makefile
bir dosyadaki kapsayıcılarla hızlı ve kolay etkileşim kurmamıza yardımcı oldu docker-compose.yml
. Yani aşağıdakilerden bahsediyoruz:
- Geliştirici yalnızca burada açıklanan proje kapsayıcılarıyla etkileşime girer.
docker-compose.yml
, çalışan diğer konteynerler tarafından iş kesintiye uğramaz. - Belirli bir komutun unutulması durumunda komutu çalıştırabilirsiniz.
make help
ve mevcut komutlar hakkında yardım alın. - En son günlük girişlerini almak veya bir sistemde oturum açmak gibi eylemleri gerçekleştirmek için uzun argüman listelerini hatırlamanıza gerek yoktur. Örneğin, şöyle bir komut
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
dönüşler içinemake db-shell
. - Dosya
Makefile
Proje büyüdükçe buna esnek bir şekilde uyum sağlayabilirsiniz. Örneğin, veritabanı yedeklemesi oluşturmak veya başka herhangi bir eylemi gerçekleştirmek için komut eklemek kolaydır. - Büyük bir geliştirici ekibi aynısını kullanıyorsa
Makefile
Bu, işbirliğini kolaylaştırır ve hataları azaltır.
PS В нашем
Sevgili okuyucular! Docker Compose'u nasıl otomatikleştirirsiniz?
Kaynak: habr.com