Docker Compose Nedir ve Nasıl Kullanılır?
10 min read

Docker Compose Nedir ve Nasıl Kullanılır?

Docker Compose birden fazla container'ı kolayca oluşturulmada ve yönetmede kullanılır.
Docker Compose Nedir ve Nasıl Kullanılır?

Docker Compose, Docker Inc tarafından geliştirilen ve Docker container'larının oluşturulması ve yönetilmesinde kullanılan bir araçtır. Docker Compose, bir projede birden fazla Docker container'ını yönetmek için kullanılır. Kullanıcılar, bir Compose dosyasında container'larını tanımlayabilir ve bunları tek seferde başlatabilir, durdurabilir veya yeniden başlatabilir. Bu, bir projenin bileşenlerini kolayca yönetmenizi ve test etmenizi sağlar.

Docker Compose, bir uygulamanın birden fazla container'dan oluştuğu durumlarda kolaylık sağlar. Örneğin, bir web uygulamasının web sunucusu, veritabanı ve diğer bileşenlerini farklı container'larda çalıştırabilir ve bu container'ları birlikte yönetebilirsiniz. Aksi halde, her bir container'ı, network'u, volume'u tek tek ve manual yönetmeniz gerekir.

1. Docker Compose Nasıl Kurulur?

  • Docker compose, Docker engine ile birlikte gelmez.
  • Docker Desktop kurulumu yaptıysanız Docker compose kurulu halde gelir.

Eğer Docker Desktop kullanmıyor ve Docker Compose kurulumu yapmak istiyorsanız aşağıdaki bağlantıda yer alan aşamaları uygulayabilirsiniz.

Install the Compose plugin
How to install Docker Compose on Linux

2. Docker Compose Nasıl Oluşturulur?

Docker Compose, yapılandırma dosyası olarak yaml formatını kullanır. Bu yapılandırma dosyası, Docker container'larının nasıl oluşturulacağını ve nasıl yönetileceğini belirtir. Bu yapılandırma dosyası, satır satır yapılandırma komutlarından oluşur ve her komut bir container oluşturmak, container içerisinde bir komut çalıştırmak gibi bir işlemi gerçekleştirir.

Bir Docker Compose yapılandırma dosyası oluşturmak için aşağıdaki adımları izleyebilirsiniz:

  1. Bir dosya oluşturun ve bu dosyaya docker-compose.yml adını verin.
  2. Dosyanın içine, çok basit bir örnek olması için aşağıdaki yapılandırma komutlarını yazın:
version: '3'

services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app

Bu yapılandırma komutları, bir web adlı container oluşturacak ve bu container'ın 8000. portundan erişilebileceğini belirtmektedir. Ayrıca, container içerisinde çalışan uygulamanın kodları host makinede bulunan app dizinine bağlanacaktır. Bu sayede, host makinede bulunan uygulamanın kodları container içerisinde de güncellenebilir.

3. Docker Compose Bileşenleri ve Parametreleri Nelerdir?

Docker Compose dosyası 4 ana bileşenden oluşur. Bunlar şu şekildedir;

  1. version: Compose dosyasının hangi compose sürümünü kullandığını belirtir. Her sürüm kendine ait özellikler ve yeni geliştirmeler içerebilir. Tüm sürümleri ve detayları için https://docs.docker.com/compose/compose-file/compose-versioning/ adresini ziyaret edebilirsiniz.
  2. services: Projenizdeki tüm container'ları tanımlar. Her container için bir isim ve build veya image komutları gerekir.
  3. volumes: Container'ların veri kaynaklarını tanımlar. Bu, verilerin container'lar arasında paylaşılmasını veya saklanmasını sağlar.
  4. networks: Container'lar arasındaki ağ bağlantılarını tanımlar.

Bu dört ana bileşenden oluşan bir Docker Compose dosyası örneği verelim:

version: '3.8'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - my-network
  db:
    image: postgres:13
    environment:
      - POSTGRES_USER=myuser
      - POSTGRES_PASSWORD=mypassword
      - POSTGRES_DB=mydb
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - my-network
volumes:
  db-data:
networks:
  my-network:
    driver: bridge

