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.
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 https://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)
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.
Ç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
Top comments (0)