Docker Komutları – 1

Emir Buğra KÖKSALAN tarafından tarihinde yayınlandı

İmajları indirmek

Bu komutla hub.docker.com adresinde bulunan imajları indirebilirsiniz. Örneğin `ubuntu` imajını indirmek için aşağıdaki komutu kullanabilirsiniz:

docker pull ubuntu

Sisteme indirilmiş imajları listelemek

docker images komutuyla sistemde yüklü olan tüm imajları listeleyebiliriz. Örnek çıktı:

docker images

REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest ba6acccedd29 6 weeks ago 72.8MB confluentinc/cp-kafka latest 76da344f7a49 7 weeks ago 772MB confluentinc/cp-zookeeper latest 0390b975e207 7 weeks ago 772MB hello-world latest feb5d9fea6a5 2 months ago 13.3kB

Tüm containerları listelemek

Çalışan ve çalışmayan tüm containerları listelemek için aşağıdaki komutu kullanabilirsiniz:

docker ps -a

CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      NAMES
5b0724ccbc4a   ubuntu        "bash"     3 seconds ago    Exited (0) 2 seconds ago    nostalgic_nobel
1c2b67f0dd05   hello-world   "/hello"   11 seconds ago   Exited (0) 11 seconds ago   modest_carver

Çalışan bir containerın id’sini bulmak

Containerlar üzerinde işlem yapmak için container id’sine ihtiyaç duyarız. Bu yüzden belirli bir imajın çalışan containerının id’sini bulmak için aşağıdaki komutu kullanırız. Eğer bir imajdan birden fazla container mevcutsa birden fazla id dönecektir:

docker ps -a | grep "container-adi" | awk '{ print $1 }'

Containerı öldürmek/durdurmak

Containerı öldürmek (kill) ve durdurmak (stop) aynı işi yapmaktadır. Her iki yöntem de çalışan bir containerı durdurur. Aynı imajdan birden fazla container olabileceği için hangi containerı durdurmak istediğimizden emin olmamız gerekmektedir. Bunun için öncelikle tüm containerları listeleyelim.

docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS                                NAMES
9cfa1dd42c5e   ubuntu    "bash"                   19 seconds ago   Exited (0) 18 seconds ago                                        ubuntu_1
43428ede42d2   ubuntu    "--name ubuntu"          29 seconds ago   Created                                                          ecstatic_allen
ba730888ed7b   nginx     "/docker-entrypoint.…"   17 minutes ago   Up 8 seconds                0.0.0.0:8000->80/tcp                 nginx_1
8037736035f7   mysql     "docker-entrypoint.s…"   14 hours ago     Up 4 seconds                33060/tcp, 0.0.0.0:43306->3306/tcp   mysql_1

Ardından durdurmak veya öldürmek istediğimiz containerı belirleyelim. Burada nginx_1 isimli containerımızın id’sini alıyoruz.

docker kill 8037736035f7
# alternatif bir yöntem olarak kill yerine stop da diyebiliriz
docker stop 8037736035f7

Bir container’ı veya imajı silmek

Durdurulmuş olan bir container’ı silmek için rm komutunu, imajı silmek için de rmi komutunu kullanırız.

docker rm 1a12c4750a6c
docker rmi ba6acccedd29

Tüm container’ları ve imajları silmek

Normal şartlarda çalışan bir container silinmeye çalıştığında hata verir fakat -f parametresini kullandığımızda çalışan containerları zorlayarak silebiliriz.

docker rm $(docker ps -aq) -f

Aynı şekilde imajları da silebiliriz:

docker rmi $(docker images -q) -f

Bir imajı çalıştırmak ve interaktif mod

İmaj çalıştırıldığında bir container oluşur. Bu containerın içindeki komutlara göre sürekli çalışır veya bir süre çalıştıktan sonra durur. Durduktan sonra da container pasif modda kalır ve silinmez. Manuel olarak silmek gerekir. Şimdi bir imaj çalıştıralım:

docker run centos

Centos imajını çalıştırdık. Bu imaj içerisinde süreklı açık kalmasını sağlayan bir komut başlatılmadığı için bu container hemen kapanacaktır. Şimdi docker ps komutunu çalıştırdığımızda aşağıdaki gibi bir çıktı alırız:

CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
12ece5e8bead   centos    "/bin/bash"   2 seconds ago    Exited (0) 1 second ago               stupefied_cray
8559ca26d988   centos    "/bin/bash"   3 seconds ago    Exited (0) 3 seconds ago              modest_lehmann
407e16923099   centos    "/bin/bash"   11 seconds ago   Exited (0) 10 seconds ago             crazy_merkle

Görüldüğü üzere status kısmında Exited yazıyor. Şimdi yeni bir terminal açarak şu komutu yazalım:

docker run -it centos bash

Bu komutla yeni bir container oluştururuz ve interaktif modda bash komutunu çalıştırırız. Böylece container’ın kabuğuna girmiş olmaktayız. Şimdi tekrar docker ps -a komutunu yazdığımızda şöyle bir çıktı alırız:

CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
12ece5e8bead   centos    "/bin/bash"   2 seconds ago    Exited (0) 15 minutes ago           stupefied_cray
8559ca26d988   centos    "/bin/bash"   3 seconds ago    Exited (0) 20 minutes ago            modest_lehmann
407e16923099   centos    "/bin/bash"   11 seconds ago   Exited (0) 25 minutes ago             crazy_merkle
93d8b1cf6bfb   centos    "bash"        30 minutes ago   Up 30 minutes                         charming_morse

Görüldüğü üzere en son çalıştırdığımız container Up durumunda yani hala çalışıyor.

Aslında container’ların amacı böyle komut satırına girip komutlar yazmak değildir. Containerlar arkaplanda sürekli çalışan servisler oluşturabilmek için ve bu servisler arasındaki izolasyonu sağlamak için kullanılır.

Ayrıca çalışmakta olan bir container’ın içine de girmek mümkündür. Bunun için container’ın adını veya id’sini bilmemiz gerekiyor. Örnek komutlar aşağıdaki gibidir:

# önce çalışan containerlarımızı görelim
docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS     NAMES
ad7f9fadb3e8   nginx     "/docker-entrypoint.…"   About an hour ago   Up About an hour             nginx_1

# NAME'e göre
docker exec -it nginx_1 /bin/bash
[email protected]:/# _

# ID'ye göre
docker exec -it
ad7f9fadb3e8 /bin/bash
[email protected]:/# _

Görüldüğü üzere hem ID hem de NAME değerleriyle /bin/bash komutunu interaktif modda çalıştırdık ve böylece çalışmakta olan containerın içerisine girebildik.

Port Açmak

Örneğin nginx imajımızı çalıştırmak istiyoruz. Bu imajda nginx yazılımı çalışır ve 80 portunu dinler. Fakat bu port docker içerisinde açılmaktadır ve host makinada açılmaz. Bu yüzden -p parametresiyle port yönlendirme yapmamız gerekmektedir. Komut formatı şu şekildedir:

docker run -p [host-port]:[container-port] [imaj-adi]

Şimdi nginx komutunu çalıştıralım ve bu porta tarayıcıdan açalım:

docker run -p 8081:80 nginx

Şimdi tarayıcıdan şu adrese girebiliriz ve aşağıdaki çıktıyı alırız: http://localhost:8081/

Bu komut terminale attach olur ve çıktıyı konsoldan almaya başlarız. Fakat genelde container’ların arkaplanda çalışmasını isteriz bu yüzden konsole attach olmasını istemeyiz. Bunu da -d yani detach diyerek yapabiliriz. Komutumuzun son hali şu şekilde olacaktır:

docker run -d -p 8081:80 nginx

Containerlara isim vermek

Bir containerı çalıştırdığımızda eğer kendimiz isim vermezsek docker tarafından rastgele bir isim verilmektedir. Karışıklığa ve anlamsızlığa sebebiyet vermemek için containerlara isim vermek faydalı olacaktır.

docker run -d --name deneme1 -p 8081:80 nginx

Şimdi tüm containerları listelediğimizde şöyle bir çıktı alırız:

CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS                        PORTS                  NAMES
0d1e2a598f6e   nginx     "/docker-entrypoint.…"   3 seconds ago       Up 3 seconds                  0.0.0.0:8081->80/tcp   deneme1
e60cb38871aa   nginx     "/docker-entrypoint.…"   14 minutes ago      Exited (0) 11 seconds ago                            silly_wing
12ece5e8bead   centos    "/bin/bash"              39 minutes ago      Exited (0) 39 minutes ago                            stupefied_cray
8559ca26d988   centos    "/bin/bash"              39 minutes ago      Exited (0) 39 minutes ago                            modest_lehmann
407e16923099   centos    "/bin/bash"              39 minutes ago      Exited (0) 39 minutes ago                            crazy_merkle
93d8b1cf6bfb   centos    "bash"                   About an hour ago   Exited (127) 16 minutes ago                          charming_morse

Görüldüğü üzere en üstteki container’ın port yönlendirilmesi ve ismini görebilmekteyiz. Diğer containerlara isim belirtmediğimiz için docker tarafından otomatik bir isim verilmektedir.

Containerları listelemek

Containerları çalıştırdık ama bunlar nerede tutuluyor, durumları nedir, nasıl ulaşırız bunları yapabilmek için listeleme komutlarını kullanırız. Bu komutları yukarıda da kullandığımız için ve çıktılarını gördüğümüz için tekrar çıktıları yazmayacağım. Sadece isimlerini yazacağım.

docker ps -a
docker container ls -a

Containerları durdurmak ve başlatmak

Containerları durdurmak ve sonra tekrar başlatmak isteyebiliriz. Bu işlemleri containerların isimleriyle yaparız. Her containerın unique bir ismi olmak zorunda olduğu için karışıklık çıkmayacaktır. Durdurmak, başlatmak ve yeniden başlatmak için ihtiyacımız olan komut formatı şu şekildedir: docker [stop|start|restart] [container_adi]

Buradan da anlaşılacağı üzere örneğin deneme1 isimli bir containerımız varsa ve bunu durdurmak istiyorsak docker stop deneme1 dememiz yeterlidir. Aynı şekilde başlatmak için de stop yerine start diyoruz.

Containerları silmek

Bir containerla işimiz bittiğinde harddiskte yer kaplamaması için silmemiz gerekmektedir. Containerları silmediğimiz taktirde çok fazla alan işgal edeceklerdir. Bir containerı silmek için durdurulmuş olması gerekmektedir yani çalışan bir containerı silemeyiz. Container silmek için ihtiyacımız olan komut: docker container rm container_adi veya docker rm container_adi

Eğer çalışan bir containerı silmek istersek şu şekilde bir hata alırız:

Error response from daemon: You cannot remove a running container 0d1e2a598f6e49814382a78cae1e1e09213c3ea1aff51125923d30f35a86624f. Stop the container before attempting removal or force remove

Burada da belirtildiği üzere eğer çalışan bir containerı gerçekten silmek istiyorsak -f parametresiyle zorlayarak silebiliriz:

docker rm deneme1 -f
docker rm deneme2 -f

 

Devamı: Docker Komutları – 2

 


Emir Buğra KÖKSALAN

Java & PHP Developer

0 yorum

Bir cevap yazın

Avatar placeholder

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload the CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.