Docker İçerisinde Supervisor Kullanarak Birden Fazla Servis Çalıştırmak
Tags: supervisor, containers, docker
Published: 2019-11-02 16:25:54

---
title: Docker İçerisinde Supervisor Kullanarak Birden Fazla Servis Çalıştırmak
published: true
tags: supervisor,containers,docker
canonical_url: 
---

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/_](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.

{% gist 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](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.

1. _$CWD/supervisord.conf_
2. _$CWD/etc/supervisord.conf_
3. _/etc/supervisord.conf_
4. _/etc/supervisor/supervisord.conf (since Supervisor 3.3.0)_
5. _../etc/supervisord.conf (Relative to the executable)_
6. _../supervisord.conf (Relative to the executable)_

{% gist 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.

{% gist 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 :)

![](https://cdn-images-1.medium.com/max/1024/1*QhgkDxTnAVJ6c7-OfVjz6Q.png)

_Referanslar_

- [_https://docs.docker.com/config/containers/multi-service\_container/_](https://docs.docker.com/config/containers/multi-service_container/)
- [_http://supervisord.org/configuration.html_](http://supervisord.org/configuration.html#inet-http-server-section-settings)
- [_https://blog.zhaw.ch/icclab/process-management-in-docker-containers/_](https://blog.zhaw.ch/icclab/process-management-in-docker-containers/)