docker cok kullanilan komutlar kisa kisa – Adim 3

Evet , hizlica cok kullanilir komutlari inceleyip gecelim ….

Elimizde docker container kuracak hangi imajlar var bakalim.

vahric:~ vahricmuhtaryan$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              0f0e96f1f267        10 days ago         177.5 MB
ubuntu              latest              b72889fa879c        2 weeks ago         188 MB

Ilgili kolonlari acikalamak gerekir ise repo adi olarak redis , sanki bir klasor acilmis ve icersine latest diye bir imaj koyulmus , her bir imajin tekil bir numarasi , ne zaman yaratildigi ve kapladigi alani belirtilmis.

Ek olarak isterseniz docker images <repo_adi> seklinde veya docker images <repo_adi>:tag gibide listeleme yapabilisiniz ama aradiginiz seyin %100 uyusmasi gerekiyor repo* veya re?po gibi bir arama mekanizmasi yok !

Simdi, bir imaj indirelim, diyelim centos en son surum ki burada ek birsey belirmeye gerek yok kendisi <tag> kismina bakarsaniz latest olarak belirtmis yani en son version centos.

vahric:~ vahricmuhtaryan$ docker pull centos
Using default tag: latest

fakat diyelim siz en son surumu degilde bir onceki veya olan 6.6 surumune sahip imaji indirmek istiyorsunuz. Asagidaki komutta bir ustteki satira gore farki kullandigimiz <tag> yani centos:6.6  . Tag lar “:” den sonra belirtiliyor.

vahric:~ vahricmuhtaryan$ docker pull centos:6.6
6.6: Pulling from library/centos

Hemen kisa bir not, ilgili “pull” komutu Docker HUB dan ilgili imajlari cekiyor. Burada istenir ise imaj farkli repolardan cekilebilir bunun icin imajin cekilecegi URL belirtilmesi yeterli yani http(s)://xyz.com/imaj1 gibi ….

Cok kullanilir mi supheliyim ama Citrix Netscaller CPX kurmak icin karsima cikti , imaj dosyalarini STDIN ve STDOUT yontemleri ile imajlari upload edip download edebiliyorsunuz ilgili Docker node’undan

vahric:~ vahricmuhtaryan$ docker load -i /Users/vahricmuhtaryan/Downloads/cpx-11.1-48.10.gz
0bf056161913: Loading layer [==================================================>] 196.8 MB/196.8 MB
1796d1c62d0c: Loading layer [==================================================>] 208.9 kB/208.9 kB
.
.

Tabi load varken birde export olmali , bunu icinde asagidaki komut ile ilgili imaji ilgili isim ile export edip karsi makineye scp ile aktarip veya docker-machine ile yonetiyorsaniz docker-machine komutlarini calisitirdiginiz makineden import edebilirsiniz.

vahric:~ vahricmuhtaryan$ docker save -o /Users/vahricmuhtaryan/Downloads/ubuntu ubuntu

vahric:~ vahricmuhtaryan$ eval $(docker-machine env DockerNode1)
vahric:~ vahricmuhtaryan$ docker load < /Users/vahricmuhtaryan/Downloads/ubuntu c854e44a1a5a: Loading layer [==================================================>] 132.8 MB/132.8 MB
8ba4b4ea187c: Loading layer [==================================================>] 15.87 kB/15.87 kB
46c98490f575: Loading layer [==================================================>] 9.728 kB/9.728 kB
1633f88f8c9f: Loading layer [==================================================>] 4.608 kB/4.608 kB
0e20f4f8a593: Loading layer [==================================================>] 3.072 kB/3.072 kB
Loaded image: ubuntu:latest
vahric:~ vahricmuhtaryan$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              f753707788c5        3 weeks ago         127.2 MB
hello-world         latest              c54a2cc56cbb        4 months ago        1.848 kB
vahric:~ vahricmuhtaryan$ docker run -it ubuntu bash
root@cadbac90fbee:/# uname -a
Linux cadbac90fbee 4.4.0-45-generic #66-Ubuntu SMP Wed Oct 19 14:12:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

Hemen bir flashback , gercekten oyle mi oldu ?! Hemen iki tane container yaratalim biri centos7 digeri ise centos 6.6

vahric:~ vahricmuhtaryan$ docker run -it centos:6.6 bash 
[root@95b8d7740030 /]# cat /etc/redhat-release 
CentOS release 6.6 (Final)
[root@95b8d7740030 /]# exit
exit
vahric:~ vahricmuhtaryan$ docker run -it centos bash 
[root@75126d3aa78d /]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 

Ilk komut satirinda “docker run” ile bir container calistirdik , sonra -i interactive , -t console veya tty ayarladik , hangi imaji kullanacagimizi belirledik ve bash i calistirdik sonrasinda OS surumlerini kontrol ettik …

Calistiracagimiz container uzun zamanli is yapicak bir web server , db veya loadbalancer olabilir bunu icin -d paramteresini belirtmek ve islemi sankli linux console’da & kullaniyor gibi arkaya atmamiz gerekebilir.

vahric:~ vahricmuhtaryan$ docker run -d nginx
e9156f74eed1086d6781c9e700ad94242b0933ef27253f57f0756b4fe6447d25

Daha sonra bu calisan container’i durdurmak isteyebilirsiniz, burada “docker stop” komutunu vererek isterseniz container name isterseniz id kullanabilirsiniz , id illa tam yazmak zorunda degilsiniz , cakisma olmadigi surece id’yi tam kullanmadanda container’i durdurabilirsiniz.

docker stop –> Once SIGTERM daha sonra SIGKILL gonderir

docker kill –> Direkt SIGKILL gonderir , yani kill -9 PID gibi

vahric:~ vahricmuhtaryan$ docker stop e91
e91

Daha sonra durdurdugunuz container’i “docker restart” diyip yeniden baslatabilirsiniz.

Simdi bir daha container lari listeledigimizde goreceksiniz ki bu container lara birer isim verilmis (adoring…. ve prickly….) ve durumlari “exited” yani isi bitmis ve sanki process kill olmus gibi.

Eger siz isim vermek isterseniz “docker run -it –name vaho1 centos bash” seklinde kullanabilir , islem bittikten sonrada otomatik olarak container’i silmek istiyorsanizda “docker run -it –rm –name vaho2 centos bash” kullanabilirsiniz.

vahric:~ vahricmuhtaryan$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
75126d3aa78d        centos              "bash"              9 minutes ago       Exited (0) 3 seconds ago                       adoring_ramanujan
95b8d7740030        centos:6.6          "bash"              10 minutes ago      Exited (0) 2 minutes ago                       prickly_bhabha

Oldu ya bilmiyordunuz (–rm) i o zaman is basa dustu bu kez asagidaki komutu kullanacagiz

vahric:~ vahricmuhtaryan$ docker rm 856fa90367bf 75126d3aa78d 95b8d7740030
856fa90367bf
75126d3aa78d
95b8d7740030

Hemen ekleyelim docker rm nasil container siliyor ise docker -rmi <image>:tag imajlari siliyor

Pull kismini gecemeden once birkac onemli nokta var ,  Docker Hub da envayi cesit public imajlar gorebilirsiniz . Mesela -ubuntu- diye aratiginizda Repo Info ve Tag diye iki kisim goreceksiniz burada Tag kismina baktiginizda daha once belirttigimiz farkli versionlari nasil pull edebileceginizi goreceksiniz.

Illa Docker Hub a gitmeye gerek yok, cli’dan asagidaki sekilde tarama yapabilirsiniz ama <tag> lari goremiyorsunuz.

vahric:~ vahricmuhtaryan$ docker search ubuntu
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                            Ubuntu is a Debian-based Linux operating s...   3786      [OK]       
ubuntu-upstart                    Upstart is an event-based replacement for ...   61        [OK]       
torusware/speedus-ubuntu          Always updated official Ubuntu docker imag...   25                   [OK]
rastasheep/ubuntu-sshd            Dockerized SSH service, built on top of of...   24                   [OK]
ubuntu-debootstrap                debootstrap --variant=minbase --components...   23        [OK]       

Soyle ilginc bir kullanim var, repoya ait tum taglar cekilebilir.

vahric:~ vahricmuhtaryan$ docker pull --all-tags fedora

Onun yerine curl ile ilgili registery’den sorgulama yapilabilir.

