DOCKER Sanallaştırma Teknolojisi #1

Sanallaştırma teknolojileri özellikle servis sağlayıcılar ve geliştiriciler için önemli bir teknolojidir. Sanallaştırma teknolojileri temel olarak tek bir donanım üzerinde birbirinden bağımsız olarak çalışan yazılımların var olmasını sağlar.

Daha önce tek bir donanım içerisinde bir yardımcı program aracılığı ile birbirinden izole şekilde çalışan bir sanallaştırma mimarisi benimsenmişti. Bu sanallaştırma mimarisi servis sağlayıcıları tarafından hala aktif olarak kullanılıyor olsa da günümüzde çoğu durumda işlevselliğini yitirmiş bir mimaridir. Çoğu durumda diyorum çünkü nadiren de olsa bu sanallaştırma mimarisini kullanmak zorunda olduğunuz yerler olabiliyor. Bu sanallaştırma mimarisini kullanmanızı sağlayan iki popüler uygulama var; VMware ve VirtualBox.

Yukarıda bahsettiğim sanallaştırma mimarilerinin aksine Docker daha modüler bir sanallaştırma mimarisi olan container mimarisini/türünü kullanır. Docker LXC container türünü kullanır ve containerları yönetmek için kullanışlı araçlar sunar.

(LXD, LXCFS gibi container türleri de vardır.)

Container mimarisini kullanan sanallaştırma yöntemlerinin alışageldiğimiz sanallaştırma yöntemlerinden en belirgin farkı ise işletim sisteminin çekirdeğini ortaklaşa kullanmasıdır.

Her container kendi gereksinimini kendi içerisinde bulundurur. Docker işletim sistemi çekirdeği ile container arasındaki iletişimi sağlar.

Aşağıdaki resime bakacak olursanız Docker ile standart sanallaştırma mimarileri arasındaki farkı daha iyi anlayabilirsiniz.

Docker Kurulumu (Windows)

Docker kurulumuna geçmeden önce kurulumu yapacağınız bilgisayarın doğru şekilde yapılandırılması gerekir. Ben bu anlatımı Windows 11 Home işletim sistemi için yapıyorum ancak sizin için de adımlar benzer olacaktır.

Öncelikle bilgisayarınızın BİOS ayarlarından sanallaştırma açık olmalıdır. Burada izlenmesi gereken yol her anakart için farklı olacağından anlatım yapmam bir şey ifade etmeyecektir. Bios ayarlarınızda "Hardware Assisted Virtualization" ve "Data Execution Protection" ayarlarını "Enable" yapın. Bu ayarların isimleri sizin anakartınızda farklı olabilir.Hazır bir sistem aldıysanız genellikle sanallaştırma açık gelir. Yardıma ihtiyacınız olursa google'da anakart marka ve modelinizi de ekleyerek "hardware virtualization" aramasını yaparsanız izlemeniz gereken yolu öğrenebilirsiniz.

Bios üzerinde donanım sanallaştırma ayarlarınızı yaptıysanız artık işletim sisteminizin sanallaştırma desteğini açabilirsiniz. Denetim Masası > Programlar > Programlar ve Özellikler alanında pencerenin solundaki Windows Özelliklerini Aç veya Kapat'a tıklayın. Burada "Linux için Windows alt sistemi" ve "Sanal Makine Platformu" seçeneklerinin seçili olduğundan emin olduktan sonra "Tamam" butonuna tıklayın. Windows gerekli kurulumları yapacak ve bilgisayarı yeniden başlatmanızı isteyecektir.

Not: Windows 10'da sanallaştırma özellikleri Hyper-V olarak geçiyordu.

Bilgisayarınız yeniden başlatıldıktan sonra Güncelleştirmeleri denetlemeyi unutmayın. Bu WSL gibi gerekli paketleri yükleyecektir. WSL kurulumunun yapılıp yapılmadığını öğrenmek için terminalde aşağıdaki komutu yürütmeyi deneyin;

wsl --status

Hata alıyorsanız WSL kurulumunun nasıl yapacağınızı öğrenmek için https://docs.microsoft.com/en-us/windows/wsl/install-manual adresindeki dökümanı inceleyebilirsiniz.

