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.
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:
- Bir dosya oluşturun ve bu dosyaya
docker-compose.yml
adını verin. - 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;
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.services
: Projenizdeki tüm container'ları tanımlar. Her container için bir isim ve build veya image komutları gerekir.volumes
: Container'ların veri kaynaklarını tanımlar. Bu, verilerin container'lar arasında paylaşılmasını veya saklanmasını sağlar.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:
environment
: Container'lar için ortam değişkenlerini tanımlar.depends_on
: Container'lar arasındaki bağımlılıkları tanımlar.extends
: Ayrı ayrı tanımlanmış olan containerların ortak olan ayarlarını kullanmak için kullanılabilir.ports
: Containerların host makineye açacağı portlar tanımlanabilir.restart
: Containerların nasıl yeniden başlatılacağını tanımlanabilir.command
: Containerların başlatılırken çalıştırılması gereken komutlar tanımlanabilir.labels
: Containerların etiketleri tanımlanabilir.tmpfs
: Containerların tmpfs kullanmasının yapılandırılmasını yapabilirsiniz.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.cap_add
: Container'lar için ekstra yetkiler tanımlar.cap_drop
: Container'lar için yetkileri kaldırır.cgroup_parent
: Container'ların cgroup parent'ını tanımlar.devices
: Container'ların host makineye erişebileceği aygıtları tanımlar.dns
: Container'ların DNS sunucularını tanımlar.dns_search
: Container'ların DNS arama alanlarını tanımlar.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.env_file
: Container'lar için ortam değişkenlerinin yer aldığı bir dosya tanımlar.expose
: Container'ların açtığı portları belirtir, ancak host makineye açılmaz.external_links
: Container'lar için harici linkler tanımlar.extra_hosts
: Container'lar için ekstra DNS girişlerini tanımlar.logging
: Container'lar için günlükleme ayarlarını tanımlar.ulimits
: Container'lar için sistem kaynak sınırlarını tanımlar.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:
docker-compose.yml
dosyasının bulunduğu dizine gidin.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.- Eğer dosya adınız
docker-compose.yml
değilse,-f
parametresi ile dosya adınızı belirtin. Örneğindocker compose -f file_name.yaml up
docker ps
veyadocker container ls
komutunu çalıştırarak oluşturulan container'ı görebilirsiniz.docker volume ls
komutunu çalıştırarak oluşturulan volume'u görebilirsiniz.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.
- Eğer
docker compose up
komutunu kullandıysanız, aynı terminalde Ctrl+C komutu ile - Eğer
docker compose up
komutunu kullandıysanız, farklı bir terminaldedocker compose down
komutu ile
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.
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.
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:
6. Docker Compose Hangi Ortamlarda Kullanılır?
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.