Docker Container Nedir? Docker Container Komutları

Container, bir uygulamanın çalıştırılabilir kodunu, bağımlılıklarını, kütüphanelerini, sistem araçlarını ve sistem ayarlarını içeren hafif ve taşınabilir paketlerdir. Bir container, başka bir sisteme taşındığında da aynı şekilde çalışır, çünkü tüm ihtiyaç duyduğu şeylerle beraber paketlenmiştir.

Container teknolojisi, son yıllarda yazılım geliştirme ve dağıtım süreçlerinde büyük bir devrim yaratmıştır. İşte container teknolojisinin bazı temel faydaları:

 Tutarlılık ve Taşınabilirlik:  Container’lar, uygulamanın ve bağımlılıklarının her zaman aynı yapılandırmayla çalıştığı izole bir ortam sağlar. Bu, “Benim bilgisayarımda çalışıyordu” gibi yaygın problemlerin üstesinden gelmeye yardımcı olur. Bir container’ı bir geliştirme ortamından üretim ortamına kolayca taşıyabilirsiniz.

 Hız:  Container’lar hafiftir ve saniyeler içerisinde başlatılıp durdurulabilir. Bu, geliştirme sürecini hızlandırmanın yanı sıra, yüksek ölçeklenebilirlik ve hızlı yanıt süreleri gerektiren uygulamalarda avantaj sağlar.

 Kaynak Optimizasyonu:  Container’lar, VM (Sanal Makine) tabanlı sanallaştırmaya göre daha az sistem kaynağı tüketir. Her container sadece gereksinim duyduğu bileşenleri içerir ve kendi işletim sistemini taşımaz, bu da daha az hafıza ve depolama alanı kullanılması anlamına gelir.

 İzolasyon:  Her container bağımsızdır, bu da bir container’da yapılan değişikliklerin diğer container’ları etkilemediği anlamına gelir. Bu, uygulama güvenliğini ve kararlılığını artırır.

 Modülerlik ve Ölçeklenebilirlik:  Uygulamaları farklı container’lar içinde çalıştırarak mikro-servis mimarisiyle kolaylıkla entegre edebilirsiniz. Bu, uygulamaların kolaylıkla ölçeklenmesine ve güncellenmesine olanak tanır.

 Sürüm Yönetimi ve Geri Alabilirlik:  Docker gibi container teknolojisi araçları, farklı uygulama sürümlerini yönetme ve gerektiğinde önceki sürümlere geri dönme yeteneği sunar.

 Entegrasyon ve Otomasyon:  Container’lar, sürekli entegrasyon (CI) ve sürekli dağıtım (CD) süreçleriyle kolayca entegre edilebilir, bu da yazılım dağıtımını otomatikleştirmeye ve hızlandırmaya yardımcı olur.

 Geliştirme ve Test Kolaylığı:  Geliştiriciler, yerel makinelerinde üretimle aynı ortamı hızla oluşturabilir ve test edebilir. Bu, sorunların daha erken tespit edilmesine ve çözülmesine yardımcı olur.

 Güvenlik:  İzole edilmiş container ortamları, potansiyel güvenlik tehditlerini sınırlar. Eğer bir container’da güvenlik ihlali meydana gelirse, bu diğer container’lara sıçramaz.

 Lisans Maliyetlerinde Azalma:  Sanal makinelerin aksine, her container kendi işletim sistemini taşımadığı için, lisans maliyetleri önemli ölçüde azalabilir.

Container Mimarisi

Konteyner mimarisi, yazılımın tüm bağımlılıklarını ve gereksinimlerini bir arada toplayarak, uygulamanın nerede çalıştırıldığına bakılmaksızın aynı şekilde çalışmasını sağlama prensibine dayanır. Bu, bir sandığın içine bir şeyleri koymak gibi düşünülebilir; nereye götürürseniz götürün, içindekiler aynı kalır.

Temel Bileşenleri:

 Container: 

Özünde, bir konteyner, bir uygulamanın ve onun çalışması için gerekli olan tüm dosyaların, kütüphanelerin, bağımlılıkların ve diğer gereksinimlerin izole edildiği bir pakettir.

Farklı ortamlarda tutarlı bir şekilde çalışır. Yani bir konteyneri geliştirme makinenizde çalıştırdığınızda, aynı konteyneri sunucuda veya bulutta da aynı şekilde çalıştırabilirsiniz.

 Image: 

Konteynerin temelini oluşturan şablondur. Yani, bir konteyner başlatmak istediğinizde, bu imajdan bir örnek alınır ve çalıştırılır.