Bu dosya, web ve db servislerini tanımlar. web hizmeti, en son nginx sürümünü kullanarak container'ları oluşturur ve host makine tarafından erişilebilecek portları tanımlar. db hizmeti ise postgresql 13 sürümünü kullanarak container'ları oluşturur, ortam değişkenlerini tanımlar ve verileri saklamak için bir volume tanımlar.

Docker compose dosyasında kullanabileceğiniz diğer parametrelerden bazıları şunlardır:

  1. environment: Container'lar için ortam değişkenlerini tanımlar.
  2. depends_on: Container'lar arasındaki bağımlılıkları tanımlar.
  3. extends : Ayrı ayrı tanımlanmış olan containerların ortak olan ayarlarını kullanmak için kullanılabilir.
  4. ports : Containerların host makineye açacağı portlar tanımlanabilir.
  5. restart : Containerların nasıl yeniden başlatılacağını tanımlanabilir.
  6. command : Containerların başlatılırken çalıştırılması gereken komutlar tanımlanabilir.
  7. labels : Containerların etiketleri tanımlanabilir.
  8. tmpfs : Containerların tmpfs kullanmasının yapılandırılmasını yapabilirsiniz.
  9. build: Container'ların nasıl oluşturulduğunu tanımlar. Bu, bir Dockerfile kullanarak container'ların nasıl oluşturulduğunu belirten bir dizin belirtmenizi sağlar.
  10. cap_add: Container'lar için ekstra yetkiler tanımlar.
  11. cap_drop: Container'lar için yetkileri kaldırır.
  12. cgroup_parent: Container'ların cgroup parent'ını tanımlar.
  13. devices: Container'ların host makineye erişebileceği aygıtları tanımlar.
  14. dns: Container'ların DNS sunucularını tanımlar.
  15. dns_search: Container'ların DNS arama alanlarını tanımlar.
  16. entrypoint:Container'ların giriş noktasını tanımlar. Bu, container'ların nasıl çalıştırılacağını belirler ve komut satırından verilen komutları etkilemez.
  17. env_file: Container'lar için ortam değişkenlerinin yer aldığı bir dosya tanımlar.
  18. expose: Container'ların açtığı portları belirtir, ancak host makineye açılmaz.
  19. external_links: Container'lar için harici linkler tanımlar.
  20. extra_hosts: Container'lar için ekstra DNS girişlerini tanımlar.
  21. logging: Container'lar için günlükleme ayarlarını tanımlar.
  22. ulimits: Container'lar için sistem kaynak sınırlarını tanımlar.
  23. user: Container'lar için çalıştırılacak kullanıcıyı tanımlar.

Yukarıdaki parametreleri içeren daha karmaşık bir docker compose dosyası hazırlayalım:

version: '3.7'
services:
  web:
    build: .
    cap_add:
      - NET_ADMIN
    cap_drop:
      - ALL
    cgroup_parent: my-cgroup
    devices:
      - "/dev/snd:/dev/snd"
    dns:
      - 8.8.8.8
      - 8.8.4.4
    dns_search:
      - example.com
    env_file:
      - web-variables.env
    entrypoint: /usr/local/bin/web-entrypoint
    expose:
      - "80"
      - "443"
    external_links:
      - redis-server:redis
    extra_hosts:
      - "somehost:162.242.195.82"
    logging:
      driver: json-file
      options:
        max-size: "200k"
        max-file: "10"
    ulimits:
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000
    user: "1000:1000"
  db:
    image: postgres:13
    volumes:
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:

3. Docker Compose Nasıl Çalıştırılır?

Yukarıdaki başlıkta basit ve daha karmaşık olmak üzere iki yapılandırma dosyası gördük. Sizde kendi compose  yapılandırmanızı hazırladıktan sonra bu yapılandırmayı çalıştırmak için aşağıdaki adımları izleyebilirsiniz:

  1. docker-compose.yml dosyasının bulunduğu dizine gidin.
  2. docker compose up komutunu çalıştırın. Bu komut, docker-compose.yml dosyasındaki yapılandırma komutlarını kullanarak container, network ve volume'ları oluşturacaktır.
  3. Eğer dosya adınız docker-compose.yml değilse, -f parametresi ile dosya adınızı belirtin. Örneğin docker compose -f file_name.yaml up
  4. docker ps veya docker container ls komutunu çalıştırarak oluşturulan container'ı görebilirsiniz.
  5. docker volume ls komutunu çalıştırarak oluşturulan volume'u görebilirsiniz.
  6. docker network ls komutunu çalıştırarak oluşturulan network'leri görebilirsiniz.
📍
docker compose up komutu sonrası tüm loglar ekrana basılır. Ctrl+C ile çıkmak ise compose içinde yer alan tüm servisleri durdurur. Compose'u arka planda çalıştırmak için -d parametresi ile docker compose -d up komutunu kullanabilirsiniz.

4. Docker Compose Nasıl Durdurulur?

Docker compose ile servisleriniz çalışmaya başladıktan sonra tüm servisleri durdurmak için aşağıdaki yöntemleri izleyebilirsiniz.

  1. Eğer docker compose up komutunu kullandıysanız, aynı terminalde Ctrl+C komutu ile
  2. Eğer docker compose up komutunu kullandıysanız, farklı bir terminalde docker compose down komutu ile
📍
Docker compose ile servisler dursa bile compose yapılandırması içinde belirttiğiniz volume, network ve build parametresi ile oluşturduğunuz image'ler silinmeyecektir.

5. Docker Compose İle Birlikte Dockerfile Kullanımı

Yukarıdaki ilk docker compose yapılandırmasında image parametresi ile container'ın çalışacağı temel image'ı belirlemiştik (image: nginx:latest). Fakat hazır bir image kullanmak yerine container'ı bir Dockerfile dosyasından da servis edebiliriz. Bunun için compose yapılandırmanızda image yerine build parametresi kullanmalısınız.

Aşağıdaki örnekte, Docker Compose ile birlikte Dockerfile kullanarak basit bir web sunucusu oluşturacağız:

1- Dockerfile: İlk olarak, web sunucusu hizmeti için bir Dockerfile oluşturalım. Bu Dockerfile, Ubuntu tabanlı bir container oluşturacak ve Apache web sunucusunu yükleyecektir.

# Dockerfile
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y apache2

Yeri gelmişken daha detaylı Dockerfile  dosyaları için aşağıdaki yazımızı okuyabilirsiniz.

Dockerfile Nedir? Dockerfile Komutları Nelerdir?
Dockerfile, Docker container oluşturmak için kullanılan bir yapılandırma dosyasıdır

2- Docker Compose Dosyası: Bir sonraki adım, Docker Compose dosyası oluşturalım. Bu dosya, web sunucusu hizmetini tanımlayacak ve hizmet için kullanacağımız Dockerfile'ı build parametresi ile belirtecektir.

version: '3'
services:
  web:
    build: .
    ports:
     - "80:80"

. değeri, Dockerfile dosyasının Docker compose dosyası ile aynı dizinde olduğunu ifade eder.

Eğer Dockerfile dosyanızı özel olarak belirtmek isterseniz şu şekilde kullanabilirsiniz:

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./Dockerfile-v1
    ports:
     - "80:80"

Build sonrası oluşacak image ismini de image parametresiyle  verebilirsiniz.

version: '3'
services:
  web:
    build: .
    image: web:v1
    ports:
     - "80:80"

3- Build Komutu: Docker Compose dosyasını kullanarak, web sunucusu hizmeti için container'ı oluşturalım.

docker compose build

4- Up Komutu: Container oluşturulduktan sonra, web sunucusu hizmetini çalıştıralım

docker compose up

Bu komutların çalıştırılması sonucunda, localhost'unuzda çalışan bir Apache web sunucusu container'ı elde edersiniz. Üstelik ilgili image, kendi hazırladığınız Dockerfile ile oluşturulduğu için development ve test süreçlerinizde çok büyük erişim ve  düzenleme rahatlığı elde edersiniz.

📍
Dockerfile dosyanızda bir değişiklik yaptığınızda docker compose build komutunu tekrar çalıştırmanız gerekir.

6. Docker Compose Nasıl Güncellenir?

Üstteki başlıkta da gördüğünüz gibi Docker Compose'un "build" komutu, Docker Compose dosyasında tanımlanan servisler için Dockerfile'ları kullanarak container'ları oluşturur. Bu komut, Dockerfile dosyasında yapılandırma değişiklikleri yapıldığında veya bir container'ın içerisinde bulunan uygulamanın kodlarını güncellemek istediğinizde çalıştırılır.

docker compose build

Bu komut, web container'ının yapılandırma dosyasındaki build komutuna göre container'ı tekrar oluşturur ve bu sayede container içerisinde bulunan uygulamanın kodları güncellenmiş olur.

6. Docker Compose Container'lar Arası Bağımlılık Nasıl Oluşturulur?

Docker compose yapılandırmanızda, bir container'ın çalışması için önce başka bir container'ın çalışıyor olmasına ihtiyacınız olabilir. Bu durumda Docker Compose yapılandırma dosyasında, depends_on komutu ile bir container'ın diğer bir container'a bağımlı olduğu belirtilebilir. Bu sayede, container'lar arasında bağlantı kurulabilir ve container'lar birbirleri ile iletişim kurabilir.

Örneğin, bir web uygulamasının web sunucusunun çalışabilmesi için veritabanı container'ına ihtiyacı olsun. Bu senaryoda aşağıdaki örnekte yer aldığı gibi web yapılandırmasına bağımlılık olarak depends_on ile db container'ını belirtebiliriz.

version: '3'

services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    depends_on:
      - db
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: password

Yukarıdaki yapılandırma dosyasında, web container'ı db container'ına bağımlıdır. Bu bağımlılık, depends_on komutu ile belirtilir. Bu sayede, db container'ı web container'ı çalıştırılmadan önce çalıştırılacaktır ve web container'ı ayağa kalktığında db container'ına erişebilecektir. Bu şekilde, Docker Compose ile container'lar arasında bağlantı kurulabilir.

6. Docker Compose Container Loglarını İnceleme

Docker Compose, ayrıca container'ların loglarını izlemeyi de kolaylaştırır. Örneğin, web container'ı için aşağıdaki komutu çalıştırabilirsiniz:

docker-compose logs web

Bu komut, web container'ının loglarını gösterir ve bu logları takip edebilirsiniz. Bu sayede, web container'ında ne gibi işlemlerin yapıldığını ve hangi hataların oluştuğunu anlayabilirsiniz.

Log komutlarıyla ilgili daha detaylı bilgi için şu yazımızı okuyabilirsiniz:

Docker LOGS Komutu
Docker logs komutu, container’ların stdout ve stderr çıktılarını görüntüler.

6. Docker Compose Hangi Ortamlarda Kullanılır?

💡
Docker compose production env için uygun değildir. Dev ve test ortamında kullanılması daha uygundur.

Docker Compose, geliştirme ve test ortamlarında kullanım için tasarlanmış bir araçtır ve genellikle production ortamlarında kullanılmaz. Bunun nedeni, Docker Compose'un container'ları çalıştırmak için kullandığı birçok varsayımların production ortamlarında geçerli olmamasıdır. Örneğin, Docker Compose, container'ların çalıştırılması için ön tanımlı olarak bir network oluşturur ve container'lar arasında bağlantı kurar. Bu varsayımlar, production ortamlarında özel bir yapılandırma gerektirebilir ve yanlış yapılandırılmış bir network, sistemin güvenliğini tehlikeye atabilir.

Ayrıca, Docker Compose, container'ların çalıştırılması için kullandığı varsayılan ayarlar (örneğin, çalışma dizini, kaynak kullanımı vb.) production ortamlarında yeterli olmayabilir. Bu nedenle, production ortamlarında container'ların çalıştırılması için özel bir yönetim aracı (örneğin, Kubernetes, Mesosphere, Docker Swarm) kullanmak daha uygun olabilir.

Docker Compose kullanılmasının bir avantajı ise, container'ların test ve development ortamlarında kolayca yapılandırılmasıdır. Bu nedenle, development ve test ortamlarında kullanılması önerilir, ancak production ortamlarında kullanılması genellikle önerilmez.

Docker serimizin sıradaki yazısı için aşağıdaki bağlantıyla devam edebilirsiniz.

Docker Swarm İle Container Cluster Yönetimi
Docker Swarm, Docker’la birlikte gelen dağıtık ortam orkestrasyon aracıdır.