Docker’a Giriş 2

Emre Emanet
6 min readOct 15, 2022

--

Docker Volume

Docker volume’ler aynen docker container ve image gibi bir docker objesidir. Varsayılan olarak volumeler docker deamonun bulunduğu sunucu üzerinde yaratılır. Ancak NFS yada cloud gibi bir alanı da docker volume’e bağlayabiliriz.

Docker üzerinde bir volume yaratmak için:

➜ ~ docker volume create ilkvolume
ilkvolume

Oluşturduğumuz volume’ün özelliklerine bakmak istersek docker volume inspect container_name komutunu kullanıyoruz.

➜  ~ docker volume inspect ilkvolume 
[
{
"CreatedAt": "2022-08-22T07:30:02Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/ilkvolume/_data",
"Name": "ilkvolume",
"Options": {},
"Scope": "local"
}
]

CreatedAt: Volume oluşturulma zamanını

Driver: Kullanılan volume için oluşturulan driver’ın türünü

Mountpoint: Volume’ün nereye bağlı olduğunu gösterir.

Volume bağlarken bir container içerisinde yer alan bir klasöre bağlama zorunluluğumuz bulunmuyor. Farklı bir klasör oluşturup o klasöre de bağlayabiliriz. Eğer klasör yoksa container çalıştırılırken bu klasör Docker tarafından oluşturulur.

Docker volumeleri listelemek istersek docker volume ls komutu ile var olan volumeleri listeleyebiliriz.

➜ ~ docker volume ls
DRIVER VOLUME NAME
local ilkvolume

Oluşturduğumuz volume’ü sadece okunabilir (read only) yapmak istiyorsak:

➜ ~ docker container run -it -v ilkvolume:/uygulama:ro alpine sh
/ # cd uygulama/
/uygulama # touch deneme.txt
touch: deneme.txt: Read-only file system
/uygulama #
  1. Eğer bir volume mount edildiği klasör mevcut değilse bu klasörü yaratır. O anda volume içerisinde hangi dosyalar varsa bu klasörde de o dosyaları görürsünüz.
  2. Eğer bir volume image içerisinde bulunan mevcut bir klasöre mount edilirse
  • Klasör boşsa o anda volume içerisinde hangi dosyalar varsa bu klasörde de o dosyaları görürsünüz.
  • Klasörde dosya varsa ve volume boşsa bu bu sefer o klasördeki dosyalar volume’e kopyalanır.
  • Klasöre dosya var yada yok fakat volume’de dosyalar varsa yani volume boş değilse, bu sefer o klasötün içerisinde volume’de ne dosya varsa onu görürsünüz.

Bir sefere mahsus container run edip ardından containerı silmek istiyorsak:

➜ ~ docker container run - rm -it alpine sh
/ #

Docker Plugin

Docker pluginleri, Docker Engine’e yetenekler ekleyen uzantılardır.

Plugin Türleri

  • Storage
  • Logging
  • Secrets
  • Network

Kullandığımız docker’da hangi pluginler yüklü görmek istersek:

Docker Network

Bir sunucunun ağ altyapısı nasılsa Docker’da da ağ altyapısı aynıdır. Bu ağ altyapısını sağlayan sistem Docker Network Driver adı verilen sistemdir.

Container sistemlerin bir birleriyle ve dış network ile haberleşmesi, dış networkten içeriye erişim sağlanmasını tüm iletişim altyapısını Docker network objeleriyle çalışır.

Bridge

Varsayılan olarak gelen driver bridge’dir. Network objesi oluşturulurken özellile başka bir driver belirtilmez ise bridge driver’ı ile network oluşturulur.

Her Docker kurulu host üstünde bridge driver ile oluşturulmuş “Bridge” adında bir network bulunur ve container yaratıldığında aksi belirtilmediği sürece varsayılan olarak buna bağlanır.

* Default bridge driver’ında DNS tanımlaması bulunmaz. DNS tanımlaması için kullanıcı tanımlı bridge driverı tanımlaması yapmak gerekmektedir.

Host

Her sistemde host driver ile oluşturulmuş “Host adında bir network bulunur. Bu network’e bağlı container’da network izalasyonu olmaz. Sanki o host üstünde çalışan bir process gibi host’un ağ kaynaklarını kullanır.

Macvlan

Macvlan ile oluşturulan bir docker network objesine bağlı container’lara direk birer MAC adresi atayarak mevcut ağa bağlı birer fiziksel cihaz gibi davranmaları sağlanabilir. Docker network trafiğini container’a bu MAC adresi üzerinden yönlendirir. NAT yada IP routing yapmadan container’ın direk ağ ile haberleşmesi sağlanır.

