Docker Bölüm 2: Komutlar

Docker

Docker Kontrol

Version

Docker Client ve Deamon hakkında bilgi almak için kullanılan komuttur. İşletim sisteminde:

çalıştırdığınızda size Docker hakkındaki bilgiyi verecektir.

Info

Docker hakkında detaylı bilgi almak için kullanılır.

Debug

Yukarıdaki çıktıca Client için debug mode’un kapalı olduğunu gördük, açalım:

Help

Bir komut hakkında detaylı bilgi almak için komuttan hemen sonra –help yazarsak detaylı kullanımını öğrenebiliriz. Mesela docker komutuna bakalım:

Docker Container

Docker üzerinde container ile ilgili işlemler yapmak istediğimizde docker container yönetim komutu ile başlar, sonra yapmak istediğimiz işlem ne ise onu ekleriz.

Run

Bir container başlatmak istediğimizde kullanırız. Aslında create ve start komutunun bir birleşimidir, ayrı ayrı bu komutları işetmek yerine run komutu ile oluşturup başlatmış oluyoruz.

Yukarıdaki komut ile hello-world isimli image’ı kullanarak bir container oluşturmak istediğimizi Docker’a iletmiş olduk. Eğer image elimizde yoksa registry’ye giderek indirilir.

Bu komutu:

Şeklinde de verebiliriz. Bu eski kullanım modelidir, hala kullanılabiliyor ama yenisine işin başında alışmak daha doğru olacaktır.

Komutu işlettiğimizde gördüğünüz gibi ilk olarak lokalde hello-world image arandı; ama bulunamadı. Akabinde Docker Hub’a giderek ilgili image indirildi ve çalıştırılarak bizim için “Hello from Docker!” şeklindeki çıktıyı ve diğer bir dizi çıktıyı üreten bir container ayağa kalktı.

Name

Bir container ayağa kaldırırken ona bir isim de verebiliriz.

Görüldüğü gibi –name ile hello-world image’ından oluşturulacak olan container’ımıza test1 ismini vermiş olduk.

Listeleme

Elimizde bulunan image’ları listelemek için Linux’taki ls komutu kullanılıyor.

Eski kullanımında ls yerine ps kullanıyor. Aynı zamanda list de kullanılabilir.

ls ile yalnızca çalışan container’lar görülebiliyor, tümünü görmek istersek -a veya –-all eklememiz gerekir

Sadece container id’lerini listelemek istersek -q veya –quiet:

Stop

Çalışan bir container’ı durdurmak için kullanırız. Komuttan sonra container ismi verilmelidir, image adı yazarak çalıştıramazsınız. Elinizdeki container listesine ls ile bakarak Name başlığından çalıştırmak istediğiniz container’ın ismini öğrenebilirsiniz. Ben –name parametresinde çalıştırdığım test1 isimli container’ı vereceğim.

Start

Duran bir container’ı çalıştırmak için kullanırız. Komuttan sonra container ismi verilmelidir:

Restart

Çalışan bir container’ı yeniden başlatmak için ve kullanılabileceği gibi stop durumunda olan container’ı de başlatır, komuttan sonra container ismi verilmelidir

Pause

Çalışan bir container’ı duraklatmak için kullanırız. Komuttan sonra container ismi verilmelidir:

Unpause

Duraklatılmış bir container’ı devam ettirmek için kullanırız. Komuttan sonra container ismi verilmelidir:

Remove

Var olan bir container’ın silinmesi için kullanırız. Komuttan sonra container ismi veya id verilmelidir.

Eğer ilgili container çalışır durumdaysa silme işlemi gerçekleştirilmez. Bunun için silme işlemini force etmek gerekir:

Toplu halde bütün container’ları silmek istersek içe içe komut yazabiliriz:

Daha da kolay olan yöntemi prune komutunu kullanmaktır. Çalışmayan tüm container’ları siler:

Bir container’ı çalışması bittiğinde hemen silmek isteyebiliriz. Bunun nedeni özellikle testlerimizi yaparken çok sayıda container ile çalışmamız ve bir süre sonra çöplüğe dönmeye başlaması. Bu gibi durumlar için en iyi yol çalışması bitince hemen kenini yok etsin şeklinde rm komutunu eklemek:

Rename

Bir container’ın ismini değiştirmek için kullanılırız. Önce containerın şu andaki ismi yazılır, ardından vermek istediğimiz yeni isim verilir:

ferhat_hello isimli container’ımız artık hello oldu.

 

Nginx’in Container Üzerinde Çalıştırılması

Nginx için kullanacağımız image nginx. Nginx’in web dosyası yolu: /usr/share/nginx/html

Nginx ayağa kaldırırken yayın yapması gerektiğini belirtmek için -p veya –publish komutumuza eklenecek.

