Docker Temelleri
Bu yazıda Docker hakkında kavramsal temmeller hakkında bilgilendirme amaçlanmıştır. Yazının sonunda sıklıkla kullanılan bir kaç cli komutu ve kullanım amaçları yazılmıştır.
Docker Nedir?
Docker, yazılım geliştiriciler ve sistemciler için geliştirilen açık kaynaklı yeni nesil bir sanallaştırma platformudur. Docker ile Linux, Windows ve MacOSX üzerinde Linux ve Windows sanal containerler(makineler) çalıştırabilirsiniz. Bu platform sayesinde web sistemlerinin kurulumunu, testini ve dağıtımını kolaylıkla gerçekleştirebilirsiniz. Docker farklı ortamlarda aynı yapıyı sunduğu için configurasyon işlerinden kurtulmanızı sağlar.
Docker bilinen sanallaştırma platformları (VMware, Xen, Hyper-V vb) gibi Hypervisor katmanına sahip değildir.
Peki o zaman nasıl bir yapıdadır? Docker, Linux Kernel’e 2008 yılında eklenen Linux Containers (LXC) üzerine kurulu bir teknolojidir.
LXC, Linux’da aynı işletim sistemi içerisinde birbirinden izole olmuş bir biçimde çalışan Container’lar (Linux tabanlı sistemler) sağlamaktadır.
LXC, işletim sistemi seviyesinde bir sanallaştırma (virtualization) altyapısı sunmaktadır. Container’lar içerisinde aynı işletim sistemi
tarafından çalıştırılan process’lere, LXC tarafından işletim sisteminde sadece kendileri koşuyormuş gibi düşünmeleri için bir sanallaştırma ortamı sağlanmıştır. LXC, Container’lara işletim sistemi tarafından sunulan dosya sistemi, ortam değişkenleri (Environment Variable), vb fonksiyonları her bir Container’a özgü olarak sağlar. Aynı işletim sistemi içerisinde çalışmalarına rağmen Container’lar birbirlerinden izole edilmişlerdir ve birbirleri ile istenmediği müddetçe iletişime geçemezler. İletişim kısıtlamasının bir amacı da Container’larının güvenliğini aynı Host üzerindeki diğer Container’lara karşı da korumaktır.
İşin özeti bir Docker imajı, container denilen birimlerde çalıştırılıyor. Her bir container bir süreç (process) kullanıyor. Bir makinada gücüne bağlı olarak binlerce docker containerı birden çalışabilme imkanı sağlıyor. Container imajları ortak olan sistem dosyalarını paylaşıyorlar, dolayısıyla disk alanından tasarruf ediliyor.
Docker neden kullanılmalı?
Docker’ı kullanmanız kaynak kullanımını geliştirerek daha hızlı kod göndermenize, uygulama işlemlerini standart hale getirmenize, kodu sorunsuz bir şekilde taşımanıza ve tasarruf etmenize imkan tanır. Docker ile her yerde güvenilir bir şekilde çalışabilen tek bir nesneniz olur. Docker’ın basit ve kolay anlaşılan söz dizimi, size tam denetim sağlar. Docker’ın geniş çaplı olarak benimsenmiş olması, Docker ile kullanıma hazır güçlü bir araç ekosistemi ve uygulamalar olduğu anlamına gelir.
İşin özeti Docker sayesinde “Benim bilgisayarımda çalışıyordu!” gibi bir durumla karşılaşmıyorsunuz.
Terminolojisi
Dockerfile
Container’ların baz alacağı işletim sistemi veya başka Image’ı, dosya sisteminin yapısı ve içerisindeki dosyaları, koşturacağı programı belirleyen ve içeriği metin bazlı belirlenen talimatlara verilen isimdir. Yazımı kesinlikle Dockerfile olmalıdır.
Image
Dockerfile içinde belirtilen talimatlara göre oluşur. Uygulamanın çalışacağı ortam, environment bulunur. Statik bir dosyadır ve sadece readonly’dir. Layer topluluğu olarak düşünülebilir.
Container
Image’ların çalışabilen örneğidir.
Docker Container’lar durdurulabilir, tekrar başlatılabilir, silinebilir ancak DockerImage statik yapıda olduğundan buna imkan tanımazlar.
İlgili image’dan her bir container ayağa kaldırıldığında Docker bu image üzerinde bir tane daha yazılabilir ve okunabilir image eklemesi yapar ve uygulamayı ayağa kaldırır.
Burada dikkat edilmesi gereken önemli bir husus var. Container içine eklenilen dosya vb dökümanlar container silindiğinde gidecektir. Onun için upload ile yüklenmiş dosyalarınızı ya da benzer dökümanları container içinde tutmamanız daha uygun olacaktır.
Docker CLI (Command-Line Interface)
Kullanıcının Docker Daemon ile konuşabilmesi için gerekli komut setini sağlar.
Docker Cli üzerinden yazılan bir komut Api ile Docker Daemon’a gönderilerek haberleşme sağlamış olur.
Docker Registry
İmajların tutulduğu ve dağıtıldığı bir ortamdır. DockerHub‘da topluluğun ürettiği Image’lar ücretsiz ve sınırsız indirilebilir, oluşturulan yeni Image’lar gerek topluluk ile gerekse kişisel veya şirket referansı için açık kaynaklı (ücretsiz) veya kapalı kaynaklı (ücretli) yüklenebilir ve sonradan indirilebilir. Gerekirse üzerinde değişiklik yapabilir ve tag’leyerek farklı bir versiyon olarak yeniden gönderebiliriz.
Docker Kurulumu
Windows ortamına kurulum için Windows 10 Pro sürümüne sahip olmanız gerekmektedir.
Windows 10 Pro
MacOs üzerinde paket yöneticisi olarak brew kullanıyorsanız kurulum oldukça kolay. Aşağıdaki kodu yazdığınızda mac bilgisayarınıza Docker Desktop kurulmuş olacaktır.
brew cask install docker
Grafik arayüzü üzerinden çalıştırma yapmak isterseniz yardımcı tool olarak Kinematic’i tavsiye ederim.
Temel Docker Cli Komutları
docker info : Sistem genelindeki bilgileri görüntülemek için kullanılır.
docker start : Bir veya daha fazla durdurulmuş container başlatmak için kullanılır.
docker ps : Container’ları listelemek için kullanılır.
docker build : Bir Dockerfile dosyasından image oluşturmak için kullanılır.
docker exec : Çalışan bir container’de komut çalıştırmak için kullanılır.
docker attach : Çalışan bir container’a yerel standart girdi, çıktı ve hata akışları eklemek için kullanılır.
docker history : İmage geçmişini göstermek için kullanılır.
docker kill : Çalışan bir veya daha fazla container’i yok etmek için kullanılır.
docker run : Container oluşturmak için kullanılan docker create ve container’i başlatmak için kullanılan docker start komutlarını içerir. Tek bir komutla iki komutun işini gerçekleştirir.
— name parametresi ile oluşacak container’e isim verebilirsiniz. Hangi image için olduğunu belirtmek için image_name ya da image_id’si yazılır (image_id’nin ilk 3 hanesi yeterlidir).
— rm parametresi eklenirse container durdurulduğunda silinme işlemi gerçekleşir. Container’i silmek ve durdurmak birbirinden farklı şeylerdir, dikkat edilmesi gereken bir husustur.
docker rmi : Bir image silmek için kullanılır. İmage bir container tarafından kullanılıyorsa önce bağlı bulunan container silinmelidir. — force parametresi yazılırsa bağlı bulunan container durmuş haldeyse silme işlemi yapılabilir. docker rmi yazdıktan sonra image_name ya da image_id yazılır (image_id’nin ilk 3 hanesi yeterlidir).
Image tag’leme : docker build -t {image_name} ya da {image_id} sonuna “:” konulup {tag_name} koyulmalıdır. Bundan sonra ise Dockerfile dizini verilmelidir, aynı kök dizin içindeyseniz “.” koymak yeterlidir.
Örneğin; docker build -t my_docker_app:v1 .
docker rm : Container silmek için kullanılır. Container name ya da id yazılması gerekir. Çalışan bir container’in silinmesi hataya yol açar. Bunun için container ya durmuş olmalı ya da sonuna — force parametresi eklenmelidir.
docker pull : DockerHub üzerinden istenilen image’ı çekmek için kullanılır.
docker push : DockerHub üzerine public ya da private olarak repository gönderilir.
docker logs : Container loglarını göstermek için kullanılır.