Bugun...


Geleceğin Çözümü Docker Teknolojisi -3
Uzun süredir vakit bulamadığım için Docker konusunu nihayete erdiremedik. Docker Teknolojisi ile ilgili tek bir makale hazırlayarak geçiştirmeyi düşündüğüm yazının en son 3 seride bitiririm diye düşünürken şimdilerde 4 makalesini yazmayı düşünüyorum. Docker için bu yazdıklarımda sürçü lisan, eksik bilgi vs. varsa şimdiden affınıza sığınıyorum.

Geleceğin Çözümü Docker Teknolojisi -3

Docker Sisteminin Kendisi Hakkında Bilgi

└─$ docker info

└─$ docker version

└─$ docker exec [ContainerAdi/ID] (LinuxKomutlari) à Bu komut birçok noktada makinenin komut satırına erişmeden birçok işlemi yapabilmemize olanak sağladığından buraya not düşmeyi uygun gördüm.

Docker Network Kavramı

└─$ docker network ALTPARAMETRELER

└─$ docker network ls

└─$ docker network inspect ContainerAdi/ID

Diğer mimarilerde olduğu gibi Docker Container’da network konusu çok önemli bir kavramdır. Nitekim bir container kiminle nasıl ve ne şekilde konuşması gerektiğini burada yapılacak olan konfigürasyonla biz belirlemiş olacağız.  Daha açık söylemek gerekirse Docker Container Network konusuna hâkim olmadığımızda ne yapıyor olacağımızı nasıl yapmamız gerektiğini de çok anlamış olmayacağız. Docker üzerinde iki çeşit mimari ile network modellenmesi yapılmış. Manuel olarak müdahale edilmedikçe bir container default olarak docker0 bridge mode network sanal switch’i ile gelir. Containerlar bu switch sayesinde birbirleri ile ve host makinesi ile haberleşebilir.  Docker0 bridge moda sahip olup host makinenin kaynaklarına eriştiği için güvenlik açısında pek tavsiye edilen bir durum değildir. Containerlerın birbiri ile ve dış dünya ile haberleşmelerini sağlamak üzere 2 farklı standart geliştirilmiştir.

 

CNM (Container Network Model)

Docker bünyesine network alanında çalışmalar yapan bir firmayı katmasıyla birlikte CNM yani Container Network Model standardı geliştirmesine yoğunlaşmıştır. CNM libnetwork geliştirmesi 3 ana bileşen ile karşımıza çıkmaktadır.

Network SandBox: Container Yönetim ara yüzü, ip adresi, MAC adresleri, Yönlendirme Tabloları ve DNS ayarları gibi birçok yapılandırma işlemlerinin yapıldığı, konteynerların dış dünyadan izole olmasını ve iç networkta kendi aralarındaki iletişimin yönetilmesi gibi işlerden sorumludur.

Endpoint: Sandbox’ı Network ile birleştirir. Bir endpoint sadece bir sandbox içinde bulunabilir. Farklı networklardaki konteynerlerin bu şekilde haberleşmesini sağlayabiliriz. Bir Endpoint bir sandboxa ait olabilir. Ancak birden çok endpoint bir sandbox oluşturabilir.

Network: Bir Network birbiri ile doğrudan iletişim kurabilme yeteneğine sahip olan birçok endpoint grubundan oluşur.

 

CNM Modeli 2 tane interface sahiptir.  Network Drivers, IPAM(Ip Address Management) Driver. CNM 2015’te geliştirilen Libnetwork yazılımcıların network driver yazabilecekleri bir çalışma ortamı sunmaktadır. Libnetwork, Docker’dan bağımsız olarak kullanılabilir.

Docker Container Network Modeli (CNM) Drivers çalışma mantığını anlamak için temel network bilgimizin olması ve Sanallaştırmada kullanılan Sanal Switch bağlantı modellerinin bilinmesi gerekir. Bunun için daha önce ele aldığımız “HOST-ONLY, BRİDGED, NAT BAĞLANTI TÜRLERİ VE ARASINDAKİ FARKLAR” konusuna göz atmanızda yarar vardır.

Şimdilik bu konuya daha fazla dağıtmamak adına işin tekniğine fazldan girmek istemiyorum. Dileyen için de “LIBNETWORK PORJESI” ve CNM (Container Network Model) ile CNI (Container Network Interfaces) linklerinden daha detaylı bilgi alabilirler.

Kaynak: https://thenewstack.io/container-networking-landscape-cni-coreos-cnm-docker/

 

CNI (Container Network Interfaces)

CNI modeli daha çok çalışma zamanında değişiklikler yapılacaksa kullanılması önerilen bir modeldir. Ağ katmanında takılabilir interfaceler ile esnek çalışma imkânı sunmaktadır.

 

Docker Network Bilgilerini İnceleme

Docker üzerinde network işlemlerini yapabilmek için gerekli olan network komutları, Docker network yazıp TAB tuşuna basınca kullanılabilecek komutlar gösterilir.

 

Bir Docker Container için ip adresini öğrenmek istersek şöyle bir komut yazabiliriz.

└─$ docker container inspect --format '{{ .NetworkSettings.IPAddress }}'  ContainerAdi/ID

Burada '{{ .NetworkSettings.IPAddress }}'  diye belirtielen alan aslında JSON formatinda saklanan ve

└─$ docker container inspect ContainerAdi/ID komutu ile de görebileceğimiz bir alanın içindeki değeri çağırıyoruz. Aşağıdaki görselde görüleceği üzere bir containere ait tüm bilgilerin tutulduğu konfigürasyon dosyasını görmek için inspect komutundan faydalanmıştık.  JSON ("JavaScript Object Notation"); bütün programlama dilleri arasında, yapılandırılmış veri değişimini kolaylaştıran bir metin biçimidir(Vikipedi).

 