https://www.docker.com/get-started adresinden Docker'ı indirin ve çalıştırın. Docker öncelikle gerekli paketleri indirmeye başlayacaktır. İndirme işlemi bittikten sonra basit bir yapılandırma ekranı gelecektir. Bu ekranda bir şey değiştirmenize gerek yoktur. "Ok" butonuna basarak kurulumu başlatabilirsiniz.

Kurulum tamamlandığında Windows oturumunuzu kapatmanızı sağlayacak "Close and log out" butonuna tıkladıktan sonra Windows oturumu kapanacaktır. Tekrar oturum açın.

Oturumu açtığınızda Docker otomatik olarak başlatılacaktır. Docker başlatma süresi bilgisayarınızın performansına bağlı olarak bir kaç dakika sürebilir. Docker açıldığında sistem tepsisinde ikonu göreceksiniz.

Docker kullanmaya başlamadan önce bir Docker Hub hesabınız olması gerekir. https://hub.docker.com/ adresinden hesabınızı oluşturabilirsiniz.

Kurulum tamamlandıktan sonra terminalde aşağıdaki komutu çalıştırarak kurulumun doğru şekilde yapılıp yapılmadığını görebilirsiniz.

docker version

Docker Terimleri

Docker kullanımına geçmeden önce bilmeniz gereken birkaç ifade/terim vardır. Özellikle image ve container en çok duyacağınız ifadeleri başında geliyor.

Image nedir?

İçerisinde bir veya daha fazla yapıyı barındıran yapılardır. İmageları gereksinimlerini kendi içerisinde barındaran paketler olarak düşünebilirsiniz. Bunlar işletim sistemi, kütüphane ya da uygulama olabilir.

Resmi olarak Docker Hub servisi üzerinde yayınlanır ve dağıtılır.

Container nedir?

Bir image ile oluşturulmuş ve izole şekilde çalışabilen yapıdır. Daha yalın bir ifade ile image kaynak kod, container kaynak kodun çalıştırılmış halidir diyebiliriz.

Docker Host ya da Docker Registry nedir?

Docker imagelarını taşıyan/saklayan ve containerları çalıştıran yazılım ya da servise verilen isimdir.

Docker Komutları ve Kullanımı

Docker kullanacaksanız çoğunlukla işlemleri yapmak için terminal ekranında komutlar ile çalışmanız gerekecek. Bu durumda özellikle temel komutları bilmeniz gerekiyor.

Image Arama

Docker Hub üzerinden bir image aramak için search komutu kullanılır. Bu komut aranan kelime ile ilgili bulduğu imageları listeleyecektir. Örneğin Docker Hub üzerinden php imageını aramak için;

docker search php

Sadece resmi sahipleri tarafından yayınlanan imageları listelemek için --filter bayrağı ile is-official=true olarak belirtmeniz gerekir.

docker search --filter is-official=true php

Image Çekmek

Docker Hub üzerinde yayınlanmış bir image çekmek için pull komutu kullanılır.

docker pull php

Yukarıdaki örnekte PHP'nin güncel imageı çekilecektir. Belli bir sürümünü indirmek için : ile belirtilebilir.

docker pull php:7.4-cli

Yüklü Imageları Görmek

Sisteminizde kurulu olan imageları listelemek için images komutu kullanılır.

docker images

Sisteminizden çok fazla image yüklü ise yüklü olan imagalar arasında arama yaparak istediğiniz image bilgisine daha kolay erişebilirsiniz.

docker images java

Yukarıdaki komut imagelar arasında java imagelarını arayacak ve listeleyecektir. Belli bir sürümü de : işareti ile arayabilirsiniz.

docker images java:8

Image Silme/Kaldırma

Sisteminizde yüklü bir imageı silmek için rmi komutu kullanılır.

docker rmi php

Container Oluşturma

Container oluşturmak için container create komutu kullanılır.

docker container create php

Yukarıdaki komut php imageı ile bir container oluşturur.

Containera bir isim vermek için --name bayrağı kullanılır.

