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.