Overlay

Ayrı hostlar üstündeki containerların aynı ağda çalışıyormuş gibi çalışması istendiği zaman overlay networkler devreye girer.

None

Container hiç bir şekilde ağ bağlantısına sahip olmaması istenirse bu driver ile oluşturulan networke bağlanır.

Docker Port Publish

Port publish, container’ların dışarıdan erişimi için host makine ile container arasında port ayarlaması yaparak iletişim sağlama işlemidir.

Kullanımı:

-p host_port:container_port
- publish host_port:container_port

Port publish ederken açtığımız portlar normalde TCP portudur. UDP portu için ayrıca şu ifadeyi girmek gerekmektedir.

-p host_port:container_port/udp

Kullanıcı Tanımlı Bridge

Container’ları default bridge bağlamayarak kullanıcı bazlı bridge ile ayrı ayrı bridge gateway oluştururarak network izalasyonu sağlayabiliriz.

  1. Containerlar arası network izalasyonu sağlamak istersek ayrı bride networkler yaratarak bunu sağlayabiliriz.
  2. Varsayılan dışında IP tanımlaması yapılabilir.
  3. Kullanıcı tanımlı brige network bağlı containerlar birbirleriyle isimler üzerinden haberleşebilirler. DNS çözümlemesi sağlar.
  4. Containerlar çalışır durumdayken de kullanıcı tanımlı bridge networklere bağlanıp, bağlantıyı kesebilirler.

Kullanıcı tanımlı bridge network yaratmak için:

➜ ~ docker network create kopru1
0ed3009805ea440ec3bb2e14cb49f8a5b88d23e33cea179ad6442d6482001a9a

Yarattığımız bridge networkünü bir containerda kullanmak için:

➜ ~ docker run -dit - name database - net kopru1 ozgurozturknet/adanzyedocker sh

Attach olduğumuz container’ın içerisinden container’ı kapatmadan çıkmak için:

CTRL+Q yada read escape sequence

/usr/src/myapp # read escape sequence
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55cc8f2d1701 ozgurozturknet/adanzyedocker "sh" 10 minutes ago Up 7 minutes 80/tcp database
f0d32204f2cc ozgurozturknet/adanzyedocker "sh" 10 minutes ago Up 10 minutes 80/tcp websunucu

Subnet, IP Range ve Gateway belirlemek istiyorsak:

➜  ~ docker network create --driver=bridge --subnet=10.10.0.0/12 --ip-range=10.10.10.0/24 --gateway=10.10.10.10 kopru2 
7793ab2bafb0db7a76d68c350f781af8b400d6c3c79aac3a879411d268bc7492
➜ ~ docker network inspect kopru2
[
{
"Name": "kopru2",
"Id": "7793ab2bafb0db7a76d68c350f781af8b400d6c3c79aac3a879411d268bc7492",
"Created": "2022-08-31T19:39:12.982568939Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.10.0.0/12",
"IPRange": "10.10.10.0/24",
"Gateway": "10.10.10.10"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
➜ ~

Mevcut bir container’ı yarattığımız bir network driver’ın bağlamak yada değiştirmek istersek:

docker network connect kopru2 websunucu

Aşağıda 2 adet network driver’ı var sebebi ise kopru2 container’ı mevcuttaki container’a bağladık.

➜  ~ docker network connect kopru2 websunucu 
➜ ~ docker attach websunucu
/usr/src/myapp # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:13:00:02
inet addr:172.19.0.2 Bcast:172.19.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:31 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2554 (2.4 KiB) TX bytes:952 (952.0 B)
eth1 Link encap:Ethernet HWaddr 02:42:0A:0A:0A:00
inet addr:10.10.10.0 Bcast:10.15.255.255 Mask:255.240.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1112 (1.0 KiB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/usr/src/myapp #

Mevcutta bağlı olduğu network driver’ının bağlantısını kopartmak istersek:

docker network disconnect networkdriveradi containeradi

➜  ~ docker network disconnect kopru1 websunucu 
➜ ~ docker attach websunucu
/usr/src/myapp # ifconfig
eth1 Link encap:Ethernet HWaddr 02:42:0A:0A:0A:00
inet addr:10.10.10.0 Bcast:10.15.255.255 Mask:255.240.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:17 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1462 (1.4 KiB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/usr/src/myapp #

Bir network driver’ını silmek istersek

➜  ~ docker network rm networkdriveradi

--

--

No responses yet