Docker Serisi — Docker Compose Yaratma

Ahmet Cokgungordu
4 min readJan 20, 2019

Önceki yazımda Dockerfile kullanarak kendi Docker Image’ınızı oluşturmanız için gerekli olan talimatlara bakmıştık. Artık bir adım daha atmanın vakti geldi. Docker’ın gücü, sadece basit Container’lar yaratma ve çalıştırma kabiliyetinden gelmiyor. Bence Docker’ın gücü, biz dizi farklı Container’ları kolay bir şekilde başlatma, düzenleme ve yönetme kabiliyetinden geliyor. Bunu yapmak için ise Docker Compose kullanacağız.

Docker Compose hakkında bir fikir edinebilmek için, Docker’ı bir orkestra ile karşılaştıralım. Bir hesaplama senfonisi yapmaya çalışıyor olalım. Bu hesaplama için herkesin rolünü doğru yapmasına ihtiyacımız vardır ve orkestrada herkes uyumlu çalışmalıdır. Docker Container’larda farklı müzisyenler gibidir ve Dockerfile’lar ise her müzisyene ne yapması gerektiğini söyleyen notalar gibidir. Bu metaforda hala herkesi organize etmek için bir şefe ihtiyacımız var. Docker Compose, herkesin aynı sayfada olmasını, aynı ritmi tutmasını sağlayan orkestranın şefi gibidir. Container Orkestrasyon, konteynerleştirme alanında kullanılan ortak bir terimdir ve Docker Compose, tüm Container orkestratörlerinin en basitidir.

Artık Başlayabiliriz!

Docker Compose’un nasıl çalışacağını bilmesi için bir klasor yaratıp içerisine aşağıdaki gibi bir docker-compose.yml dosyası oluşturuyoruz.

version: '2'

services:
nginx-compose-project-1:
image: nginx:latest
ports:
- "8080:80"
nginx-compose-project-2:
image: nginx:latest
ports:
- "8081:80"

Yukarıdaki yml dosyasında “version: ‘2’ ” verilmesinin nedeni, formatın 1.6 ile gelen yeni versiyonda olduğunu belirtmektir.

Bir docker-compose.yml dosyası, Docker Compose için Docker Image’leri oluşturur. Bu docker-compose.yml dosyası, Docker Container’larının başlatılması için gerekli tüm talimatları, Container’ın nasıl başlatılması gerektiğine ait detayları ve Docker Compose tarafından başlatılan Container’lar arasındaki ilişkiyi içermektedir.

docker-compose.yml dosyası formatının en önemli kısmı “services:” satırı altında gördüğünüz servislerin tanımıdır. Buradaki her şey, başlamasını istediğimiz Docker Container’larını tasarladığımız yerdir. Burada “nginx-compose-project-1” ve “nginx-compose-project-2” adında iki Container başlatmasını söylüyoruz. Her iki servis altında, Image’ları, Port’ları, Volume’ları ve Environment Variables değişkenlerini tanımlayabilirsiniz. Genellikle bu parametreler bir Docker Image’ı başlatırken gördüğümüz parametrelerdir. Docker Compose’un en güzel yanı, her şeyi başlatmak ve tüm Container’larınızı doğru şekilde düzenlemek için birkaç farklı Docker komutu çalıştırmak yerine, istediğiniz her şeyi tek bir yerde belirtmenizdir.

Bir Docker Compose yml dosyası oluşturmak için daha fazla bilgi almak isterseniz buradan erişebilirsiniz.

Özetle Docker Compose, kullanımı çok kolay ve kapsamlı bir Docker uygulaması çalıştırmak için kullanışlı bir araçtır.

Docker Compose Çalıştırmak

Komut satırından docker-compose.yml dosyasının bulunduğu pathe gidiyoruz ve aşağıdaki komutu çalıştırıyoruz.

docker-compose up

Docker Compose, Container’ları bizim için adlandırılmış ve izole edilmiş bir ağ içinde koşturacaktır. Bu ağda çalışan Container’lara yalnızca ağ üzerinden veya bağlantı noktalarından eşleştirilen İşletim Sistemi üzerindeki çalışan diğer Container’lar erişebilir. Bunu komutu çalıştırdığımızda ilk satırda göreceksiniz.

Creating network "nginx-compose-project_default" with the default driver
Creating nginx-compose-project_nginx-compose-project-2_1 ... done
Creating nginx-compose-project_nginx-compose-project-1_1 ... done
Attaching to nginx-compose-project_nginx-compose-project-1_1, nginx-compose-project_nginx-compose-project-2_1

Burada tek bir Docker Compose komutu çalıştırarak iki Container yaratmış olduk. Bu Container’lara tarayıcı üzerinden 8080 ve 8081 portlarından erişebilirsiniz.

Yeni bir terminal açıp “docker ps” komutunu çalıştırdığımızda aşağıdaki gibi iki Container’ın ayakta olduğunu göreceksiniz.

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
4c5104b1b16d nginx:latest "nginx -g 'daemon of…" 55 seconds ago Up 52 seconds 0.0.0.0:8080->80/tcp nginx-compose-project_nginx-compose-project-1_1
3c722827b97a nginx:latest "nginx -g 'daemon of…" 55 seconds ago Up 52 seconds 0.0.0.0:8081->80/tcp nginx-compose-project_nginx-compose-project-2_1

“docker-compose up” komutunu çalıştırdığımız konsolda çıkış yapmak için Ctrl+C kombinasyonunu kullandığımızda, diğer konsoldan “docker ps” komutunu çalıştırdığımızda listenin boş olduğunu göreceğiz.

“docker-compose up -d” komutu ile çalıştırmış olsaydık, Docker Compose daemon modda çalıştırılacaktı.

Docker Compose çalışırken, çalışan Docker Compose’ları görmek için docker-compose.yml dosyasının olduğu path üzerinde aşağıdaki komutla çalıştırabilirsiniz.

docker-compose ps

Bunun sonucunda aşağıdaki gibi bir çıktı göreceksiniz.

Name                               Command          State          Ports
-----------------------------------------------------------------------------------------------------
nginx-compose-project_nginx-compose-project-1_1 nginx -g daemon off; Up 0.0.0.0:8080->80/tcp
nginx-compose-project_nginx-compose-project-2_1 nginx -g daemon off; Up 0.0.0.0:8081->80/tcp

Aşağıdaki komut ile ise Docker Compose loglarına erişebilirsiniz.

docker-compose logs

Daemon modda çalışan Container’ları sonlandırmak için ise, Docker Compose’u tetiklediğimiz docker-compose.yml dosyasının bulunduğu pathe gidip aşağıdaki komutu çalıştırabiliriz.

docker-compose down

Bu komuttan sonra Container’ların ve yaratılan default ağın kaldırıldığını görebilirsiniz.

Stopping nginx-compose-project_nginx-compose-project-1_1 ... done
Stopping nginx-compose-project_nginx-compose-project-2_1 ... done
Removing nginx-compose-project_nginx-compose-project-1_1 ... done
Removing nginx-compose-project_nginx-compose-project-2_1 ... done
Removing network nginx-compose-project_default

Docker Compose içerisindeki servislerden herhangi birini birden çok çalıştırmaya ihtiyaç duyabiliriz. Böyle bir durumda aşağıdaki örnekte olduğu gibi port belirtirken sadece Container içerisinden dışarıya çıkan port yazılır.

version: '2'services:
nginx-compose-project-1:
image: nginx:latest
ports:
- "8080:80"
nginx-compose-project-2:
image: nginx:latest
ports:
- "8081:80"
nginx-compose-project-3:
image: nginx:latest
ports:
- "80"

Şimdi “nginx-compose-project-3” servisinden 2 tane başlatmak için aşağıdaki komutu çalıştırıyoruz.

docker-compose up --scale nginx-compose-project-3=2 -d

Bu komuttan sonra “docker-compose ps” komutunu çalıştırdığımızda aşağıdaki gibi bir liste göreceğiz.

Name                                  Command          State           Ports
------------------------------------------------------------------------------------------------------------
nginx-compose-project-proxy_nginx-compose-project-1_1 nginx -g daemon off; Up 0.0.0.0:8080->80/tcp
nginx-compose-project-proxy_nginx-compose-project-2_1 nginx -g daemon off; Up 0.0.0.0:8081->80/tcp
nginx-compose-project-proxy_nginx-compose-project-3_1 nginx -g daemon off; Up 0.0.0.0:32769->80/tcp
nginx-compose-project-proxy_nginx-compose-project-3_2 nginx -g daemon off; Up 0.0.0.0:32768->80/tcp

Yukarıda da görüldüğü gibi “nginx-compose-project-3” servisinden belirtilen sayıda başlatmış ve tarayıcıdan erişilecek portları da 32768 ve 32769 olarak atamıştır.

Önemli bir bilgi olarak Docker Compose, Windows ve Mac için otomatik yüklenir ama Linux ortamında çalışıyorsanız, Docker Compose’u manuel olarak yüklemeniz gerekebilir. Docker Compose’u yükleme hakkında daha fazla bilgiyi burada bulabilirsiniz.

--

--