docker container create --name mysql-server mysql

Yukarıdaki komut mysql imageı ile mysql-server adında bir container oluşturur.

Eğer bir isim vermezseniz Docker sizin için (anlamsızda olsa) benzersiz bir isim verecektir. :)

Bir containerın iç portunu dış portta yayınlamak için -p bayrağı kullanılır.

docker container create -p 3333:3306

Yukarıdaki örnek container içerisinde 3306 portunu, 3333 dış portuna açarak container oluşturur. Bu işleme Port Mapping denir.

Containerları bağlayarak bir container oluşturmak için --link bayrağı kullanılır.

docker container create --name padmin -p 8000:80 --link mysql-server:db phpmyadmin/phpmyadmin

Yukarıdaki komut mysql-server isimli containerı bağlayarak phpmyadmin/phpmyadmin imageı ile padmin adında yeni bir container oluşturur.

Containerı Başlatma/Çalıştırma

Containerı başlatmak/çalıştırmak için container start komutu kullanılır.

docker container start mysql-server

Yukarıdaki komut mysql-server isimli containerı çalıştırır.

RUN Komutu

Docker kullanırken en sık kullanacağınız komutlardan birisi run komutudur. Bu komut birden fazla komutu tek başına yapan bir komuttur.

docker run --name dbserver mysql

Yukarıdaki şekilde bir komut mysql imageı ile dbserver adında bir container oluşturur ve çalıştırır. Eğer mysql imageı daha önce sisteme çekilmemiş ise önce sisteme çekilir.

Bazı containerlar sadece bir görevi yerine getirmek için oluşturuluyor olabilir. Eğer run komut ile birlikte --rm verirseniz container oluşturulur, çalıştırılır ve işlem tamamlandıktan sonra otomatik olarak silinir.

Container'ın arka planda çalıştırılması (Detach Mode) için -d bayrağı kullanılır.

docker run -d mysql

Arka planda çalıştırılan bir containerın çalışmasına konsol üzerinde devam etmesini sağlamak için (Attach Mode) attach komutu kullanılır.

docker attach [Container]

Yukarıdaki komuttan [Container] alanına container adı ya da ID'si gelmelidir.

Çalıştırılan containerın terminaline ulaşmak (Interactive Terminal) için -it bayrağı kullanılır.

docker run -it --name dockerbash ubuntu

Containerları Listeleme

Containerları listelemek için container ls komutu kullanılır.

docker container ls

Yukarıdaki komut sadece çalışan containerları listelecektir. Tüm containerları listelemek için -a bayrağı kullanılır.

docker container ls -a

container ls komutu ile aynı işlemi yapan bir de ps komutu vardır. ps komutu daha yaygın olarak kullanılır.

docker ps

docker ps -a

Container Durdurma

Çalışan bir containerı durdurmak için container stop komutu kullanılır.

docker container stop dbserver

Yukarıdaki komut dbserver isimli containerın çalışmasını durduracaktır.

Doğrudan stop komutuda containerı durdurmak için kullanılır.

docker stop dbserver

Container Silme

Bir containerı silmek/kaldırmak için container rm komutu kullanılır.

docker container rm dbserver

Yukarıdaki örnek komut dbserver isimli containerı siler.

Aynı işlemi rm komutu ile de yapabilirsiniz.

docker rm dbserver

Container Yeniden Adlandırma

Bir containerın adını değiştirmek için container rename komutu kullanılır.

docker container rename dbserver mysqlserver

Yukarıdaki örnek komut dbserver isimli containerın adını mysqlserver olarak değiştirir.

Container Ayrıntıları

Bir containerın detaylı olarak ayrıntılarını görmek isterseniz container inspect komutunu kullanabilirsiniz.

docker container inspect dbserver

Yukarıdaki komut dbserver isimli containerın detaylarını çıktılayacaktır.

Container Logları

Çalışan bir containerın çalışmaya başladığı andan itibaren ürettiği çıktıları container logs komutu ile görebilirsiniz.

docker container logs [Container]

Container Dosya Sistemini Almak