Docker Network (Sanal Ağ) Oluşturmak

3 adet konteyner hazırladık. Bunlar üzerinde network konfigürasyon yapacağız. Network ara yüzleri ve ayaklandırdığımız konteynerlarımızın listesi aşağıdaki gibidir. Amacımız network üzerinde pivot bir yapı oluşturmak. Aşağıda network sürücülerinin ne anlama geldiğini açıkladık. Bu sürücülere aslında Virtualization(Sanallaştırma) yapılarından aşina olduğumuzu düşünüyorum.

Network yapılarında HOST-ONLY, BRİDGED, NAT BAĞLANTI TÜRLERİ VE ARASINDAKİ FARKLAR için tıklayınız.

 

Docker üzerinde yeni bir bridge bağlantı türüne sahip network oluşturduk. Daha önce de aynı komutla başka bir tane daha oluşturmuştuk. Konteynerlarımızın sırasıyla bağlantı türlerini kontrol edip birini varsayılan olarak gelen docker network bridge bağlı kalsın diğer ikisini de sırasıyla cml0-ntwrk ve cml_bridge_ntwrk lerine bağlayıp sonra ip adreslerine bakalım.

Network Bağlantı switchleri oluşturulurken istenirse ip adresleri subnetting yapılabilir. Yani şöyle ki defaultta docker 172.17.0.x bloğundan ip adresleri alınır genellikle. Ancak 172.18.0.x veya 172.x.x.x. adreslerinden birisinin kullanılması mümkündür.

 

Docker Network Sanal Switchler

Bridge bağlantı: Host ile container arasında kurulan bir bağlantı tipidir. Docker ile birlikte varsayılan olarak gelmektedir. Bir container oluşturulduğunda eğer özellikle belirtilmemişse bridge network bağlantı tipini kullanmaktadır.  Bu networku kullanan konteynerler kendi aralarında haberleşebilmektedir.

Host Bağlantı: Hosttaki tüm networke erişim olan bir bağlantı tipidir. Güvenlik açısında pek tavsiye edilmez. Çünkü host bağlantı tipinde containerler host bilgisayarın bağlantısı mirror (kopyalama) olarak kullanacaklardır.

None Bağlantı: Bu bağlantı tipine aynı zamanda kapalı bağlantı da denebilir. None bağlantı tipine sahip bir konteyner network içeresindeki hiçbir konteyner ile iletişime geçemez.

Overlay Bağlantı:Docker üzerinde konteynerler arasında haberleşmeyi sağlayan bağlantı çeşididir. Bu bağlantı türünü Kubernetes ve Orchestrator, Swarm gibi mimarilerde çoklu bağlantı sağlamak amacıyla konfigürasyon gerektirir.

MacVlan Bağlantı: MacVlan bağlantı modelinde ise özellikle ağ trafiğini izleyen uygulamalar doğrudan fiziksel ağa bağlanmak isterler.

 docker network create --driver=bridge --subnet=192.168.0.0/16 bridge12 gibi. Veyahut aşağıdaki gibi çok sayıda parametre kullanılarak detaylı bir organizasyon yapılabilir.

  --driver=bridge \

  --subnet=172.28.0.0/16 \

  --ip-range=172.28.5.0/24 \

  --gateway=172.28.5.254 \

 

Çalışan Bir Docker Container’ı Bir Network’e Bağlamak

└─$ docker network connect NetworkSwichTürü ContainerAdi/ID à komutu ile bağlantı türünü seçip istediğimiz konteyneri istediğimiz network bağlayabiliriz. Aşağıdaki komutlarla iki tane veya istediğimiz kadar konteyner tanımlayabiliriz.

└─$ docker run -d --name NessusM2 -p 8834:8834 tenableofficial/nessus:latest

└─$ docker run -d --name WebDVWA -p 80:80 vulnerables/web-dvwa:latest

 

Çalışan tüm docker ip adresleri yukarıdaki gibidir. Hepsi bridge bağlantı tipine sahip olup default bağlantı tipine sahiptir.

└─$ docker container inspect --format '{{.NetworkSettings.IPAddress}}' ContainerAdi/ID àİstediğimiz herhangi bir konteynerin ip adresini öğrenebiliriz.

Network ara yüzleri ve çalışmakta olan konteynerler aşağıdaki gibi listelenmiştir.

 

 

Docker Container Loglarını İnceleme

└─$ docker logs  ContainerAdi/ID veya daha detaylı incelemek için komuta - -details parametresi ekleyerek yeninden çalıştırabiliriz. ( docker logs --details ContainerAdi/ID). Ancak farklı alt parametrelerde söz konusu.

 

Docker -exec Olmadan Komut Çalıştırma

docker exec [ContainerAdi/ID] (LinuxKomutlari) à bir docker konteynerin içerisine girmeden Linux’ta çalıştırabildiğimiz birçok komutu rahatlıkla çalıştırabiliriz.

Bu yazı serilerimizin çok uzun  olduğunun farkındayım ama inanın ancak bu kadar oluyor. Video çekmek snaırım daha mantıklı çağımızın gereği olarak. 




Kaynak: cemal aktekin

Editör: cemal aktekin

Bu haber 1428 defa okunmuştur.

YORUMLAR

Henüz Yorum Eklenmemiştir.Bu Haber'e ilk yorum yapan siz olun.

YORUM YAZ



FACEBOOK YORUM
Yorum

İLGİNİZİ ÇEKEBİLECEK DİĞER HABERLER
ÇOK OKUNAN HABERLER
  • BUGÜN
  • BU HAFTA
  • BU AY
SON YORUMLANAN HABERLER
YUKARI