[Link].
net
docker version komutunu yazalım.
Bir Linux makine aynı zamanda hem docker server’dır hem de docker client’tır. Docker version
komutunu yazınca hem docker server’ın hem de docker client’ın hazır olduğunu görmekteyiz.
Daha detaylı bilgi almak için docker info komutunu yazmamız lazım
Bu sayede sistem ve versiyonla ilgili çok daha detaylı bir bilgi aldık.
Docker host ve docker client dışında fazladan docker machine hakkında bilgi almak istersek
docker-machine version
[Link]
docker-compose version komutuyla da docker compose versiyonu hakkında bilgi alabiliriz.
Docker compose ve docker machine’e şu an bu lab için ihtiyacımız yok. Çünkü docker composer çok
sayıda container’in yönetimi için kullanılır. Bizim bu lab için docker host ve docker client’a ihtiyacımız
bulunmaktadır. Bu girişten sonra ilk container’îmız için çalışmamızın zamanı geldi. Python
progromlama da nasıl ilk komutumuz ‘Hello World’ ise burada da ilk container’imiz ‘Hello World’
olacaktır.
Docker’ın container ile ilgili olan tool’larına docker container ls komutu ile bakabiliriz.
[Link]
Şu an makinemizde hiçbir container’in aktif olarak çalışmadığını görmekteyiz. Peki daha önceden
çalıştırdığımız ve tamamlanmış olan container’ları nasıl görebiliriz ? Linux’ta gizli dosyaları görmek için
ls -a komutunu kullanırız. Daha önceden çalışmış olduğumuz ve tamamlanmış containerları da ‘docker
container ls -a’ komutu ile görebiliriz.
Yukarıdaki screenshot’ta gördüğümüz üzere 3 ve 4 gün önce kullanmış olduğum Hello World ve nginx
container’larını detaylarıyla görebilmekteyiz. Yukarıdaki resimde görünen bu geçmişte kullanılmış
container’lar şu an çalışmıyorlar. Çalışmışlar ve bitmişler. Eğer bunları geçmişten silmek istiyorsam
‘docker container rm (id number)’ komutunu kullanabilirim.
‘docker container ls -a’ komutu ile tekrar geçmişe bakalım.
[Link]
Geçmişin silindiğini yukarıdaki resimde görmekteyiz.
‘docker container ls -a’ komutu ile geçmişten bir şey görmediğiniz durumda tekrardan docker container
ls ’ demeye gerek yoktur çünkü zaten şu an için aktif olarak çalışan bir container’ımız bulunmamaktadır.
Şu an makinemizde aktif olarak çalışan ve geçmişte çalışmış container yer almamaktadır.
Geçmişi temizlediğimize göre artık yeni bir başlangıç yapmak için ilk container’imizi çalıştırabiliriz.
Her container bir imaj üzerinden kurulur.
‘docker container run hello-world’ bu komutla container’imizi kurabiliriz.
Demek ki hello-world adında bir imajımız var. Bu imajda docker hub’ta yer alır. Peki bu yukardali
komutu yazdığımızda lokalimizde nasıl bir yapı olur ? Eğer imajı daha önceden lokalimize indirmişsek;
bu imaj üzerinden çalışılır. Eğer imaj lokalimizde yok ise, docker hub üzerinden bu komut vasıtası ile
download edilerek çalışma yapılır. Bütün container imajları docker hub’ta yer almaktadır.
İlk çalıştırdığımız docker container olan hello-world başarıyla kurulduğunu görmekteyiz.
Yukarıdaki resmimizde gördüğümüz output’un anlamı şudur:
Hello from Docker!
This message shows that your installation appears to be working correctly.
‘Kurulumumuz başarıyla tamamlandı’
To generate this message, Docker took the following steps:
’Kurulumun tamamlanması için Docker aşağıdaki aşamaları tamamladı.’
1. The Docker client contacted the Docker daemon.
‘Burada Docker client biziz yani kodu yazan taraf. Docker deamon ise docker host’tur. Bu durum
Docker Engine’nin başarıyla çalıştığını göstermektedir.’
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
‘Docker deamon komutumuz neticesinde Docker Hub’tan hello-world’ imajını indirdi.’
[Link]
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
‘Imaj’dan ilgili yeni container oluşturuldu.’
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
‘Output ekrana yansıltıldı sonuç olarak.’
Peki docker hub’ın adresi nedir: [Link]
Peki bu container şu an çalışıyor mu ? Hemen docker container ls yazalım
Hayır, çünkü hello-world çok kısa ömürlü bir container’dır. Bu uygulamanın amacı çalışıp, ekrana
output’u yansıtıp, sonlamaktır. Eğer bir web server ya da database container’i çalıştırsaydık; tabi ki bu
container çalışmaya devam edecektir. Hello-world container’i gibi kısa ömürlü olmayacaktır.
Hello World container’i bittiği halde hidden olarak docker container ls -a komutuyla görebiliriz.
[Link]
Şu an çalışmayan ve durdurulmuş container olan hello world’ün bilgisi ls -a komutuyla hidden
envanterden görebildik.
Container’i silmek isterseniz yukarıda kullandığımız gibi rm komutuyla id’sini kullanarak; silebilirsiniz.
Container’in id’si ve ismi otomatik olarak atanır. Biz kendimizde container’imiza isim verebiliriz. Ama
eğer biz container’imize isim vermezsek; bu durumda otomatik olarak isim atanır. Aynı container’dan
bir tane daha çalıştırırsanız; yeni container’in farklı bir id ve otomatik isim aldığını göreceksiniz.
Yukarıdaki örneğimizde yeniden hello-world containerimizi çalıştırdık. Container çalıştı ve kapandı. Ve
ls -a dediğimizde hidden envanterde farklı 2 isim ve id ‘de 2 farklo hello-world container’larını
görebiliyoruz. Container tarafından verilen otomatik isimler kendi database’inden gelmektedir. Bir sıfat
ve bir isimden olmak üzere 2 kelimeden oluşmaktadır.
Container’ları isimleriyle de silebiliriz aşağıdaki resimde görüldüğü gibi
[Link]
Daha önce değimdiğimiz gibi her bir container bir imaj üzerinden kurulmaktadır. Bunu Nesne Odaklı
Programlama mantığındaki gibi düşünebilirsiniz. Imaj bizim için class dediğimiz sınıf’tır. Container ise
o imajdan yani o sınıftan yaratılmış obje, nesnedir. İmaj bir kalıptır. Container ise o imajdan yaratılan
bir uygulamadır. Bu imajlar üzerinde çalışmamız için de daha önceden başkaları tarafından bu imajların
yaratılmış olması gerekmektedir. Bu labımızda NGINX dediğimiz web servis uygulamasını kuracağız. Bu
uygulamaya geçmeden önce ise docker hub’ı ziyaret etmekte fayda vardır. Bunun için web
browser’ınızda google’a lütfen ‘docker hub’ yazın.
Explore sekmesinden public olarak kullanabileceğimiz imajlara bakabiliriz:
[Link]
Biz bu labta nginx container’i ile çalışacağız. Komut satırında docker pull nginx yazdığımızda aşağıdaki
sayfadan container imajı lokalimizdeki host makinemize download edilecektir.
Terminal’de docker pull nginx komutunu yazarak nginx web servisini kurmuş olduk.
Docker Hub’tan hostumuza yaptığımız bu download, öncelikle imajın daha önceden yüklenip,
yüklenmediğini kontrol eder.Eğer download yapılmışsa daha önceden, güncel imajın olup olmadığını
kontrol edilir. Eğer imaj güncel değilse, en güncel olan sürüm docker hub’tan download edilir. Aşağıdaki
alpine container imajını download ederken; karşılaştığımız durum, buna örnektir.
[Link]
Her zaman her container imajının en güncel versiyonunu indirmek zorunda değilsiniz. İstediğiniz
versiyonu indirebilirsiniz. Nginx container’in 1.21 ve 1.20 versiyonları aşağıda görüldüğü gibidir.
‘docker image ls’ komutumla lokalimdeki imajlarıma bakabilirim.
Bu imajlardan istediğinizi de ‘docker image rm (imaj ismi)’ komutuyla silebilirsiniz. Mesela alpine
container’ini silelim ve tekrar ls diyelim. Sonuç aşağıdaki gibidir:
[Link]
Alpine container’ini tekrar yüklemek istersem. 'docker image pull alpine’ komutunu kullanmam lazım.
‘docker image ls’ dediğimizde alpine’i tekrar görürüz.
Peki biz web servisimiz olan nginx’i nasıl çalıştırırız ?
Start A Simple Web Server
‘docker container run --publish 80:80 nginx’ komutunu çalıştıralım. Bu komutta –publish 80:80’deki ilk
80 docker host’umuzun transport layer’ın http protokolündeki default port’udur. İkinci 80 ise
container’in portudur. Yani docker host’un portunu container’in portuna yönlendirmiş oluyoruz bu
sayede.
‘docker container run --publish 80:80 nginx’ komutunu çalıştırdığımızda aşağıdaki hata mesajını
alıyoruz.
[Link]
Çünkü şu an için http’de apache web servisi çalışmaktadır.
Lokal makinemizin IP’sine bakalım ‘ip address’ komutuyla.
Şu an HTTP’de Apache web servisin aktif olarak çalıştığını görmek için ‘systemctl status [Link]’
komutunu yazalım. Bunun için su – komutuyla ve password şifesiyle root hesabına geçmemiz lazım.
Bizim NGINX container’ini çalıştırmamız için öncelikle bu Apache web servisini kapatmamız lazım.
Kapatmadığımız sürece Apache servisi çalışmaya devam edecektir.
[Link]
IP Adresimizin [Link] olduğunu görmekteyiz. Yani biz linux veya windows host içinde web
browser üzerinden bu IP adresini yazarsak apache web servisinin index’indeki metini görürüz.
Apache web servisi çalıştığı sürece ister Linux ister Windows Host’tan [Link] nolu IP adresini
herhangi bir web brower’da yazalım; karşımıza hep ‘ Knowledge is Power. Power is Knowledge Club’
yazısı çıkacaktır. Bu yazı nasıl çıktı peki ? Çok basit index dosyasına ben yazdım. Birazdan size bunu
nasıl değiştireceğimizi göstereceğim.
İlgili index metni ‘cat /var/www/html/[Link]’ komutunu yazarak görüntületebiliriz root
hesabından.
Bu metni değişirmek istersem, ‘cat > /var/www/html/[Link]’ komutunu yazıp, ilgili metni
değiştirmem yeterlidir.
Bu dosya olmasaydı Apache Test sayfası gelmesi gerekirdi. Bu index’I orjinal dosya ile değiştirerek;
bunu yapabiliriz.
Bunun için ilgili move komutumuz: ‘mv /var/www/html/[Link] /var/www/html/[Link]’
komutuyla move ettim. Bu sayede ilgili index’I orjinal Apache test sayfası ile değiştirmiş oldum.
[Link]
Bizim normalde default olarak görmek istediğimiz mesaj budur. Docker host üzerinde bir apache web
servisini çalıştırıyorduk. Bunu nasıl kapatabiliriz ?
‘systemctl stop [Link]’ komutu ile
Üstüne ek olarak komple disable etmek istersem ne yapmam lazım:
‘systemctl disable [Link]’
Artık şimdi daha önceden çalıştırıp; hata aldığımız ‘docker container run --publish 80:80 nginx’
komutunu çalıştırabiliriz.
Artık NGINX container’imiz çalışmaktadır ve loglarımız da aktiftir. Ve logların sonuçlarını da görebilirim.
Logun nasıl değişeceğini görmek için öncelikle aynı adrese tekrar gidelim.
Şimdi log’un nasıl değiştiğine bakalım.
[Link]
Sayfayı refresh ettikçe logların değiştiğini aşağıdaki gibi görebilmekteyiz.
[Link] - - [26/Jun/2021:13:45:54 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT
10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36" "-
"
[Link] - - [26/Jun/2021:13:45:56 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT
10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36" "-
"
[Link] - - [26/Jun/2021:13:45:57 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT
10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36" "-
"
[Link] - - [26/Jun/2021:13:45:59 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT
10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36" "-
"
Cırtl+C ile çalşışan container’i kapatabilirsiniz.
Artık ls içinde nginx container’I gözükmemektedir. Ancak ls-a ile görebiliriz
Çalıştırdığımız bütün nginx ve hello-world container’larını görebilmekteyiz.
[Link]
Peki şu an aynı IP adresine gitmeyi denersem ne olur ? Şu an Nginx container’i çalışmıyor.
Nginx’I kapattığım için sayfaya ulaşılamamaktadır.
Şimdi ise labımıza ‘docker container run --publish 80:80 --detach --name webhost nginx’
komutumuzla devam edelim.
ya da kısa komut: docker run -p 80:80 -d --name webhost nginx
Bu komut ne anlama gelmektedir ? publish 80:80’e kadar olan kısmını yukarıda açıklayıp; kullanmıştık .
Detach demek, online kalmak için yani komut satırını almamız içindir. ‘—name webhost nginx’ ise nginx
container’imıza webhost ismini veriyoruz.
Şu an terminal’de komut girebiliyoruz. Peki bizim container’imiz çalışıyor mu ? Evet, ls diyip; görebiliriz.
[Link]
Hemen control edelim web sitesimize giderek:
Bildğiniz üzere Container’ın Hypervisor sanallaştırmasından pek çok farkı vardır. Herşeyin başında bir
işletim sistemi yoktur. Container’ın detaylarına görmek için:
‘docker container top webhost’
Container sanallaştırmasının, hypervisor sanallaştırmasından farkı sadece gerekli servislerin ve
processlerin çalışmasıdır.
Peki biz şu an arka planda çalışmaya devam eden container’ımıza nasıl bağlanabiliriz ?
‘docker container exec -it webhost bash’ komutunu bu task için kullanabiliriz.
Bu sayede container’imizin üzerinde bash’I kullanarak interaktif bir terminal açmış oluyoruz.
Container’imize bu şekilde bağlandıktan sonra container’imizdan ilgili bilgileri alabiliriz. Mesela
hostname bilgisini öğrenelim.
Bu sayede container’imizin ID’sini görmüş olduk. Kendi makinemizin ID’sini ise host’umuzda yeni bir
terminal sayfası açıp; admin hesabından root yazarak görebilirsiniz.
[Link]
Normalde admin hesabımızdan linux işletim sistemi üzerindeki processleri görebiliriz. Ama aynı şeyi
container’da göremeyiz. Çünkü container tarafında root veya admin’de olduğu gibi bir işletim
sistemimiz bulunmamaktar.
Container’da sadece nginx’I çalıştıracak kadar kaynağımız [Link] da kernel vasıtası ile docker
engine bize bu ortamı sunuyor.
Sadece ls gibi basit komutları çalıştırabiliyoruz. Soldaki ekran bizim container’imızken sağdaki taraf
bizim için docker host’tur. Şu an biz sol ekranda container’imızın içindeyiz. O zaman containerimizin
içindeki index dosyasını bulabiliriz. Peki bunu nasıl yapabiliriz ? ‘find / -name [Link]’ komutunu
kullanarak; bu taskı gerçekleştirebiliriz.
[Link]
Yani bizim index dosya uzantımızın olduğu yer: /usr/share/nginx/html/[Link]. Bunu
cat komutumuzla açarsak; aşağıdaki bilgilere ulaşırız: cat /usr/share/nginx/html/[Link]
Doğal olarak buradaki yazı daha önceden yukarıda paylaştığımız nginx web sayfasındaki yazı ile
aynıdır. Çünkü o yazı buradan gelmektedir.
Peki ben bunu overwrite yapabilir miyim ? Evet tabi ki de cat > komutuyla yapabiliriz:
cat > /usr/share/nginx/html/[Link]
Şimdi tekrar nginx sayfasına bakarsak; sayfadaki mesajın bu şekilde değiştiğini göreceğiz.
[Link]
Bu özelliği sağlayan şey: Docker Internals’daki namespace fonksiyonu’dur.
Exit diyerek container’ımızdan çıkabiliriz.
Nginx container’imız halen çalışıyor mu ? ls ile control edelim
Stop diyerek container’imizi durdurabiliriz. Rm diyerek ise silebiliriz.
Stop ettikten sonra ls dersek; container’ımızın çalışmadığını göreceğiz.
[Link]
Bu durumda artık web sayfamız çalışmayacaktır.
Özetle gördümüz üzere container’lar processlerden ibarettir ve vm’ler gibi çalışmamaktadır. Bu yüzden
container’ları birer application olarak düşünmek daha mantklıdır.
Peki bu kullandığımız imajlar ilgili vendorlar tarafından nasıl yaratılır Docker Hub’ta ? Imajlar Dockerfile
üzerinden yaratılır. Bu sayede dockerfile’dan nasıl imaj oluşturulduğuna detaylı bir şekilde bakabilir
hatta imajı bu şekilde değiştirebilirsiniz bile.
Docker Hub’tan nginx container’ini seçip; en son versiyonun üstüne tıkladığınızda aşağıdaki detayları
görebilirsiniz: