Docker Compose
Docker Compose & Komutları
Merhabalar,
Bu yazımda Docker Compose ne olduğu, ne için kullanıldığı, komutları ve basit bir örnek ile mantığını inceliycez.
Docker Compose, kompleks uygulamaların tanımlanmasını ve çalıştırılmasını sağlar. Birden fazla container tanımını tek bir dosyada yapabilir, tek bir komut ile uygulamanızın ihtiyaç duyduğu tüm gereksinimleri ayağa kaldırarak uygulamayı çalıştırabilirsiniz. Docker compose ile çalıştırdığımız containerların birbirine bağımlı olması sağlayabiliriz.
Docker Compose, Windows ve Mac de Docker Desktop yüklediğinizde docker-compose otomatik olarak yüklenir. Linux de ise docker compose ayrıca yüklemeniz gerekir. Linux yüklemek için daha önceki yazımı okuyabilirsiniz.
Docker Compose yaml dosya formatındadır. YAML, hem insan tarafından kolaylıkla okunabilen hem de sayısal olarak kolaylıkla işleme alınabilen ve tüm programlama dilleri tarafından kullanılabilen bir veri değişim formatıdır. YAML’ın açılımı Ain’t Markup Language’dir. YAML dilinde yazılan veriler birçok programlama dilinde rahatça okunacak şekilde kütüphanelere sahiptir. Anahtar-değer (Key-Value) çiftlerinden oluşur.
Docker Compose dosyası versiyon ile başlar ve zorunludur. Yukarıdaki örneğimizde version 3'e göre yazılmıştır.
Yaml içeriğinde çalışacak uygulamızın bilgileri yazarız. Servis ismi, image, network ve volume tanımlamaları yapabiliriz. Yukarıdaki örnekte servis ismi olarak elasticsearch verilmiş. Servisin environment ve port tanımlamaları da yapılmıştır.
docker-compose up
komutu ile çalıştırtıldığımızda ilk defa çalıştırıyorsak image sistemimizde olmadığı için ilk önce image indirme işlemi yapacaktır.
indirme işlemi bittikten sonra tarayıcımızdan localhost:9200 gittiğimizde
ve tarayıcımızdan localhost:5601 gittiğimizde
uygulamalarımızın hizmet verdiği göreceksiniz. -d (detach) background çalıştırabiliriz.
docker-compose up -d
docker-compose.yaml içerisinde kullanabileceğimiz komutlar şunlardır.
Build
İlgili servisin hangi Dockerfile göre build edeceğini bildiririz. İki şekilde kullanımı vardır.
- Sadece build edilecek Dockerfile path verilir.
build: Path_yolu
- İkinci olarak build alınacak Dockerfile hangi klasörde olduğu gösterilir.
build:
context: ./Icerik
dockerfile: Dockerfile_yolu
Container_name
Servisimiz içinde oluşturduğumuz containerımıza isim vermek için kullanılır.
container_name: container_deniz
Command
Servisimiz içinde containerımızı çalıştırırken çalışması istediğimiz komutları söyleyebiliriz.
Depends_on
Çalışan servislerimizin birbirine bağımlı olmasını istediğimiz durumlarda kullanılırız.
version: '3'services:
nginx-service:
build: Dockerfile_dosya
depends_on:
- ruby-service ruby-service-1:
build: Dockerfile_dosya
depends_on:
- redis-service-1
redis-service-1:
image: redis:5
Dns
Service ’den oluşturulacak containerlar tarafından kullanılacak DNS sunucu veya sunucuları bu komut ile değiştirilebilir.
dns: 8.8.8.8veyadns:
- 8.8.8.8
- 8.8.4.4
Environment
Service ’den oluşturulacak containerlara yeni Environment Variable’lar bu opsiyon ile eklenebilir.
environment:
- DEBUG=true
- PASSWORD=secret
Expose
Container’lar arasında port’ları açmak için kullanılır.
expose:
- "3306"
Extra_hosts
DNS sunucularda tanımlı olmayan fakat Container içerisinden isimleri ile erişilebilmesini istediğimiz IP’lerin Container’lardaki /etc/hosts
dosyasına yazılması için kullanılan bir opsiyondur.
extra_hosts:
- "local.server:192.168.1.54"
Image
Service’den oluşturulacak container’ların başlatılacağı Image’ı belirler.
Networks
Service’den oluşturulacak container’ların dahil olacağı Network’leri belirleyebiliriz.
my-service:
networks:
- deniz-network
Ports
Service’den oluşturulacak container’lardan host’a map’lenecek (forward edilecek) portları belirler. En çok kullanılan opsiyonlardan biridir.
Volumes
Üç farklı opsiyona sahiptir.
- Host üzerindeki bir klasörün container’a mount edilmesi.
services:
my-service:
volumes:
- /Desktop/App:/var/lib/app
- Container üzerinde bir volume yaratılması için
services:
my-service:
volumes:
- /var/lib/app
- Volumes konfigürasyonunda tanımlanan bir Volume’un container mount edilmesi.
services:
my-service:
volumes:
- my-volume:/var/lib/app volumes:
my-volume:
driver: local
Docker Compose CLI
Docker Compose komutlarını inceleyelim. Komut satırından
docker-compose --help
Docker Compose Build
Komutu ile docker-compose dosyasında tanımladığımız container servisleri tek tek veya toplu halde build edebiliriz.
docker-compose build <service_ismi>
Docker Compose Çalıştırma
Docker Compose dosyasının içindeki servisleri ayağa kaldırmak için bu komut kullanılır.
docker-compose up
Dediğimizde cli çalışır durumda kalır. Eğer terminal ekranın standart input-output bize bırakması için -d (detach) parametresini kullanırız. Bu parametrenin bir güzel yanı da siz bilgisayarınıza restart atsanız bile bilgisayarınız tekrar çalıştığında service hep up (çalışır) durumda olur.
-no-recreate parametresi ile servis veya servislerin image build edilmesi ve yeni bir containerın oluşması engellenir. Burada dikkat etmeniz docker-compose yaml dosyasında yaptığımız değişiklikleri algılamaz hep aynı image ve containerları ayağa kaldırır.
-force-recreate her seferin image build edilmesi ve yeni bir containerın ayağa kalkmasını istiyorsak bu parametre kullanılır.
docker-compose yaml dosyamızda birden fazla servisimiz olabilir. İstediğimiz servisleri ayağa kaldırmak için
docker-compose up <servis_name_1> <servis_name_2>
komutu kullanırız.
Docker Compose Silme
Çalışan containerlarımızı silmek için kullanılır.
docker-compose down
eğer biz burda -v (volumes) parametresini de kullanır isek docker-compose yaml dosyasında tanımladığımız volume bağlantılarını siler. Volume ne olduğu okumak isterseniz bir önceki yazımı inceleyebilirsiniz. Parametre kullanımı
docker-compose down -v
Docker Compose Listeleme
Komutu ile docker-compose dosyalarımızı listeleriz.
docker-compose ps
Docker Compose Başlatma
Komutu ile çalışmayan bir containerı tekrar çalıştırabiliriz.
docker-compose start
Docker Compose Durdurma
Çalışan containerımızı durdurmak için kullanılır.
docker-compose stop
Docker Compose Logs
Çalışan containerımızın loglarına bakmak için kullanılır. Kullanımı
docker-compose logs
Docker Compose Exec
Çalışan containerımızın içerisine girip komut çalıştırmak için kullanılır.
docker-compose exec service_name
Docker Compose Öldürme
Çalışan uygulamaması sonlandırmak için kullanılır.
docker-compose kill
Docker Compose Oluşturma
Yeni bir servis oluşturmak için kullanılır.
docker-compose create <servis_ismi>
Docker Compose Örneği
Üç tane nginx servisini docker-compose ile ayağa kaldıralım.
ilk olarak docker-compose.yaml yazalım.
docker-compose dosyamızda servislerimiz, network ve volume tanımladık.
Tarayıcıdan localhost:5001
ve localhost:5002
ve localhost:5003
gittiğimizde servislerimiz çalışır durumdadır.
docker-compose ps
docker container ls -a
komutunda containerların çalıştığını görmekteyiz.
docker container inspect nginx1
docker-compose.yaml dosyasında verdiğimiz network eklenmiştir.
Bu yazımızın da sonuna gelmiş bulunmaktayız. Araştırmalarım ve sektörde karşılaştığım senaryolar üzerine yazılarımı yazmaya devam edeceğim. Umarım faydalı bir yazı olmuştur. Yazımı okuduğunuz için teşekkürler.
Referanslar;