Docker istemci komutları

İlk bölümde teorik bir giriş yaptık. Şimdi docker istemcisi ile yapabildiklerimizi örneklendirelim. Böylelikle çalışma mantığı daha iyi netleşecektir. Şimdi ubuntu imajı ile bir konteyner çalıştıralım. Bu konteynere -i ve -t ile iki adet anahtar vererek konsola bağlanacağız.

[root@localhost ~]# docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu' locally
Pulling repository ubuntu
c4ff7513909d: Download complete
511136ea3c5a: Download complete
1c9383292a8f: Download complete
9942dd43ff21: Download complete
d92c3c92fa73: Download complete
0ea0d582fd90: Download complete
cc58e55aa5a5: Download complete
root@6a8de5febbab:/#

-i : Konteynerin standart inputunu açar.
-t : Açık STDIN’e tty bağlar.

Bu şekilde interaktif kabuğa bağlanabiliriz. Standar bash kabuğunda olduğu gibi CTRL + D ile kabuktan çıktığımız anda konteyner durur.
Aynı konteyneri -i ile start edebiliriz. Yine bash kabuğuna düşeceğiz.

[root@localhost ~]# docker start -i angry_engelbart7
angry_engelbart7
root@6a8de5febbab:/# hostname
6a8de5febbab

Hostname docker servisi tarafından otomatik atanır ve biriciktir. Bu id ile mevcut konteynerler üzerinde işlem yapabiliriz.

root@6a8de5febbab:/# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  1.5  0.0  18152  1844 ?        Ss   12:06   0:00 /bin/bash
root         8  0.0  0.0  15568  1144 ?        R+   12:06   0:00 ps aux

İşte bu çıktı aslında dockerin çalışma mantığı konusunda güzel ipucu veriyor. Dikkat etti iseniz sadece bu konteynerden çağrılan işlemler görünüyor. Herhangi ek bir servis, işlem bu çıktıda görünmüyor. Fakat aynı komutu host makinada çalıştırırsanız bu işlemleri görebilirsiniz. Docker konteyner içindeki işlemleri, diğerlerinden izole eder.