Bazı durumlarda containerın dosya sistemini almak isteyebilirsiniz. container export komutu belirtilen containerın dosya sistemini tar formatında çıktılar.

docker container export -o D:\Backup\db.tar dbserver

Yukarıdaki komut dbserver isimli containerın dosyalarını D:\Backup\db.tar olarak dışa aktaracaktır.

Container Ortam Değişkenleri

Bazı containerlar çalışmak için bazı tanımlamalara ihtiyaç duyabilir. Bu tanımlamalar; ayar ya da yapılandırma gibi bilgiler olabilir. Ortam değişkenlerini (Environment Variables) tanımlamak için -e bayrağı kullanılır.

docker run -e MYSQL_ROOT_PASSWORD=123456 mysql

Yukarıdaki örnek komut mysql image kullanarak MYSQL_ROOT_PASSWORD değeri 123456 olan bir container ayağa kaldırır.

Volume Mapping

Eğer bir container içerisinde değişiklik yaptıysanız ve containerı durdurulup başlatırsanız içerisinde yaptığınız değişikliklerin olmadığını görürsünüz.

Volume mapping işlemi için container içerisindeki bir dizin ile dışarıdaki bir dizini birbirine bağlama işlemi diyebiliriz. Böylece container başlatılırken içerikler dışarıdaki dizinden alınacaktır. Ayrıca içerideki dizinde bir işlem yapıldığında anında dış dizinde de değişiklik yapılır.

Bunun için -v bayrağından sonra ExternalDir:ContainerDir şeklinde belirtilir.

docker run -v /opt/datadir:/var/lib/mysql mysql

Burada /opt/datadir dizini Docker Engine tarafından erişilebilir bir dizin olmalıdır.

Network Türleri

Docker'da varsayılan olarak 3 farklı network türü vardır. Bunlar bridge, none ve host olarak isimlendirilir. Ve --network ile tanımlanır.

Bridge Network

Docker Host içerisinde her containerın farklı bir (yerel) IP adresi (genellikle : 172.19.0.*) üzerinde çalıştığı network tipidir. Docker tarafından varsayılan olarak bu kullanılır.

docker run --network=bridge mysql

None Network

Docker içerisinde erişilemeyen izole containerlar için kullanılır.

docker run --network=none mysql

Host Network

Sadece Docker Host içerisinden erişilebilir containerlar için kullanılır.

docker run --network=host mysql

Kullanıcı Tanımlı Network

Normal şartlarda Docker kullanmak için ihtiyaç duymasanız da bazı durumlarda kendiniz bir network tanımlama ihtiyacı duyabilirsiniz.

Aşağıdaki komut bir network oluşturmak için kullanılabilir;

docker network create --driver bridge --subnet 182.18.0.1/24 --gateway 182.18.0.1 wordpress-network

Yukarıdaki komut wordpress-network adında türü bridge olan ve yerel IP adresi 182.18.0 ile başlayan bir docker network oluşturur.

Networkleri Listeleme

Docker üzerinde var olan networkleri listelemek için aşağıdaki komutlardan biri kullanılabilir.

docker network ls

docker network list

Network Silme

Bir docker networkü silmek için rm komutu kullanılır.

docker network rm [Network]

Yukarıdaki komutta [Network] yerine silinecek network adını ya da ID'sini belirtmeniz gerekir.

Network Detayları

Bir network hakkında yapılandırma bilgileri gibi de dahil detayları görmek için containerlarda olduğu gibi inspect komutu kullanılabilir.

docker inspect [Network]

Containerı Network Üzerinde Kaldırma

Networklerin çalışma ortamında bir anlama sahip olabilmesi için elbette containerların bağlanabilmesi gerekir. Bir containerı ayağa kaldırırken --net bayrağı ile hangi networkü kullanacağını tanımlayabilirsiniz.

docker run --net [Network] mysql

Yukarıdaki komutta [Network] alanına network adı ya da ID'si belirtilmelidir.

Bu komut mysql image ile belirtilen network üzerinde bir container ayağa kaldırır.

Docker kurulumu ve docker terminalinin temel kullanımı genel hatları ile bu şekilde.