Ayrıca web hizmeti olduğu için port bilgisini de eklemek gerekiyor 8080:80 –> 8080: Host, 80: Container’ın portunu temsil eder. Kısaca biz hostumuz üzerinde yani Docker Engine’in üzerindeki 8080 portunu çağıracağız, o da container’ın 80 portuna yönlendirecek ve biz Nginx servisine ulaşmış olacağız. Host bazından port tekil olduğu için, hostun portunu verirken kullanılmadığından emin olmak gerekiyor. Eğer otomatik bir port atanmasını istiyorsak -P olarak port bilgisi belirtmeden yazarsak, sistem otomatik bir port verecektir.

Komutu bu şekilde run edersek komut ekranında sürekli yayın yapacağı için biz cli’ı kullanamaz hale geliriz, bu sebeple arkaplanda çalışmasını söyleyemek için -d veya –detach‘ı ekleyeceğiz.

SSH Olmadan Container’a Bağlanıp İş Yapabilmek

Öncelikle bir CentOS container ayağa kaldıralım.

Gördüğünüz gibi bir CentOS container oluşturdum ve devam etmesini söylemediğimiz için otomatik olarak sonlandı. Şimdi iletişim kurmak için bazı şeyler yapmamız gerekiyor.

Eğer komut göndermek istiyorsak STDIN’in açık olması gerekir. Bunun için komutumuza –interactive veya -i eklememiz gerekiyor. Bu sayede terminal ile erişebilir durumda oluruz.

Terminale erişim izni vermek için –tty veya -t komutumuza eklenmelidir.

Bu komut ile container ayağa kalkar ve bizim için terminale giriş yapılır. Biz session’ı sonlandırmadığımız sürece de işlem devam eder.

Biz bu komutla aslında bash ortamında çalışmaya başlıyoruz ve biz görmesekte Docker aslında image’in isminde sonra çalışılacak kabuk adını kendi ekliyor, istersek biz bunu kendimizde ekleyebiliriz:

veya

Görüleceği gibi CentOS container’a terminal ile bağlanıp, normal CentOS sunucusunda neler yapabiliyorsan aynı şekilde işlem yapabiliyorum.

Aynı şeyi Python gibi programlama dilleri için de yapabiliriz.

Aynı şekilde bunu bir işletim sistemi için de yapabiliriz. Tabii bir desktop image kullanarak yapabiliriz.

Browser ile 6080 protuna baktğımızda masaüstünü görebiliyoruz:

Çalışan Bir Container’e Erişmek

Biz -i ve -t komutları ile oluşturduğumuz anda container’a erişip işlem yapabildik, sonra işimiz bitti ve çıktık. Fakat Nginx gibi sürekli çalışan bir servise istediğimiz zaman bu şekilde erişebilir miyiz? Hayır. Çünkü docker container run komutu bir kez daha işlettiğimizde aslında yeni bir container oluşturmuş ve bu container’a erişmiş oluruz.

Eğer çalışan bir container’a erişmek istiyorsak exec’i komut setimize ekleriz. Ayrıca -i ve -t parametrelerimizi de eklememiz gerekiyor, ayrı ayrı yazmak yerine bunları -it şeklinde belirtebiliyoruz. Son olarakta container id veya container name eklenerek erişim sağlarız:

Eğer container için bir yükleme yapacaksak, -it parametresine ihtiyacımız yok, container isim veya id’sinden sonra komutu yazmamız yeterlidir. Mesela vim kuracağımızı varsayalım:

Yine diyelim ki containerımız içerisinde bir script dosyamız olsun ve biz bunu çalıştırmak isteyelim. Script dosyamızın adı calis.sh dizini /tmp olsun. Container’ımız ise CentOS. Buna göre:

Container ile Dosya Alışverişi

Bir container’a 3 şekilde kopyalama yapılabilir:

  1. docker container copy komutu ile
  2. Mount Volume
  3. İnternet’ten indirmek

Şimdi bunlara bakalım.

docker container copy

Docker host üzerinden container’a veri taşımak için:

Container’dan Docker host’a veri taşımak için:

docker container cp container:dosya_yolu host_kaydedilecek_dizin_yolu

Şimdi bunu örneklendirelim.

Ben C diskimde paylasim adında bir dizin oluşturdum ve içine deneme.txt diye bir dosya ekledim ve içine de denemedir yazdım.

Şimdi sırada bir container oluşturmak var. CentOS image kullanacağım ve kapanmaması için sleep 30m komutu ile başlatacağım.

Container’ımız ayağa kalktı, şimdi dosyamızı kopyalayalım.

Şimdi kopyaladığımız dizini listeleyelim.

Görüleceği gibi başarıyla dosyamızı kopyaladık. Şimdi de tam tersini yapalım ve ukarıdan gördüğümüz bir dosyayı lokalimize kopyalayalım.

Şimdi dizine baktığımızda dosyayı görüyor olmalıyız:

Mount Volume

Kendi bilgisayarımızdaki bir alanı mount edebiliriz, böylece container içerisinde yerel bir disk gibi kullanabiliriz.

Bu işlemi yapabilmek için -v veya –volume parametresini eklemeliyiz. Akainde lokal_path:/mount_path şeklinde host ve container dosya yolunu göstermiş oluruz.

Ek olarak bunun Docker Desktop içerisinde belirtilmesi gerekebiliyor. Docker Desktop àSettings à Resource à File Sharing

Burada paylaşılacak dizinin tanımlanması gerekiyor; fakat File Sharing yeni sürüm kurulumlarında gelmiyor, çünkü Windows için sanal makine yapısında WSL 2 kullanıyor. Eğer bu işlemi yapmak istiyorsak Hyper-V mode’un aktif olması ve kurulumun buna göre yapılması gerekir.

Komutu örnekleyecek olursam:

WSL 2 olsa da yine de mount edebiliyoruz. Komutu örnkleyecek olursam:

Şimdi listeleyelim:

Görüleceği gibi paylasim dizinimiz altındaki iki dosya /etc dizini altına mount edilmiş oldu. Aynı zamanda /etc altında bulunan dosyalarımızı da paylasim isimli dizinde görebiliriz:

Yani sync edilmiş oluyorlar ve burada oluşan her şey otomatik olarak hem container’da hem de lokalinizde oluşuyor. Şimdi lokalimizde deneme2.txt dosyası oluşturacağım:

Şimdi container’dan kontrol edelim:

Gördüğünüz gibi hemen yansıdır. Oldukça kullanışlıdır.

İnternetten İndirmek

Container’ımız normal bir makine gibi kullanabiliyorduk. Bu durumda en kolay yöntemlerden biri yine internet ortamından istediğimiz veriyi indirmektir. Burada wget kullanabiliriz.

Kurmak için:

Bir adresten indirmek istediğinizde yapmanız gereken tek şey wget yazdıktan sonra url’yi eklemektir, bulunduğu dizine hemen indirecektir.

Çoklu Container Yönetimi

Birden fazla container’ın yönetilmesi kısmına bakacağız. Öncelikle 5 ayrı servis container’ı oluşturacağız:

  1. SQL Server
  2. MariaDB
  3. Nginx
  4. Apache Web Server
  5. .Net Core

SQL Server ve MariaDB için iki instance kuracağız ve aynı uygulmanın farklı container’larına nasıl bağlanacağımızı da göreceğiz.

Şimdi MariaDB ile başlayalım. MariaDB kurulumunda bizim için root şifresi önemlidir, bu sebeple image için root şifresini -e veya –env parametresi sonrasında verebiliyor olacağız. Bu parametre bize envoirment tanımlamamızı sağlıyor.

İkinci bir container daha oluşturuyoruz; ama port bilgisini mecburen 3307 yapacağız, host üzerinde port tekil olmak zorunda olduğu için böyle yapmak durumundayız.

Şimdi SQL Server’a geçelim. Buradaki SQL Server versiyonu, Ubuntu üzerinde çalışan versiyonudur. Envoirment kısmında ilk olarak kullanıcı lisansı kabul etme, ikincisi ise SQL Server için sa şifresi olacak.

Şimdi ikinci SQL Server container’ımızı oluşturalım ve bununda portunu 1434 yapalım:

Şimdi de .Net Core container’ımızı oluşturalım.

Sırada Apache Web Server var:

Son olarak Nginx’i ayağa kaldıralım:

Şu anda tüm container’larımızı oluşturduğumuzu ve çalışır durumda olduklarını görüyoruz.

Şimdi servislerimizi kontrol edelim. Ben database server’lar için DBeaver’ı kullanıyorum, Community Edition işimizi fazlasıyla görüyor. İsterseniz siz de onu yükleyebilirsiniz.

Elimizde bir yönetim aracı olmadığında direk container üzerinden bağlanarak iş ypma şansına sahibiz. Örneğin SQL Server’a bağlanalım:

MariaDB’ye bakalım:

Container Detaylarını Görmek

Bir container’ın detaylarını görmek için inspect komutu kullanılır.

Örnek:

Gördüğünüz gibi epey detaylı, daha çok bir bilgiye odaklanıyorsak grep ile istediğimiz şekilde filtreleyebiliriz. Bunun dışında spesifik kullanabileceğimiz durumlarda var.

Container port bilgisini görelim:

Örnek:

Container log bilgisini görelim:

Örnek:

Container’da çalışan process’leri görelim:

Örnek:

Container kaynak kullanım bilgisini görelim:

Örnek:

Not: Kaynak olarak Murat AKSU’dan faydalanılmıştır.

Data Science Earth

Data Science Earth ekibi, üst düzey Veri Bilim çözümleri üretmek amacı ile toplanmış akademisyenler ve uzmanlardan oluşmaktadır. Öncelikli olarak veri bilincini geliştirmeyi ve küreselleşen rekabet ortamında verinin gücünün doğru kullanılmasını sağlamayı amaçlamaktadır.

Sponsor

QuestionPro 35 farklı soru seçim özelliği ile anket çalışmalarımıza güç katmaktadır.