Bir imajı, bir kitaptaki yemek tarifi gibi düşünebilirsiniz. Tarif, yemeğin nasıl yapılacağını açıklar; imaj da konteynerin nasıl oluşturulacağını açıklar.

Nasıl Çalışır?

Bir uygulamayı konteyner içinde çalıştırmak için, öncelikle bu uygulama için bir imaj oluşturmanız gerekir. Bu imaj, uygulamanızın kodunu, çalıştırma zamanını, kütüphaneleri, değişkenleri ve diğer tüm bağımlılıkları içerir. İmaj oluşturulduğunda, bu imajı kullanarak bir veya birden fazla konteyner başlatabilirsiniz.

Konteynerler izole edilmiştir, bu da her konteynerin kendi işletim sistemini, CPU’sunu, belleğini, disk alanını ve diğer kaynaklarını kullandığı anlamına gelir. Bu izolasyon sayesinde, bir konteynerde bir değişiklik yapmak diğer konteynerleri etkilemez.

Docker Container Komutları

 #  docker container

Bu komut, konteynerle ilgili işlemleri gerçekleştirmek için kullanılır. docker container –help komutunu kullanarak bu kategori altındaki tüm komutları ve seçenekleri görebilirsiniz.

 #  docker container run

Bu komut, belirttiğiniz imajı kullanarak bir konteyner başlatır. Eğer lokalde bu imaj yoksa, Docker bu imajı Docker Hub’dan çekmeye çalışacaktır.

 Örnek 

Bu komut, hello-world imajını çalıştırır. Bu imaj, Docker’ın başarıyla kurulduğunu onaylamak için basit bir mesaj (Hello from Docker!) görüntüler.

 Örnek 

Docker’da, imaj adlarından sonra gelen :latest gibi ifadeler, imajın etiketlerini (tags) temsil eder. Etiketler, genellikle bir imajın farklı versiyonlarını veya varyasyonlarını tanımlamak için kullanılır.

Eğer bir imaj adından sonra etiket belirtmezseniz (örneğin sadece alpine yazarsanız), Docker genellikle latest etiketli sürümü varsayarak onu çekmeye çalışır.

Bazı imajlar, spesifik versiyonlarına göre etiketlenir. Örneğin, alpine:3.9 şeklinde bir kullanım, alpine’in 3.9 versiyonunu ifade eder.

Bazı imajlar, belirli konfigürasyonları veya varyasyonları temsil eden özel etiketlere sahip olabilir. Örneğin, python:3.8-slim etiketi, Python’ın 3.8 versiyonunun daha hafif bir varyasyonunu temsil eder.

 Örnek 

Burada mehsatek Docker Hub’daki kullanıcı adı veya organizasyon adını (repository sahibini) ve demo_image ise imajın adını temsil eder. Bu komutun çalıştırılmasıyla ilgili ne olacağına gelirsek:

 ⇒  Öncelikle Docker, lokal sistemde mehsatek/demo_image adında ve varsayılan olarak latest etiketiyle bir imajın olup olmadığını kontrol eder.

 ⇒  Eğer bu imaj lokalde mevcut değilse, Docker otomatik olarak Docker Hub’dan bu imajı indirmeye çalışır.

 ⇒  İmaj başarıyla indirildikten (veya zaten mevcutsa) sonra, bu imajı kullanarak bir konteyner başlatılır.

 Örnek 

-d veya –detach seçeneği ile konteyneri arka planda çalıştırabilirsiniz. Bu komut, nginx web sunucusunu arka planda çalıştırır.

 Örnek 

-p veya –publish ile host makinedeki bir portu konteynerdeki portla eşleyebilirsiniz. Bu komut, host makinenizin 8080 portunu konteynerin 80 portuna yönlendirir. Bu sayede http://localhost:8080 üzerinden nginx web sunucusuna erişebilirsiniz.

 Örnek 

–name ile konteynere özel bir isim atayabilirsiniz. Bu komut, mynginx isminde bir konteyner başlatır.

 Örnek 

-e veya –env ile konteynere ortam değişkenleri ekleyebilirsiniz. Bu komut, MySQL imajını kullanarak bir konteyner başlatır ve root şifresi olarak my-secret-pw’yi atar.

 Örnek 

Bu komut, interaktif bir modda ve terminal (TTY) ile bir CentOS konteyneri başlatmanızı sağlar. Ayrıntılı olarak inceleyelim:

–interactive veya kısa formu -i: Konteynerin standart girişi açık tutulur, yani klavyeden girdiğiniz komutlar konteyner tarafından kabul edilir.

–tty veya kısa formu -t: Bu seçenek, konteynere ayrılmış bir terminal (TTY) atar. Bu, komut satırı işlemlerini yapabilmek için kullanılır.

Bu komutla CentOS tabanlı bir konteyner başlattığınızda, konteynerin shell’ine (muhtemelen bash ya da sh) erişim kazanırsınız. Bu shell’den CentOS sistemini yönetebilir, paket yükleyebilir, dosyalarla çalışabilirsiniz.

Eğer konteynerin içindeyken terminalden çıkmak isterseniz: Konteyner shell’inde exit komutunu yazıp Enter tuşuna basabilirsiniz.

Bu komut özellikle, bir Linux dağıtımını test etmek, bir yazılımın belirli bir dağıtımda nasıl çalıştığını görmek veya genel olarak öğrenme amaçlı kullanımlar için oldukça faydalıdır.

 Örnek 

Bu komut, Docker’da interaktif bir modda bir Python konteyneri başlatmanızı sağlar ve konteynerdan çıktığında otomatik olarak bu konteyneri siler.

–rm: Bu seçenek, konteynerin otomatik olarak silinmesini sağlar. Yani, konteynerden çıkıldığında (konteyner durdurulduğunda) bu konteyneri Docker’dan otomatik olarak kaldırır. Bu, özellikle kısa süreli testler veya bir seferlik işlemler için kullanışlıdır, böylece temizlikle uğraşmanıza gerek kalmaz.

-it: Bu, iki seçeneğin kısa formudur: –interactive ve –tty.

 Örnek 

Bu komut, Python 3.x sürümünü taşıyan bir Docker konteynerinde, interaktif modda bir bash kabuğu başlatmanızı sağlar.

bash: Bu, konteyner başlatıldığında çalıştırılacak olan komuttur. Yani, bu komut sayesinde Python konteyneri içinde bash kabuğuna erişim sağlamış oluyorsunuz.

Eğer bash yazmasaydınız ve sadece docker container run -it python:3 komutunu kullanırsanız, konteyner Python’un interaktif kabuğunu (REPL) başlatır. Yani, doğrudan Python komutlarını girebileceğiniz bir Python kabuğuna erişim sağlamış olursunuz.

Bu komutla, Python 3.x sürümünü taşıyan bir Docker konteyneri başlatmış olur ve bu konteynerin içinde interaktif bir bash kabuğuna erişim sağlarsınız.

Bash kabuğu içinde Python kabuğuna erişim sağlamak için:

Şimdi Python kabuğundayız. 2+2 işlemini yapmak için:

Bu, size 4 sonucunu verecektir. İşiniz bittiğinde, Python kabuğundan çıkmak için exit() yazabilirsiniz. Ardından bash kabuğundan çıkmak için yine exit komutunu kullanabilirsiniz.

 #  docker container ls 

Bu komut (eski ismiyle docker ps), şu anda çalışan tüm konteynerleri listeler. Her konteyner için aşağıdaki bilgileri gösterir:

 Örnek 

Bu komut (eski ismiyle docker ps -a), çalışan ve durmuş tüm konteynerleri listeler. Yani, eğer bir konteyneri başlatıp daha sonra durdurdunuz veya bir konteyner bir sebeple çöktüyse, bu komutla listelenecektir. Bu, yalnızca çalışan konteynerleri gösteren docker container ls komutundan farklıdır.

Aynı bilgileri (yukarıda belirtildiği gibi) gösterir, ancak ek olarak durmuş konteynerler de listelenir.

 Örnek 

Bu komut, çalışan tüm konteynerlerin ID’lerini listeler. Genellikle bu ID’ler, diğer komutlarda birden fazla konteyner üzerinde işlem yaparken kullanılır.

 #  docker container rm container_name

Belirtilen konteynerı siler. Ancak çalışan bir konteynerı bu komutla silemezsiniz. Öncelikle konteynerın durdurulmuş olması gerekir.

 Örnek 

-f veya –force seçeneği ile çalışan bir konteynerı doğrudan silebilirsiniz. Bu, konteynerı önce durdurur ve ardından siler.

 Örnek 

Bu komut biraz daha karmaşıktır ve shell komutunun bir özelliğini kullanır. Temelde tüm konteynerlerı (çalışan ve durmuş olanları) silmek için kullanılır.

  • docker container ls -a -q: Bu komut, tüm konteynerlerin (aktif ve inaktif olanlar) ID’lerini listeler.
  • $(…): Bu yapı, içerisindeki komutun çıktısını dışarıdaki komutun bir argümanı olarak kullanır.