root@6a8de5febbab:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 12:74:ec:76:6e:d9
          inet addr:172.17.0.13  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::1074:ecff:fe76:6ed9/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:13172 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6457 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:20803317 (20.8 MB)  TX bytes:437626 (437.6 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:1500  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:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Bu da önemli bir çıktı. Docker konteyner çalıştırılırken kullanılmayan rfc1918 ye ait private ip bloklarından bir ip adresini tanımlar. Bu şekilde docker servisi ile konteyner arasında bir ağ oluşur.

Bu konteyneri ubuntu imajından türettik. Ana sistemimiz Centos olmasına rağmen imajımız olan ubuntu komutları geçerlidir. Örneğin bir uygulamayı kurmak için apt kullanabilir.

root@6a8de5febbab:/# apt search docker.io
Sorting... Done
Full Text Search... Done
docker.io/trusty 0.9.1~dfsg1-2 amd64
  Linux container runtime

Docker konteynerlara kendisi isim verir. Kendimiz isim vermek istersek –name anahtarını kullanabiliriz. Şimdi yeni bir konteyner çalıştıralım.

[root@localhost ~]# docker run --name web_sunucu -i -t ubuntu /bin/bash

Docker ps çıktısında isim kısmına dikkat ederseniz, verdiğimiz ismi görebilrisiniz.

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                        PORTS               NAMES
d8252233e0c0        ubuntu:latest       /bin/bash              10 seconds ago      Exited (0) 5 seconds ago                          web_sunucu
6a8de5febbab        ubuntu:latest       /bin/bash              11 minutes ago      Exited (127) 13 seconds ago                       angry_engelbart7
0397c25cb4ce        centos:latest       /usr/bin/echo 'Merha   3 hours ago         Exited (0) 13 minutes ago                         sad_wright3

Docker komutlarında id ya da isim kullanılabilir. Anlamlı olması açısından ve verilen isimler ileride farklı işlemler için kullanılacağı için önemlidir. Aynı isimde iki konteyner olamaz. Son oluşturduğumuz konteyner için aşağıdaki iki komut eştir.

docker start web_sunucu 
docker start d8252233e0c0

Yukarıda bir öncekinden farklı olarak -i olmadan start ettik konteyneri. Bunu yaptığımızda konteyner arka planda /bin/bash uygulamasını çalıştırıp bekilyor.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d8252233e0c0        ubuntu:latest       /bin/bash           6 minutes ago       Up 7 seconds                            web_sunucu

Bu konteynerin konsoluna attach ile bağlanabiliriz.

[root@localhost ~]# docker attach web_sunucu
root@d8252233e0c0:/#

Yine CTRL+D yapıp çıkabiliriz. Bunu yapınca /bin/bash sonlanacağı için konteyner da yine duracaktır.

Şu ana kadar servis mantığında bir işlem yapmadık. Şimdi arka planda çalışan bir servisi deneyelim. Basitçe ping atan bir konteyner çalıştıralım. Burada öncekilerden farklı olarak -d anahtarını veriyoruz. Böylelikle konteyner çalışırken biz host konsoluna geri dönüyoruz.

[root@localhost ~]# docker run --name ping_sunucusu -d ubuntu /bin/sh -c "ping 8.8.8.8"
86e8c65631da1494fd293c29d6148a33a730e4aa04fe815778eb9514b2c18db0

Şu anda ping_sunucusu isimli konteyner bir servis gibi çalışmakta. Docker ps çıktısında up olarak görebiliriz bunu.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
86e8c65631da        ubuntu:latest       /bin/sh -c 'ping 8.8   27 seconds ago      Up 26 seconds                           ping_sunucusu

Konteynerde çalışan servisin konsola bastığı çıktıyı görmek için logs komutu kullanılabilir. -ft ile tail gibi canlı çıktısını görürüz.

[root@localhost ~]# docker logs -ft ping_sunucusu
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=61.9 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=61.5 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=62.0 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=44 time=61.3 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=44 time=61.4 ms
64 bytes from 8.8.8.8: icmp_seq=6 ttl=44 time=61.5 ms

Şimdi konteynerimizi durduralım.

[root@localhost ~]# docker stop ping_sunucusu
ping_sunucusu

Elimizdeki konteyner ile alakalı detaylı bilgileri inspect komutu ile alabiliriz. Bu çıktı go dilinin text template formatında çıktı verir.

[root@localhost ~]# docker inspect ping_sunucusu
[{
    "ID": "86e8c65631da1494fd293c29d6148a33a730e4aa04fe815778eb9514b2c18db0",
    "Created": "2014-08-20T12:28:17.139684223Z",
    "Path": "/bin/sh",
    "Args": [
        "-c",
        "ping 8.8.8.8"
    ],
    "Config": {
        "Hostname": "86e8c65631da",
        "Domainname": "",
        "User": "",
        "Memory": 0,
        "MemorySwap": 0,
        "CpuShares": 0,
        "Cpuset": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "PortSpecs": null,
        "ExposedPorts": null,
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": [
            "HOME=/",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Cmd": [
            "/bin/sh",
            "-c",
            "ping 8.8.8.8"
        ],
        "Image": "ubuntu",
        "Volumes": null,
        "WorkingDir": "",
        "Entrypoint": null,
        "NetworkDisabled": false,
        "OnBuild": null
    },
    "State": {
        "Running": false,
        "Pid": 0,
        "ExitCode": -1,
        "StartedAt": "2014-08-20T12:28:17.452183947Z",
        "FinishedAt": "2014-08-20T12:30:44.01863998Z"
    },
    "Image": "c4ff7513909dedf4ddf3a450aea68cd817c42e698ebccf54755973576525c416",
    "NetworkSettings": {
        "IPAddress": "",
        "IPPrefixLen": 0,
        "Gateway": "",
        "Bridge": "",
        "PortMapping": null,
        "Ports": null
    },
    "ResolvConfPath": "/etc/resolv.conf",
    "HostnamePath": "/var/lib/docker/containers/86e8c65631da1494fd293c29d6148a33a730e4aa04fe815778eb9514b2c18db0/hostname",
    "HostsPath": "/var/lib/docker/containers/86e8c65631da1494fd293c29d6148a33a730e4aa04fe815778eb9514b2c18db0/hosts",
    "Name": "/ping_sunucusu",
    "Driver": "devicemapper",
    "ExecDriver": "native-0.2",
    "MountLabel": "system_u:object_r:svirt_sandbox_file_t:s0:c361,c723",
    "ProcessLabel": "system_u:system_r:svirt_lxc_net_t:s0:c361,c723",
    "Volumes": {},
    "VolumesRW": {},
    "HostConfig": {
        "Binds": null,
        "ContainerIDFile": "",
        "LxcConf": [],
        "Privileged": false,
        "PortBindings": {},
        "Links": null,
        "PublishAllPorts": false,
        "Dns": null,
        "DnsSearch": null,
        "VolumesFrom": null,
        "NetworkMode": "bridge"
    }

Bu çıktıdan daha spesifik bilgileri, go text template formatına uygun şekilde çekebiliriz. Bu çıktılar ile kişiselleştirilmiş betikleri yazılmasına olanak sağlar.

[root@localhost ~]# docker inspect --format '{{ .Config.Image }}' ping_sunucusu
ubuntu

İşimiz bittiği için konteyneri siliyorum.

[root@localhost ~]# docker rm ping_sunucusu
ping_sunucusu

Bu yazıda Docker konteynerleri ile çalışırken, günlük kullanımda sıklıkla kullanılabilecek komutları anlattım. İleriki yazılarda docker istemcisinin farklı komutlarını, imajlar ile çalışırken kullancağız. Daha detaylı bilgiyi docker’ın referans sayfalarından alabilirsiniz. https://docs.docker.com/reference/commandline/cli/

Docker ile uygulama sanallaştırma – II İstemci komutları

Leave a Reply

Your email address will not be published. Required fields are marked *