İçeriğe geç

Docker İçerisinde Supervisor Kullanarak Birden Fazla Servis Çalıştırmak

Bazı durumlarda ufak servislerinizin farklı container içerisine dağılmadan tek bir container içerisinde çalışmasını isteyebilirsiniz.

Gerçekten bir birine sıkı sıkıya bağlı veya zorunlu olarak kullanmanız gereken durumlarda bu tarz bir yaklaşımda bulunmanızı tavsiye ediyoruz.

Docker Ne Öneriyor?

Docker container’ı içerisinde main process olarak ENTRYPOINT veya CMD ile verdiğiniz process’ler çalışmaktadır.

Genel olarak tavsiye edilen görevlerine göre bölerek her bir container içerisinde sadece bir tane servis çalıştırmaktır. 
Docker container’larının network ve volume’larını birbirine bağlayabilirsiniz.

Docker Neden Böyle Söylüyor?

Docker aslında işini düzgün yapacak bir main process olsun diyor. Bu process başlangıçta düzgün olarak çalışsın yeni bir child process başlatmak isterse kendisi başlatsın işleri bittiğinde kapatsın, container’a kapatma sinyali geldiğinde bunların hepsini muntazam bir şekilde sonlandırsın.

Daha fazla detay isterseniz buradan başlayabilirsiniz

https://docs.docker.com/config/containers/multi-service_container/

Dockerfile Oluşturuyoruz

Senaryo olarak iki farklı servisimiz olduğunu varsayalım.
Birinci servisimiz bir dotnet core API uygulaması olsun.
İkinci uygulamamız external bir kaynaktan gelen paketlenmiş bir SpringFramework API olsun.

Bu iki servisi kendi case’inize göre düşünebilirsiniz. Herhangi iki farklı process olması yeterli.

https://gist.github.com/berkayakcay/914fdaa70a8f9e323c7e6100fb121882

Dikkat ederseniz Docker imajını oluşturmak için projelerin hepsini derledik kopyaladık ama ihtiyacımız olan ENTRYPOINT yada CMD ile çalışacak komutlar yerini supervisor’a bırakıyor.

# SUPERVISORRUN 
mkdir -p /var/run/java/ /var/run/dotnet/

COPY /scripts/supervisor-kill-container.py /scripts/supervisor-kill-container.py

COPY /src/MyApplication/supervisord.conf /etc/supervisor/supervisord.conf

CMD [“supervisord”, “-c”, “/etc/supervisor/supervisord.conf”]

Supervisor Ayarlarının Yapılması

Supervisor için gerçekleştirebileceğiniz birçok ayar var. 
Öncelikle buraya dokümantasyon linkini bırakıyorum http://supervisord.org/index.html

Supervisor config dosyasının isimlendirmesini sizden supervisord.conf şeklinde yapmanızı talep ediyor. Daha sonra bu dosya ismini önceden belirli pathlerde arıyor.

$CWD/supervisord.conf
$CWD/etc/supervisord.conf
/etc/supervisord.conf
/etc/supervisor/supervisord.conf (since Supervisor 3.3.0)
../etc/supervisord.conf (Relative to the executable)
../supervisord.conf (Relative to the executable)
https://gist.github.com/berkayakcay/7ed58a642dc88ea158e83d9c8edccd29

Ayar dosyasında iki farklı process’in çalıştığını bunları çalıştırmak için gerekli olan komutu ayrıcı log’ların yazılması için bazı ayarlar koyduk.

Main Process Kapanırsa Diğer Process’lerin Kapanması

Biz istedik ki main process olarak gördüğümüz dotnet projemizin herhangi bir şekilde kapanması durumunda bir script çalışsın ve supervisor içerisinde bulunan diğer process’leride sonlandırsın.

https://gist.github.com/berkayakcay/812d541054c32e955e9058e5d5f5c5ec

Çerez

Supervisor aynı zamanda basit bir ayarla size bir HTTP server oluşturabiliyor. TCP isteklerini dinleyerek process’lerini durumunu görüp müdahale edebiliyorsunuz.

Portları docker dışarısına açmayı unutmayın 🙂


Referanslar
Kategori:Docker

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir