Docker Serisi — Docker Compose CLI
Docker Compose ile ilgili komutların çoğu Docker CLI’daki komutlara benzemektedir. Fakat bazı farklılıkları da bulunmaktadır.
Çok önemli bir ayrıntı olarak tüm docker-compose komutlarını docker-compose.yml ile aynı dizinde çalıştırmanız gereklidir. Komutları dizinin farklı seviyelerinden çalıştırmak mümkün değildir.
İşte bu büyülü dosyaların işlerini yapabilmeleri için terminale girebileceğiniz Docker komutlarını anlatmaya çalışacağım.
docker-compose build
docker-compose.yml dosyasında yarattığınız servisleri build etmeye yarar. Bu komut yardımı ile bütün servisleri build edebilir veya “docker-compose build <servis adı>” komutu ile belirli bir servisi build edebilirsiniz.
docker-compose up
Servislerin yayınlanması için ağı kurar ve yml dosyasında bulunan tüm servisleri ayağa kaldırır. Dockerfile veya ayağa kaldırılacak Container ayarlarında değişiklik varsa, komut çalışırken bu değişiklikleri algılayıp Image’leri tekrar build edecektir. Bu durumda yeni bir Container yaratılır. Bunu engellemek için “--no-recreate” parametresi ile kullanabiliriz. Eğer değişiklikler algılanmıyorsa veya İşletim Sisteminden kopyaladığınız yeni dosyalar varsa bunları anlayamayacağından “--force-recreate” ile Image’lerin tekrar build edilmesini zorunlu kılabiliriz.
docker-compose up <servis adı> <servis adı> komutuyla bir veya daha fazla servis adını vererek sadece ismi verilen servislerin ayağa kaldırması sağlanabilir.
-d parametresi ile Docker Compose detached modda çalışır.
docker-compose down
Docker ağının tamamını ateşe atar. Ağ ve içerisindeki servisleri tamamen siler.
-v paremetresi ile Docker Compose’un oluşturduğu Volume’ları da kaldıracaktır.
docker-compose ps
Docker Compose ağındaki tüm servisleri listeler. Bu bize Container kimliklerini de verecektir. Hata ayıklamak gerektiği durumlarda Container içine “docker -it exec <container id> bash” komutu ile girebilirsiniz.
docker-compose run
Bu komut ile yml dosyasında tanımlanmamış bir komutu çalıştırmak isteyebilirsiniz. Pek kullanılan bir komut olmamakla beraber ileride farklı senaryolar için işinize yarayabilir.
docker-compose start
Servisleri yeniden başlatır. Durduruldukları zaman ise tekrar başlatır. Up komutu ile aynı işi yapar.
docker-compose stop
Ağı durdurur ve tüm servislerin State’lerini kaydeder. Belli bir servisi durdurmak için ise “docker-compose stop <servis adı>” kullanılır.
docker-compose exec
Çalışmakta olan bir Container’da bir komut çalıştırmaya yarar. “docker -it exec <container id> bash” komutu gibi.
Genellikle kullanılan komutlar bunlardır. Şimdi daha iyi anlayabilmemiz için hangi komutları çalıştırdığınızda Compose ortamının durumlarını inceleyelim.
docker-compose build ve docker-compose down: Docker ortamı çalışmıyor ve ağ mevcut değil.
docker-compose up ve docker-compose start: Docker ortamı çalışıyor ve ağ mevcut.
docker-compose stop: Docker ortamı çalışmıyor ama ağ mevcut.
docker-compose.yml Konfigürasyonu
version: '2'
services:
nginx-compose-project-1:
image: nginx:latest
ports:
- "8080:80"
nginx-compose-project-2:
image: nginx:latest
ports:
- "8081:80"
yml içinde Container’lar “services:” Tag’i ile belirtilir.
build
Bu Tag’de oluşturulacak servisin Dockerfile’ının bulunduğu path verilir.
version: "3"
services:
java-exam_1:
build: exam1/java-exam/
image: exam1/java-exam
Bunun yanı sıra Dockerfile ismini belirtmek istersek aşağıdaki gibi bir konfigürasyon kullanmamız gerekirdi.
version: "3"
services:
java-exam_1:
build:
context: exam1/java-exam/
dockerfile: Dockerfile-exam1
image: exam1/java-exam
image
Yukarıdaki örnekte de görüldüğü gibi verilen Dockerfile’dan oluşan Container için Image ismini set eder. Eğer Dockerfile’dan oluşturulan bir Image yoksa Container’ın başlatılacağı Image’ı belirler.
version: "3"
services:
exam_1:
image: nginx
command
Servis için kullanılan Image’ın standart komutundan farklı bir komut kullanmak için bunu kullanırız.
version: "3"
services:
web:
image: nginx
command: /bin/bash -c "envsubst < /etc/nginx/conf.d/localhost.conf > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
depends_on
Docker Compose ayapa kalkarken bir diğer servise bağımlılığı var ise bu bağımlılıklara göre sırayla başlatır. İlişki sırası yoksa yml içindeki sıraya göre başlatır. Bir depends_on servis diğer servisin depends_on’u olabilir.
version: "3"
services:
web:
image: nginx
depends_on:
- java-exam_1
- java_exam_2
java-exam_1:
build: exam1/java-exam/
image: exam1/java-exam
java-exam_2:
build: exam2/java-exam/
image: exam2/java-exam
depends_on:
- java-exam_3
java-exam_3:
build: exam3/java-exam/
image: exam3/java-exam
Burada servisler ayağa ayağa kalkarken depends_on ile belirtilen servisin ayağa kalkmasını beklemez. Kullanım örneği olarak sadece “java-exam_2” servisini ayağa kaldırmak istersek “java-exam_3” servisi ayağa kaldırılmayacaktı. Bu parametre ile “java-exam_2” servisini tetiklediğimizde “java-exam_3” servisi de ayağa kaldırılacaktır. Ama az önce de bahsettiğim gibi servisin ayağa kalmasını beklemeyecektir.
environment
Servisler ayağa kalkarken Enviroment Variable’lar vermek için bu özellik kullanılır.
version: "3"
services:
web:
image: nginx
environment:
- NGINX_HOST=localhost
- NGINX_PORT=80
java-exam_1:
build: exam1/java-exam/
image: exam1/java-exam
environment:
- DEBUG=true
- PARAM1=VALUE1
ports
Container’dan İşletim Sistemi Host’una maplenecek portları belirlemek için kullanılır. İlk olarak Container’daki 80 portunu aynen yönlendirir. 2. satırda ise 18000–18500 arası portları yine 18000–18500 arasına mapler.
version: "3"
services:
web:
image: nginx
ports:
- "80:80"
- "18000-18500:18000-18500"
volumes
- İşletim Sistemi Host’undan Container’a klasör mount etmek için;
version: "3"
services:
web:
image: nginx
volumes:
- ./nginx/localhost.conf:/etc/nginx/conf.d/localhost.conf
Dockerfile’a göre “./nginx/localhost.conf” klasorunu Container üzerindeki “/etc/nginx/conf.d/localhost.conf” dosyasına mount etmiştir.
- Container’da volume oluşturmak için;
version: "3"
services:
web:
image: nginx
volumes:
- /etc/nginx
Container silinse dahi erişilebilir bir Volume yaratır. Container ile Volume silinirse Volume’da silinir.
- Volumes olarak tanımlanan bir Volume’un Container tarafından bilinmesi için;
version: "3"
services:
web:
image: nginx
volumes:
- test-volume:/etc/nginx
volumes:
test-volume:
driver: local
Container’lardan bağımsız olarak yönetilecek, bütün servislerden oluşturulan bir Volume tanımlanmasını sağlar. Yukarıdaki örnekte de test-volume oluşturulmuş ve mount edilmiştir.
expose
İşletim Sistemi Host’una çıkmadan Container’lar arası port açmak için kullanılır.
extra_hosts
“/etc/hosts” dosyasına Container içerisinden isimleri ile erişmesini istediğimiz IP’i tanımlarız.
dns
Container tarafından kullanılmasını istediğimiz DNS’leri set etmek için kullanırız.
networks
Container’ların bağlı olacakları ağı belirlemek için kullanılır.