Özgün Koyun Özgün Koyun

Docker Notlarim - I

  linux

Asagidaki notlari “John Willis” tarafindan hazirlanmis YouTube videolarini izlerken aldim.

Asagidaki notlar hazirlandigi sirada bilgisayarimda kurulu Docker versiyonu 1.9.1, build a34a1d5 seklindeydi.

ps

Calisan calismayan tum container’lari listelemek icin:

$ docker ps -a
$ docker ps -aq

Sadece calisan docker container’larini listelemek icin:

$ docker ps
$ docker ps -q

Calisan en son container’i gormek icin:

$ docker ps -l
$ docker ps -lq

run

Bir docker image’ini kullarak bir container olusturmak icin asagidaki komut kullanilir. Eger image henuz inidirilmemisse, yani docker images ila baktigimizda listede gozukmuyorsa, oncelikle o image Docker Hub’dan indirilir.

$ docker run busybox

run -i

run komutunu -i parametresi ile calistirdigimizda, eger container olusturuldugunda calisacak olan default komut(Dockerfile’de bu CMD ile belirlenmistir) bizden input alacak bir komut ise(ornegin sh), container’in icinde shell komutlarini calistirabiliriz. busybox image’ini kullanarak bir container olusturudugumuzda default olarak sh komutu calisir, ve bu bizim komut girmemizi saglar.

$ docker run -i busybox

Eger busybox image’indeki komutu asagidaki gibi override edersek, bu durumda container bir input icin beklemeden calisip hemen sonlanacaktir.

$ docker run -i busybox echo hello
$ docker run -i busybox touch file.txt

Yukaridaki komutlari calistirdiktan sonra docker ps -a ile kontrol edersek, durmus olan container’lari gorururuz.

CONTAINER ID  IMAGE    COMMAND          CREATED          STATUS                      PORTS NAMES
f63efc5ad449  busybox  "touch file.txt" 7 seconds ago    Exited (0) 7 seconds ago          prickly_poitras
902c6abd891d  busybox  "echo hello"     12 seconds ago   Exited (0) 11 seconds ago         sharp_tesla
76d675c8ca65  busybox  "sh"             25 seconds ago   Exited (0) 17 seconds ago         tender_morse

run -t

Container’a bir pseudo terminal araciligiyla baglanmamizi saglar.

t parametresi ile ilgili detayli bilgi bu linkte bulunabilir.

$ docker run -t busybox

Yukaridaki komuttan sonra CTRL+C ile tty(pseudo termnial)’dan cikilir. Cikmis olmamiza ragmen docker ps komutu ile calisan container’lara baktigimizda hala busybox conainter’ini goruruz. docker stop komutu ile container’in calismasini durdurabiliriz.

run -it

Intercative shell istiyorsak -it parametersini kullaniriz. Asagidaki komut ile olusturdugumuz container’in icine girip komutlarimizi calistirmaya baslayabiliriz.

$ docker run -it busybox

Container’in icindeyken exit komutu ile cikarsak container calismayi durdurur, docker ps komutu ile calisan container’i gormeyiz.

run -itd ve attach

Asagidaki komut ile “busybox” image’ini kullanarak bir container olusturulur ve bu container arka planda(detached mode) calismaya devam eder.

$ docker run -itd busybox

Yukaridaki komut ile calistirilan container’a baglanmak icin once docker ps komutu ile calisan container’lara bakip container ID’sini ogreniriz.

CONTAINER ID  IMAGE    COMMAND  CREATED        STATUS        PORTS  NAMES
b0599d3a63f8  busybox  "sh"     4 seconds ago  Up 4 seconds         berserk_hawking

Yukaridaki ciktidan gorulecegi uzere “busybox” image’inden olusturulan container calisir calismaz biz herhangi bir parametre gecmedigimiz icin busybox’un Dockerfile’inda tanimlanan sh komutunu calistirmis.

Container’a baglanmak icin ise asagidaki komutu kullaniriz. Asagidaki komuttan sonra, komut satirina dusmek icin Enter’a basilir.

$ docker attach b0599d3a63f8

Eger container’i calistirirken “busybox” image’i icin tanimlanmas default komut yerine kendi istedigimiz bir komutun calistirmasini istiyorsak:

$ docker run -itd busybox /bin/dmesg

Yukaridaki komutu calistirdiktan sonra docker ps komutu ile calisan container’lara baktigimizda bu son container’i goremeyiz. Cunku /bin/dmesg komutu kullanicidan bir input beklemedigi icin calisip sonlanir ve bu da container’in calismasini durdurur. Duran container’a ait bilgileri gormek icin docker ps -a komutunu kullandigimizda asagidaki bir cikti aliriz:

CONTAINER ID  IMAGE   COMMAND       CREATED         STATUS                     PORTS   NAMES
5b42f93e1da2  busybox "/bin/dmesg"  10 seconds ago  Exited (0) 9 seconds ago           evil_snyder

Yukaridaki ciktidaki STATUS sutunu bize container’in sonlandigini gosterir.

/bin/dmesg yerine /bin/cat gibi kullanicidan bir input bekleyen bir komut calistirsaydik, o zaman container arka planda calismaya devam edecekti ve docker ps ile baktigimizda calisan container’lar arasinda gorebilecektik.

$ docker run -itd busybox /bin/cat
$ docker ps

Yukaridaki komutlarin ciktisi:

CONTAINER ID  IMAGE    COMMAND     CREATED        STATUS        PORTS   NAMES
4c62b281274d  busybox  "/bin/cat"  2 seconds ago  Up 1 seconds          big_saha