vahric:~ vahricmuhtaryan$ curl -G https://registry.hub.docker.com/v1/repositories/ubuntu/tags
[{"layer": "4ef6a5ec", "name": "latest"}, {"layer": "3db9c44f", "name": "10.04"}, {"layer": "a77ec755", "name": "12.04"}, {"layer": "a77ec755", "name": "12.04.5"}, {"layer": "c5881f11", "name": "12.10"}, {"layer": "463ff6be", "name": "13.04"}, {"layer": "195eb90b", "name": "13.10"}, {"layer": "66e0fb0f", "name": "14.04"}, {"layer": "5ba9dab4", "name": "14.04.1"}, {"layer": "63e3c102", "name": "14.04.2"}, {"layer": "8693db7e", "name": "14.04.3"}, {"layer": "66e0fb0f", "name": "14.04.4"}, {"layer": "dce38fb5", "name": "14.10"}, {"layer": "314a1f07", "name": "15.04"}, {"layer": "9a83b548", "name": "15.10"}, {"layer": "4ef6a5ec", "name": "16.04"}, {"layer": "3db9c44f", "name": "lucid"}, {"layer": "a77ec755", "name": "precise"}, {"layer": "1f80e9ca", "name": "precise-20150212"}, {"layer": "5898adab", "name": "precise-20150228.11"}, {"layer": "9610cfc6", "name": "precise-20150320"}, {"layer": "ac6b0eaa", "name": "precise-20150427"}, {"layer": "5c97af89", "name": "precise-20150528"}, {"layer": "78cef618", "name": "precise-20150612"}, {"layer": "6d021018", "name": "precise-20150626"}

Simdi container’lara erismek icin portlari acalim …

Normalde elimizde bir web server veya bir nginx load balancer var ise 80 ile 443 nolu portlarindan veya mikroservislerin onlerine bu sekilde load balancerlar koyacak isek bunlara erisebilir olmamiz gerekiyor. Diyelim elimizde biz nginx load balancer var ve 80 ile 443 nolu portlarin disardan erisime acmak istiyoruz ;

-p Parametresi container icersindeki portlari Docker Host uzerinde expose ediyor.
Format soyle -p Docker_Host_Uzerindeki_Port:Container_Uzerindeki_Port . Asagida gorebileceginiz gibi -p ile ayri ayri tanimlayarak container icersinde calisan nginx’in 80 ve 443 nolu portlarini disaridan erisilebilmesi icin Docker Host uzerindede yine 80 ve 443 olarak aciyoruz, buna zorunda degiliz mesela 40000:80 ve 34000:443 de olabilirdi yani Docker Host uzerinde 40000 numarali port container’in 80 portunu , 34000 portuda 443 portunu gsteriyor olabilir.

vahric:~ vahricmuhtaryan$ docker run -d -p 80:80 -p 443:443 nginx 
1e35b0360a784221b0b13b37f9ace362c511661719faad10389111205e125c0b

Ilgili port eslesmelerini asagida yine “docker ps” diyerek gorebilir veya docker port <ct_name> diyerek elde edebilirsiniz.

vahric:~ vahricmuhtaryan$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
1e35b0360a78        nginx               "nginx -g 'daemon off"   10 seconds ago      Up 7 seconds        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   suspicious_swartz

vahric:~ vahricmuhtaryan$ docker port suspicious_swartz
443/tcp -> 0.0.0.0:443
80/tcp -> 0.0.0.0:80

-p paramteresini kullandigimizda biz aslinda ilgili port icin hem tcp hemde udp olarak aciliyor , gordugum kadariyla -p 161/udp diyerete expose yapabilirsiniz.

Diger bir yontemde cok fazla docker container’in oldugu bir host’da port kovalamaca yapmaktansa -P parametresi ile docker’in rastgele port atamasini saglamak.

vahric:~ vahricmuhtaryan$ docker run -d -P nginx 
5f42e1f8cb6525087429b57241c5246341367dfe47780a722b49dd0531415b58

vahric:~ vahricmuhtaryan$ docker port 5f42
443/tcp -> 0.0.0.0:32770
80/tcp -> 0.0.0.0:32771

Docker Host’lar uzerinde iptables cikti ornegi🙂 portlari yukardaki cikti ile karsilastirmayin, farkli zamanlarda alinmis ornekler.

Chain DOCKER (2 references)

pkts bytes target     prot opt in     out     source               destination

0     0 RETURN     all  —  docker0 *       0.0.0.0/0            0.0.0.0/0

0     0 DNAT       tcp  —  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:32776 to:172.17.0.2:443

0     0 DNAT       tcp  —  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:32777 to:172.17.0.2:80

Docker Link(legacy) ve Docker Container’a environment variable set etme

Docker link containerlar arasinda bilgi transferi ve discovery icin kullaniliyor.

Diyelimki elimizde “nginx” diye bir container var ve baska bir makineyi bu container’a linklemek istiyoruz –link ve linkleyecegimiz containerin adi , istenir ise –link nginx:takma_adi seklindede baglanabilir. Bu sekilde nginx makinesini gosteren tum bilgiler environment variable olarak yeni calistirdigimiz container’a gelecek.

vahric:~ vahricmuhtaryan$ docker run -it --link nginx ubuntu bash -c export
declare -x HOME="/root"
declare -x HOSTNAME="f73fcfe9d9cb"
declare -x NGINX_ENV_NGINX_VERSION="1.9.15-1~jessie"
declare -x NGINX_NAME="/gloomy_bohr/nginx"
declare -x NGINX_PORT="tcp://172.17.0.2:80"
declare -x NGINX_PORT_443_TCP="tcp://172.17.0.2:443"
declare -x NGINX_PORT_443_TCP_ADDR="172.17.0.2"
declare -x NGINX_PORT_443_TCP_PORT="443"
declare -x NGINX_PORT_443_TCP_PROTO="tcp"
declare -x NGINX_PORT_80_TCP="tcp://172.17.0.2:80"
declare -x NGINX_PORT_80_TCP_ADDR="172.17.0.2"
declare -x NGINX_PORT_80_TCP_PORT="80"
declare -x NGINX_PORT_80_TCP_PROTO="tcp"
declare -x OLDPWD
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
declare -x PWD="/"
declare -x SHLVL="1"
declare -x TERM="xterm"
Eger bu environment variable'lari elle set etmek istiyorsaniz -e parametresi ile bunlari yeni calisacak container'a set edebilirsiniz.
vahric:~ vahricmuhtaryan$ docker run -e "AHMET=MEHMET" -it ubuntu bash -c export
declare -x AHMET="MEHMET"
declare -x HOME="/root"
declare -x HOSTNAME="3d2541f1f564"
declare -x OLDPWD
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
declare -x PWD="/"
declare -x SHLVL="1"
declare -x TERM="xterm"

Docker Restart Policy

docker run -d -P –name nginx –restart unless-stopped nginx

on-failure : non-zero exit statulerinde tekrar calistiri, istenir ise up to 10 denebilir.

unless-stopped : Eger durdurulmus ise deamon restart oldugunda container calistirilmaz, aksi taktirde Docker ilgili container’i olmus ise calistirmaya calisir.

always : her turlu🙂

Container’lar icin bir iki ufak debug yontemi

  • En son yaratilan docker container’i gormek istiyorsunuz > docker ps -l
  • stderr ve stdout tek bir stream’de gorebilirsiniz > docker logs <Docker_id/name>
  • Container hakkinda bilgi almak icin > docker inspect <Docker_id/name>
  • Calisan container icersinde yeni komut calistirmak icin > docker exec -it ubuntu bash

Container’lar icin Runtime Privilage ve ulimit yonetimi

  • Normalde calisan tum docker container’lar unprivilage mode’da calisir
  • Bir container’i privilage mode calistirmak demek Host uzerindeki tum device’lara  , AppArmor/SELinux gibi configrasyonlara erisebilmesini saglar
  • umlimit ise bildigimiz linux uzerinde sistem bazinda kaynak kullanim kisitlamasini yapan bir uygulamadir mesela su kullanici max su kadar dosya acabilsin gibi
  • Asagidaki komut container’in core dump alabilmesi ve host uzerindeki kaynaklara ulasabilmesi saglanmis
  • docker run -dt -p 22 -p 80 -p 161/udp –ulimit core=-1 –privileged=true cpx:11.1-48.10

Seri Hakkinda

1 – Hizlica ve Esitliklerle Docker

2 – docker-machine

3 – docker cok kullanilan komutlar kisa kisa

Posted on 20/06/2016, in Docker and tagged , , , , , , , , , , , , , , , , , , , . Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: