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
1 2 3 |
docker container run hello-world |
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
1 2 3 |
docker container run alpine:latest |
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
1 2 3 |
docker container run mehsatek/demo_image |
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
1 2 3 |
docker container run -d nginx |
-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
1 2 3 |
docker container run -d -p 8080:80 nginx |
-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
1 2 3 |
docker container run -d --name mynginx nginx |
–name ile konteynere özel bir isim atayabilirsiniz. Bu komut, mynginx isminde bir konteyner başlatır.
Örnek
1 2 3 |
docker container run -d -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql |
-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
1 2 3 |
docker container run --interactive --tty centos |
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
1 2 3 |
docker container run --rm -it python:3 |
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
1 2 3 |
docker container run -it python:3 bash |
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:
1 2 3 |
python |
Şimdi Python kabuğundayız. 2+2 işlemini yapmak için:
1 2 3 |
print(2 + 2) |
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:
1 2 3 4 |
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a1b2c3d4e5f6 nginx "nginx -g 'daemon of…" 10 minutes ago Up 10 minutes 0.0.0.0:80->80/tcp nostalgic_morse |
Örnek
1 2 3 |
docker container ls -a |
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.
1 2 3 4 5 |
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a1b2c3d4e5f6 nginx "nginx -g 'daemon of…" 10 minutes ago Up 10 minutes 0.0.0.0:80->80/tcp nostalgic_morse b2c3d4e5f6a1 ubuntu "/bin/bash" 3 hours ago Exited (0) 2 hours ago hopeful_turing |
Örnek
1 2 3 |
docker container ls -q |
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
1 2 3 |
docker container rm --force container_name |
-f veya –force seçeneği ile çalışan bir konteynerı doğrudan silebilirsiniz. Bu, konteynerı önce durdurur ve ardından siler.
Örnek
1 2 3 |
docker container rm $(docker container ls -a -q) |
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:
1 2 3 |
docker container exec [OPTIONS] CONTAINER COMMAND [ARG...] |
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:
1 2 3 |
docker container exec -it [CONTAINER_NAME_OR_ID] bash |
Örnek
Çalışan bir konteynerdeki bir dosyanın içeriğini görüntülemek:
1 2 3 |
docker container exec [CONTAINER_NAME_OR_ID] cat /path/to/file.txt |
Örnek
Çalışan bir konteynerdeki bir hizmetin durumunu kontrol etmek: Eğer konteynerinizde systemd ya da benzeri bir hizmet yöneticisi bulunuyorsa:
1 2 3 |
docker container exec [CONTAINER_NAME_OR_ID] systemctl status [SERVICE_NAME] |
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:
1 2 3 |
docker container inspect [CONTAINER_NAME_OR_ID] |
Ö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:
1 2 3 |
docker container inspect mycontainer | jq -r '.[0].NetworkSettings.IPAddress' |
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:
1 2 3 |
docker container port [CONTAINER_NAME_OR_ID] |
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:
1 2 3 |
80/tcp -> 0.0.0.0:8080 |
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:
1 2 3 |
docker container logs [OPTIONS] CONTAINER |
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:
1 2 3 |
docker container logs mycontainer |
Örnek
Konteynerin loglarını canlı olarak takip etmek:
1 2 3 |
docker container logs -f mycontainer |
Örnek
Konteynerin son 50 satırını göstermek:
1 2 3 |
docker container logs --tail 50 mycontainer |
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
1 2 3 |
docker container top mycontainer |
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
1 2 3 |
docker container stats mycontainer |
# docker container attach
Bu komut, çalışan bir konteynerin standart giriş, çıkış ve hata akışlarına bağlanmanıza olanak tanır.
Örnek
1 2 3 |
docker container attach my_container_name |
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
1 2 3 |
docker container commit my_container new_image_name |
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
1 2 3 |
docker container cp my_container:/path/in/container /local/path |
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
1 2 3 |
docker container create --name my_new_container my_image |
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
1 2 3 |
docker container diff my_container |
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
1 2 3 |
docker container export my_container > my_container.tar |
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
1 2 3 |
docker container kill my_container1 my_container2 |
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
1 2 3 |
docker container update --memory 512m my_container |
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
1 2 3 |
docker container wait my_container |
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.
Yeni bir yazımda görüşmek üzere.
Happy coding!