--name

Bir docker image’ini calistirirken isim vermek icin kullanilir.

$ docker run --name john1 -itd busybox

stop

Calisan container’lari durdurmak icin once docker ps ile calisan container’lari buluruz sonra stop komutu ile durduruz.

$ docker stop 6e41ef36fdc7

stop komutu biraz yavas calisir.

Eger docker container’ini calistirirken --name parametresi ile bir isim vermissek, stop komutunu o verdigimiz isimle birlikte de calistirabiliriz.

$ docker stop john1

kill

kill komutu stop komutuna gore daha hizli calisir.

Sadece bir tane container’i durdurumak icin:

$ docker stop 6e41ef36fdc7

kill komutu ile tum calisan docker container’larini durdurmak icin:

$ docker kill $(docker ps -q)

En son calistirdigimiz container’i durdurmak icin:

$ docker kill $(docker ps -ql)

rm

Docker container’larinin container ID’si kullanilarak veya isimleri kullanilarak silinmesi.

$ docker ps -a
$ docker rm a759cdfefc9d
$ docker rm john1

Durmus olan tum container’larin silinmesi icin asagidaki komut kullanilir:

$ docker rm $(docker ps -aq)

restart

Calisan bir docker container’ini durdurup baslatmak icin restart komutu kullanilir.

$ docker run -itd busybox
$ docker restart ebf3e3609c56

exec

Bir docker container’inda bir process calistirmak icin exec komutu kullanilir.

$ docker run -itd busybox
$ docker exec ebf3e3609c56 ls

Container’in Izlenmesi

logs

Container’in output’a bastigi log’lari gormek icin kullanilir.

$ docker run -itd busybox cat /etc/hosts
$ docker logs $(docker ps -alq)

Yukaridaki komutlarin ciktisi asagidaki gibi olur:

172.17.0.2      7c9d96519bdc
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

inspect

Bir container hakkinda detayli bilgi almak icin inspect komutu kullanilir.

$ cid=$(docker run -itd busybox)
$ echo $cid
$ docker inspect $cid

stats

Calisan bir container’in ne kadar kaynak tukettiginin, disk IO, ve network trafiginin gorulmesi.

$ docker run -itd --name job1 busybox
$ docker stats job1

top

Calisan bir container’daki process’lerin ne kadar kaynak tukettiginin gorulmesi.

$ docker run -itd --name job2 busybox
$ watch docker top job2 -ef

Docker image’leri

Sistemimizde kurulu Docker image’lerini listelemek icin:

$ docker images

Bir image hakkinda detayli bilgi almak icin:

$ docker inspect busybox

history

“busybox” image’ini kullarak bir container olusturulma asamasinda “busybox” image’inin nasil bir surecten gectigini gormek icin asagidaki komutu kullaniriz.

$ docker history busybox

Yukaridaki komutun ciktisi su sekilde:

IMAGE         CREATED      CREATED BY                                      SIZE      COMMENT
ac6a7980c6c2  4 weeks ago  /bin/sh -c #(nop) CMD ["sh"]                    0 B       
c00ef186408b  4 weeks ago  /bin/sh -c #(nop) ADD file:c295b0748bf05d4527   1.113 MB  

Docker hub’da image aramasi yapmak:

$ docker search ubuntu

En az 10 star almis docker image’leri arasindan arama yapmak:

$ docker search -s 10 ubuntu

pull

En son “ubuntu” docker image’ini Docker Hub’dan indirmek icin:

$ docker pull ubuntu

“14.04” ile tag’lenmis “ubuntu” docker image’ini indirmek icin ise:

$ docker pull ubuntu:14.04

Data Volumes

Tek container islemleri

Bir docker container’inde bir data volume olusturmak icin -v parametresi kullanilir. Asagidaki komut ile bir volume olusturulur ve bu volume /john1 seklinde container’in icinde mount edilir. Olusturulan volume host sistemde /var/lib/docker/volumes klasorunde tutulur. Bu volume’e yazilan veri docker image’i silinse dahi silinmez. Ayrica bu volume diger docker container’larinda ortak kullanilabilir.

$ docker run -it -v /john1 busybox
#inside-container> cd /john1
#inside-container> touch file1

Host sistemdeki bir path’i, calistirdigimiz bir docker container’ina mount etmek:

$ mkdir /tmp/john1
$ docker run -it -v /tmp/john1:/john1 busybox

Sadece klasorler degil dosyalari da ayni sekilde mount edebiliriz:

$ docker run -it -v ~/.bash_history:/.bash_history busybox

Bazi durumlarda host’taki dosya veya klasorlerin containerin icinden degistirilmemesi icin readonly mount etmek isteyebilirz. Ornegin host’taki ~/.vimrc dosyasini container’a mount readonly mount edelim.

$ docker run -it -v ~/.vimrc:/.vimrc:ro busybox

Volume’larin Paylasilmasi

Asagidaki ornekte, once “john1” adinda bir container olusturuluyor, ve bu container’da /john1 volume’u olusturuluyor. Bu container hala calisir durumdayken, “john2” adinda yeni bir container olusturuluyor bu container olusturulurken “john1” container’indaki volume “john2” containerina mount ediliyor:

$ docker run -it --name john1 -v /john1 busybox
$ docker run -it --name john2 --volumes-from john1 busybox

Network Tricks

Calisan bir docker container’inin IP adresini ogrenmek. cid = container ID, nid = IP Address of Container

$ cid=$(docker run -itd busybox)
$ echo $cid
$ nid=$(docker inspect --format '' $cid)
$ echo $nid