Bu örnekte, tüm konteynerler silinir.

 #  docker container rename old_container_name new_container_name

Bu komut, varolan bir konteynerin adını değiştirmek için kullanılır.

 #  docker container prune

Bu komut, durmuş tüm konteynerleri silmek için kullanılır. Yani çalışmayan konteynerleri otomatik olarak kaldırır. Disk alanı temizliği yapmak için kullanışlıdır. Komut çalıştırıldığında, silme işlemi için onay istenir.

 #  docker container exec

Çalışan bir Docker konteynerinde komut çalıştırmanızı sağlar. Bu, özellikle bir konteynerin içinde hızlıca bir işlem yapmak veya konteynerin durumunu kontrol etmek için oldukça kullanışlıdır.

Komutun temel yapısı şöyledir:

OPTIONS: Bu komuta verilebilecek seçenekleri temsil eder. En yaygın kullanılanları:

  • -i, –interactive: Konteynerin standart girişi açık tutulur.
  • -t, –tty: Konteynere bir pseudo-TTY tahsis edilir. Genellikle interaktif shell oturumları için kullanılır.

 Örnek 

Çalışan bir konteynerde bash kabuğu başlatmak: Eğer konteynerinizde bash bulunuyorsa, bu komutla konteynerin içinde interaktif bir bash kabuğu başlatabilirsiniz:

 Örnek 

Çalışan bir konteynerdeki bir dosyanın içeriğini görüntülemek:

 Örnek 

Çalışan bir konteynerdeki bir hizmetin durumunu kontrol etmek: Eğer konteynerinizde systemd ya da benzeri bir hizmet yöneticisi bulunuyorsa:

Bu komut, çalışan konteynerlerle etkileşim kurmanız için oldukça güçlü bir araçtır. Eğer konteyneriniz çalışıyorsa ve belirli bir işlemi hızlıca gerçekleştirmek istiyorsanız, doğrudan bu komutu kullanabilirsiniz. Ancak, docker container exec komutu sadece çalışan konteynerler üzerinde işlem yapar, durmuş bir konteyner üzerinde işlem yapmak için bu komutu kullanamazsınız.

 #  docker container inspect

Docker konteyneri hakkında ayrıntılı bilgi verir. Bu bilgi, JSON formatında döndürülür ve konteynerin tüm yapılandırması, ağ ayarları, bağlantı noktaları ve diğer birçok detayı içerir.

Bu komut, bir konteynerin yapılandırması veya çalışma zamanı durumu hakkında ayrıntılı bilgilere ihtiyaç duyduğunuzda oldukça yararlıdır. Ayrıca, otomasyon veya script yazma durumlarında bu bilgileri kullanabilirsiniz.

docker container inspect komutunun temel kullanımı şöyledir:

 Örnek 

Eğer bir konteynerin adı mycontainer ise ve bu konteynerin IP adresini almak isterseniz, bu bilgiyi docker container inspect ile alıp jq gibi bir araçla ayrıştırabilirsiniz:

Bu komut, mycontainer adlı konteynerin IP adresini döndürecektir.

Genel olarak, docker container inspect komutu, Docker konteynerleri hakkında derinlemesine bilgi edinmek ve bu bilgileri diğer işlemler için kullanmak amacıyla oldukça kullanışlıdır.

 #  docker container port

Belirli bir Docker konteynerinde hangi portların başka portlara yönlendirildiğini (map edildiğini) gösterir. Bu, bir konteynerde çalışan bir uygulamanın hangi port üzerinden dış dünyayla iletişim kurduğunu öğrenmek için yararlıdır.

Komutun temel kullanımı şöyledir:

Bu komutun çıktısı, konteynerin içindeki portların (genellikle sol tarafta) hangi host portlarına (genellikle sağ tarafta) yönlendirildiğini gösteren bir listeyi içerir.

 Örnek 

Eğer bir konteynerdeki 80 numaralı port, host makinenin 8080 numaralı portuna yönlendirilmişse, docker container port komutunun çıktısı şuna benzer olacaktır:

Bu çıktı, konteynerin 80 numaralı portunun host makinenin 8080 numaralı portuna yönlendirildiğini gösterir.

 #  docker container logs

Belirli bir konteynerin loglarını (çıktılarını) gösterir. Bu, bir konteynerin ne yaptığını, herhangi bir hata veya uyarı mesajını anlamak için oldukça yararlıdır.

Komutun temel kullanımı şöyledir:

OPTIONS: Bu komuta ek olarak verilebilecek seçenekleri temsil eder. En yaygın kullanılanları şunlardır:

  • –follow veya -f: Logları canlı olarak takip edin. Yani yeni log satırları geldikçe ekranda gösterilir.
  • –tail: Son kaç satırın gösterileceğini belirtir. Örneğin, –tail 100 son 100 satırı gösterir.
  • –since: Belirli bir zaman diliminden bu yana olan logları gösterir. Örneğin, –since 2h son iki saatteki logları gösterir.

 Örnek 

Konteynerin tüm loglarını göstermek:

 Örnek 

Konteynerin loglarını canlı olarak takip etmek:

 Örnek 

Konteynerin son 50 satırını göstermek:

Bu komut, özellikle konteynerde çalışan uygulamanın durumu, olası hatalar veya uyarılar hakkında hızlı bir geri bildirim almak için oldukça yararlıdır. Bu nedenle, Docker ile çalışırken sıkça kullanılan bir komuttur.

 #  docker container top

Bu komut, belirli bir konteyner içinde çalışan işlemlerin bir listesini verir, benzer bir şekilde Unix/Linux’taki top komutunun çalışma şekli gibidir.

 Örnek 

Bu komut, mycontainer adında çalışan konteyner içerisindeki işlemlerin bir listesini döndürecektir.

 #  docker container stats

Bu komut, belirli bir konteynerin sistem kullanım istatistiklerini (CPU, bellek, ağ I/O, disk I/O vb.) gerçek zamanlı olarak gösterir. Bu, konteynerin kaynak kullanımı hakkında hızlı bir genel bakış elde etmek için yararlıdır.

 Örnek 

 #  docker container attach

Bu komut, çalışan bir konteynerin standart giriş, çıkış ve hata akışlarına bağlanmanıza olanak tanır.

 Örnek 

Bu komut, my_container_name adındaki çalışan konteynere bağlanacaktır.

 #  docker container commit

Bu komut, çalışan bir konteynerde yapılan değişikliklerden yeni bir Docker imajı oluşturmanızı sağlar.

 Örnek 

Bu komut, my_container konteynerindeki değişikliklerden new_image_name adında bir imaj oluşturacaktır.

 #  docker container cp

Bu komut, bir konteyner ile yerel dosya sistemi arasında dosya veya klasörleri kopyalamanıza yarar.

 Örnek 

Bu komut, konteyner içindeki belirtilen dosyayı yerel sisteminize kopyalayacaktır.

 #  docker container create

Bu komut, yeni bir konteyner oluşturmanıza imkan tanır.

 Örnek 

Bu komut, my_image imajından my_new_container adında bir konteyner oluşturacaktır.

 #  docker container diff

Bu komut, bir konteynerin dosya sisteminde yapılan değişiklikleri incelemenizi sağlar.

 Örnek 

Bu komut, my_container adlı konteynerde yapılan dosya veya klasör değişikliklerini gösterecektir.

 #  docker container export

Bu komut, bir konteynerin dosya sistemini tar arşivi olarak dışa aktarmanıza olanak tanır.

 Örnek 

Bu komut, my_container konteynerinin dosya sistemini bir tar arşivi olarak dışa aktaracaktır.

 #  docker container kill

Bu komut, bir veya daha fazla çalışan konteyneri sonlandırmanıza yarar.

 Örnek 

Bu komut, belirtilen konteynerleri hemen sonlandıracaktır.

 #  docker container update

Bu komut, bir veya daha fazla konteynerin yapılandırmasını güncellemenize olanak sağlar.

 Örnek 

Bu komut, my_container adlı konteyner için kullanılan belleği 512MB ile sınırlayacaktır.

 #  docker container wait

Bu komut, bir veya daha fazla konteynerin durmasını bekler ve sonrasında çıkış kodlarını yazdırır.

 Örnek 

Bu komut, my_container adındaki konteynerin sonlandırılmasını bekleyip, sonlanma durum kodunu gösterecektir.

 #  docker container stop container_name

Bu komut, belirtilen konteyneri durdurur.

 #  docker container start container_name

Durdurulmuş bir konteyneri yeniden başlatmak için kullanılır.

 #  docker container restart container_name

Belirtilen konteyneri yeniden başlatır.

 #  docker container pause container_name

Konteynerin tüm süreçlerini askıya alır.

 #  docker container unpause container_name

Askıya alınan konteynerin süreçlerini devam ettirir.

Umarım “Docker Container Nedir? Docker Container Komutları” başlıklı yazım sizin için faydalı olmuştur.

Şu yazılar da ilginizi çekebilir.

Docker Nedir? Docker Mimarisi

Yeni bir yazımda görüşmek üzere.

Happy coding!

Yorum Yazın