Docker Komutları – 2

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

Volume yönetimi

Docker’da datalar volume içerisinde depolanır. Tüm volume’ları görmek için aşağıdaki komut kullanılır:

docker volume ls
DRIVER    VOLUME NAME
local     3a4e033b1338e0f0a678349541996359574efd90ed7d4a67633aa32c3894c27e
local     3e6ad179d4a97c4f9c28e3fe300c165fe3b591f43bdb4aec20fc17ea72c0a254
local     8da9e0e1a95b2ca60f030efef48794d11d3d1f60655cabc1d293e12b2d41597a

Volume’lar eğer biz kendi hostumuzda bir klasör belirtmezsek docker kendine atanmış olan harddisk alanı içerisinde biryerlerde bu volume’ları oluşturur. (Bu volume’lara docker inspect komutuyla ulaşabiliriz ama çok alt seviye bir komut olduğu için burada değinmeyeceğiz.) Her yeni imaj için farklı volume’lar oluşturulur. Bir imajı çalıştırırken -v parametresini kullanarak IP yönlendirmedeki gibi bir mantıkla kendi hostumuzdaki bir klasörü voluma olarak kullanılmasını sağlayabiliriz. Örneğin:

docker run -d --name mysql_1 -v /host/makine/yolu:/var/lib/mysql mysql

Bu komutla bizim host makinemizdeki /host/makine/yolu klasörünü image içerisindeki /var/lib/mysql klasörüne atamış oluyoruz. Böylece container içerisindeki servisin değiştirdiği dosyaların bulunduğu yolu (bizim örneğimizdeki mysql’e ait olan database yolunu) kendi host makinemizdeki bizim görebileceğimiz ve ulaşabileceğimiz bir yola atamış olduk. Peki hangi yolu nereye atayacağımızı nasıl belirleyeceğiz? Kendi host makinemizdeki yolu kendimiz belirleyebiliriz zaten. Image içerisindeki yolu da dockerhub’daki ilgili container’ın dökümanından veya ilgili container’ın kendi sitesindeki dökümandan öğrenebiliriz. Örneğimizdeki /var/lib/mysql yolunu mysql‘in dockerhub’daki dökümanından bulduk: https://hub.docker.com/_/mysql Ayrıca bu dökümanda farklı konfigürasyonlara da ulaşabilmekteyiz (örneğin mysql root şifresinin belirlenmesi gibi).

Volum silmek

Artık kullanılmayacak olan volume’leri silmek için docker volume rm [volume_id] komutunu kullanabiliriz. Kullanımda olan volume’ler silinemez. Volume id bulabilmek için öncelikle tüm volume’leri listelememiz gerekiyor.

docker volume ls
DRIVER    VOLUME NAME
local     047ac85cf1421fd2a9914425a02c827059cb3eea0c6372b05e05815da5907537
local     122a7f10bce8aec06c30d747d72b4e082bc22e8d4b985fc5dd20253f945f7501

# kullanılmayan volume'leri silebiliriz
docker volume rm 047ac85cf1421fd2a9914425a02c827059cb3eea0c6372b05e05815da5907537

Containerın içinde komut çalıştırmak

Çalışan bir containerın içerisinde komutlar çalıştırabiliriz. Bunu iki şekilde yaparız. Birincisi interaktif şekilde diğeri standart şekilde. İnteraktif metodla bir komut çalıştırdığımızda komutun input-output’ları host makinamızdaki komut satırına düşer. Diğer yöntemle komut çalıştırdığımızda sadece komutun çıktısı ekranımıza düşer. Container içerisinde bir komut çalıştırabilmek için exec komutunu kullanırız. İnteraktif modu aktif etmek için de bu komuttan sonra -it parametresini kullanırız.

Şimdi ilk olarak normal modda bir komut çalıştıralım. Öncelikle çalışan containerlarımızı görelim:

docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS        PORTS                                NAMES
8037736035f7   mysql     "docker-entrypoint.s…"   12 hours ago   Up 12 hours   33060/tcp, 0.0.0.0:43306->3306/tcp   mysql_1

Ardından normal modda birkaç komut çalıştırıp çıktılarını görelim:

docker exec 8037736035f7 ls -lha
total 80K
drwxr-xr-x 1 root root 4.0K Dec 10 18:46 .
drwxr-xr-x 1 root root 4.0K Dec 10 18:46 ..
-rwxr-xr-x 1 root root 0 Dec 10 17:13 .dockerenv
drwxr-xr-x 2 root root 4.0K Dec 1 00:00 bin
drwxr-xr-x 2 root root 4.0K Oct 3 09:00 boot
drwxr-xr-x 5 root root 340 Dec 10 17:13 dev
drwxr-xr-x 2 root root 4.0K Dec 2 11:22 docker-entrypoint-initdb.d
lrwxrwxrwx 1 root root 34 Dec 2 11:23 entrypoint.sh -> usr/local/bin/docker-entrypoint.sh
......

Gördüğünüz üzere mevcut klasör altındaki dosyaları listeledik. Liste daha uzun ama ben gereksiz yer işgal etmesin diye altına nokta koyarak kısalttım. Bu yöntemle aynı anda sadece bir komut çalıştırabiliriz. Şimdi aynı anda birkaç adet komutu nasıl çalıştıracağımıza bakalım. Eğer linux/unix ortamında çalışıyorsanız birden fazla komutu noktalı virgül kullanarak ayırabilir ve böylece bir satırda birden fazla komut çalıştırabilirsiniz. Örneğin:

echo "Suanki yol: $(pwd)"; ls -lha

Bu komutu doğrudan çalıştırdığımızda kendi host makinamızda çalıştırmış oluruz ve çıktısı şu şekilde olabilir:

Suanki yol: /Users/emir
total 13760
drwxr-xr-x+ 92 emir staff 2.9K Dec 9 16:22 .
drwxr-xr-x 5 root admin 160B Oct 18 06:30 ..
-r-------- 1 emir staff 7B Nov 9 2020 .CFUserTextEncoding
-rw-r--r--@ 1 emir staff 28K Dec 10 20:13 .DS_Store
drwxr-xr-x 8 emir staff 256B Mar 12 2021 .IdentityService
drwx------+ 2 emir staff 64B Dec 9 16:22 .Trash
drwxr-xr-x 23 emir staff 736B Dec 7 20:33 .android
......

Görüldüğü üzere noktalı virgül ifadesi host makinamızda işlenmektedir. Aynı komutu docker exec içerisine doğrudan verdiğimizde noktalı virgülden önceki kısım containerda sonraki kısım olan ls -lha komutu da host makinamızda işlenecektir. Fakat biz her iki komutun da container’da işlenmesini istemekteyiz. Bunun için container içerisindeki bir kabuğa bu komutları parametre olarak göndermemiz gerekmektedir. Sonuç olarak çalıştırmamız gereken komut satırı şu şekilde olmalıdır:

docker exec 8037736035f7 bash -c 'echo "Simdiki dizin: $(pwd)"; ls -lha'
Simdiki dizin: /
total 80K
drwxr-xr-x 1 root root 4.0K Dec 10 18:46 .
drwxr-xr-x 1 root root 4.0K Dec 10 18:46 ..
-rwxr-xr-x 1 root root 0 Dec 10 17:13 .dockerenv
drwxr-xr-x 2 root root 4.0K Dec 1 00:00 bin
drwxr-xr-x 2 root root 4.0K Oct 3 09:00 boot
drwxr-xr-x 5 root root 340 Dec 10 17:13 dev
drwxr-xr-x 2 root root 4.0K Dec 2 11:22 docker-entrypoint-initdb.d
lrwxrwxrwx 1 root root 34 Dec 2 11:23 entrypoint.sh -> usr/local/bin/docker-entrypoint.sh
drwxr-xr-x 1 root root 4.0K Dec 10 17:13 etc
drwxr-xr-x 2 root root 4.0K Oct 3 09:00 home
......

Görüldüğü üzere her iki komutu bash kabuğuna -c parametresiyle tek tırnak içerisinde gönderdiğimizde bu komutlar container içerisinde çalıştırılmış oldu ve çıktısı host makinamıza ulaştı.

Şimdi interaktif olarak container’daki kabuğa erişelim. Bunun için -it parametresini kullanmalıyız.

docker exec -it 8037736035f7 bash
root@8037736035f7:/#

Şuan container içerisindeyiz. Artık burada çalıştıracağımız her komut container içerisinde işlem görecektir.

Dosya kopyalama

Container içerisindeki bir dosyayı almak isteyebiliriz veya container içerisine bir dosya transfer etmek isteyebiliriz. Bunun için cp komutunu kullanmamız gerekmektedir. İlk örneğimizde container içerisine dosya transferi yapacağız. Bunun için aşağıdaki komutu kullanıyoruz:

docker cp /host/makine/yolu/ornek.txt mysql_1:/container/yolu/yenidosya.txt

Görüldüğü üzere ilk parametremiz host makinemiz olmalı. İkinci parametre ise [container_adi]:/container/yolu/yenidosya.txt formatında olmalı. Karışıklık olmaması amacıyla dosya adını da yazmamız gerekiyor. Aksi halde standart linux directory davranışlarına göre dosya kopyalanacaktır. Artık host makinemizdeki bir dosyayı containerda belirttiğimiz klasör altına kopyalamış olduk.

Şimdi container’daki bir dosyayı host makinamıza nasıl kopyalayacağımızı görelim. Burada tek yapmamız gereken gereken parametrelerin yerlerini değiştirmek.

docker cp mysql_1:/container/yolu/yenidosya.txt /host/makine/yolu/kopya.txt

Container loglarını görmek

Kullandığımız containerları debug etmek isteyebiliriz. Bunun için containerın loglarına erişmek büyük fayda sağlayacaktır. Daha önceden nginx imajını çalıştırdığımızda ekrana çıktılar geldiğini görmüştük. Eğer bir containerı arkaplanda çalıştırırsak bu çıktılar ekrana basılmaz ama docker tarafından kaydedilir. Bu çıktıları yani logları görebilmek için logs komutunu kullanırız. Komutun formatı çok basittir: docker logs container_adi Örnek kullanım ise aşağıdaki gibi olabilir:

docker logs mysql_1
2021-12-10 17:13:00+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
2021-12-10 17:13:01+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2021-12-10 17:13:01+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
2021-12-10T17:13:01.370820Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.27) starting as process 1
2021-12-10T17:13:01.389137Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-12-10T17:13:01.844229Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-12-10T17:13:02.040743Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
2021-12-10T17:13:02.040844Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
2021-12-10T17:13:02.045818Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem
....

Şimdi bir nginx containerı oluşturalım ve bu containerın anlık çıktılarını görelim.

docker run -d -p 8000:80 --name nginx_1 nginx
ba730888ed7b873c1e91ae3c18c62bc8b0517f9851047d523a32c1a87f061965

docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba730888ed7b nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:8000->80/tcp nginx_1
8037736035f7 mysql "docker-entrypoint.s…" 14 hours ago Up 14 hours 33060/tcp, 0.0.0.0:43306->3306/tcp mysql_1

docker logs --follow nginx_1
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2021/12/11 06:54:34 [notice] 1#1: using the "epoll" event method
2021/12/11 06:54:34 [notice] 1#1: nginx/1.21.4
2021/12/11 06:54:34 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
2021/12/11 06:54:34 [notice] 1#1: OS: Linux 5.10.76-linuxkit
2021/12/11 06:54:34 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021/12/11 06:54:34 [notice] 1#1: start worker processes
2021/12/11 06:54:34 [notice] 1#1: start worker process 31
2021/12/11 06:54:34 [notice] 1#1: start worker process 32

Şimdi tarayıcıdan localhost:8000 adresine girdiğimizde yeni eklenen loglar şu şekilde olacaktır:

172.17.0.1 - - [11/Dec/2021:06:57:19 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36" "-"
2021/12/11 06:57:20 [error] 31#31: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "localhost:8000", referrer: "http://localhost:8000/"
172.17.0.1 - - [11/Dec/2021:06:57:20 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost:8000/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36" "-"

Stats

Çalışan containerların ne kadar sistem kaynağı tükettiğini görmek için stats komutunu kullanabiliriz. Komut linuxtaki watch komutu gibi çalışmaktadır. Çalışan tüm containerları listeleyerek her birinin işlemci ve ram kullanımı, network trafiği ve ne kadar süredir açık olduğu gibi bilgileri anlık olarak izleyebiliriz.

ddocker stats
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
ba730888ed7b   nginx_1   0.00%     2.582MiB / 2.921GiB   0.09%     3.48kB / 2.23kB   12.3kB / 12.3kB   3
8037736035f7   mysql_1   0.25%     348.6MiB / 2.921GiB   11.65%    155kB / 224kB     528kB / 11GB      39

 

 

 

 

…………..

 


Emir Buğra KÖKSALAN

Java & PHP Developer

0 yorum

Bir yanıt yazın

Avatar placeholder

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload the CAPTCHA.

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.