Docker Network

Deniz TÜRKMEN
7 min readSep 7, 2022

--

Merhabalar,

Bu yazımızda Docker Network ne olduğu, komutları ve türleri inceliycez.

Containerlar ’ın birbiri arasında iletişim kurması için aynı network içerisinde olması gerekmektedir. Docker Network ile containerların iletişime geçmesi sağlanır. Docker network bizim için içerisinde network ayarlaması yapabileceğimiz bir altyapı sunmaktadır. Herhangi bir network connect olmasak da docker network default olarak container ların birbiri ile iletişimde olması için bridge network dahil eder. Bridge network ile container arası ve dış dünya ile iletişim bu network üzerinden olur.

Docker Network Mimarisi

Docker’ı sistemimize kurduğumuzda docker0 adında default olarak bridge network tanımlaması yapmaktadır.

Docker Network Temelleri :

CNM(Container Network Model) ve CNI(Container Network Interface) sayesinde birden fazla ağ kullanan containerlar standartta uygun network tanımlaması yapılabilmektedir.

CNM (Container Network Model) :

  • Aynı ağ üzerindeki containerların birbiriyle iletişim kurması sağlar.
  • Çoklu network trafiğini bölümlere ayırması sağlar.
  • Containerların birden fazla network dahil edilmesi sağlar.
Şekil 1 :Container Networking Model

Container Network Model Objeleri

Sandbox: Container yönetimi arayüzü, ip, mac adresleri, dns ayarlarının yapılmasından sorumludur. Containerları dış dünyadan izole eder ve iç network ile iletişimi yoktur.

Endpoint: Sandbox dış network bağlar. Bir endpoint sadece bir network bağlanabilir.

Network: Birbiriyle iletişim kuran endpoint temsil eder. Endpoint-endpoint ile container-container taşınan yolu belirler.

Driver: Ağın sahibidir ve çeşitli kullanım durumlarını ve dağıtım senaryolarını karşılamak için birden fazla sürücünün katılmasıyla ağı yönetmekten sorumludur.

Docker Network Komutları

Docker network komutlarına docker network diyerek görebiliriz.

docker network

komutları nasıl kullanacağımız ve detaylı kullanım parametreleri görmek için - -help komutunu kullanırız. docker network create - -help komutuna bakacak olursak ;

docker network connect ile kendi oluşturduğumuz bir network veya docker network türlerine (bridge, host, none, overlay ve macvlan) networkümüzü containerımızı bağlayabiliriz.

docker network connect bağlantı_yapılacak_networkbaglayacağımız_container_name

docker network create ile yeni bir network oluşturabiliriz.

docker network create --driver network_türü network_adi

docker network disconnect ile bağlı olduğumuz network bağlantımızı koparırız ve none network sahip olmuş olur.

docker network disconnect network_adi container_adi

docker network inspect ile network detaylarına bakabiliriz.

docker network inspect network_adi

Not : Benim ayakta iki tane containerım koştuğu için, herhangi bir network connect olmadığımdan default olarak bridge network bağlantı kurmuştur. Fark ettiyseniz ikisi de aynı ağ üzerinde koşmaktadır yani birbirleriyle iletişim içindedirler.

docker network ls ile sisteminiz de olan networkleri listeleyebiliriz.

docker network prune ile sistemdeki tüm networkleri silebiliriz.

docker network prune

bu komut ile kendi oluşturduğunuz networkleri silebilirsiniz. Default olarak gelen networklari sistemden silinmez.

docker network rm ile sistemdeki istediğimiz network silebiliriz.

docker network rm network_id veya network_adı

Docker Network Türleri :

Şekil 2 : Docker Network Türleri
Şekil 3: Docker Network Türleri

Bridge Network : Host bilgisayar ile container arasında ağ oluşturulur. Docker yüklediğimizde default olarak gelen ve herhangi bir network connect olmadığımızda default olarak atandığı network tipidir. Default olarak containerlar bridge network bağlı oldukları için containerlar birbirleri ile iletişime kurabilirler. Bridge network detaylarına bakmak için kullanacağımız komut

docker network inspect network_türü

Adı, ne zaman oluşturulduğu, options’ları, bağlı container’ları vs görebiliriz. Containers objesinin altında network’e bağlanmış container’ları göreceğiz.

Şimdide isterseniz bir bridge network örneği ile konuyu pekiştirelim. Senaryomuz bir tane webapi, bir tane database (mysql) ve urun container olsun. Network olarak frontend-network ve backend-network oluşturalım.

frontend-network ‘üne webapi ve urun containerını dahil edelim.

backend-network’ünüde database ve urun containerları ekleyelim.

ilk olarak network oluşturalım ve detaylarına bakalım.

docker network create --driver bridge --subnet "192.168.50.0/24" --gateway "192.168.50.1" frontend-networkvedocker network create --driver bridge backend-network
  • Yukarıdaki komutları terminalden çalıştıralım ve inspect komutu ile detaylarına bakalım.
  • Şimdide backend-network oluşturalım ve detaylarına bakalım.

Containerlarımızı oluşturalım.

  1. Container;
docker container run --name webapi --detach --network frontend-network — ip "192.168.50.120" alpine sleep 50m

2. Container;

docker container run --name database --detach -e MYSQL_ROOT_PASSWORD=deniz --network backend-network mysql

3. Container;

docker container run --name urun --detach --network frontend-network alpine sleep 50m

Yukarıdaki kodları biraz açıklamak gerekirse;

- -network ile hangi network bağlantı yapılacak ise o network’ün ismi yazılır.

Not: Containerımızı birden fazla network ile bağlantılı olması isteyebiliriz. Aşağı komutu çalıştırdığımızda hata alırız.

docker container run --name urun --network frontend-network --network backend-network alpine sleep 50myadadocker container run --name urun --network frontend-network ,backend-network alpine sleep 50m

Eğer bir containerımızı birden fazla network bağlamak istiyorsak.

docker network connect network_adi container_ismi

Komutu ile istediğimiz kadar network bağlayabiliriz.

Network detaylarını bakalım. İlk olarak frontend-network.

docker network inspect frontend-network

Yukarıdaki şekilde gözüktüğü gibi webapi ve urun containerı frontend-network bağlanmış ve iki container artık birbiri ile iletişim kurabilir.

Şimdide backend-network detaylarına bakalım.

docker network inspect backend-network

Yukarıdaki şekilde gözüktüğü gibi database ve urun containerı backend-network bağlanmış ve iki container artık birbiri ile iletişim kurabilir.

Şimdide urun containerın içine girerek aldığı ip adreslerine bakalım. Bunun için çalıştırcağımız komut,

docker container exec -it container_ismi sh

Yukarıdaki şekilde gözüktüğü gibi ürun containerımız hem frontend-network hem de backend-network ”ünden ip adresi almıştır.

Şimdide webapi ve database containerını ping atalım.

  • webapi ip adresi -> 192.168.50.120
  • database ip adresi -> 172.19.02

Yukarıdaki örnekte görüldüğü üzere webapi ve urun containerı aynı network dahil olmuş. database ile urun containerı da aynı network dahil olarak birbirleri ile iletişim kurması sağlanmıştır.

Host Network : Hosttaki tüm network erişim olacaktır. Aynı IP adresini alırlar. Tehlike bir network türüdür. Yani Host ağı ile local bilgisayarın network arayüzüne bağlanırsınız.

None Network : Container none network dahil olursa network içerisinde hiçbir container ile iletişime geçemez. None olarak çalıştırılan containerlar docker network stack’ine alınırlar ancak herhangi bir network configuration yapılmaz.

Docker User-Defined Network : Kendi networkumuzu oluşturulup uygulamamızı grupladığımız network türüdür. Kullanımı ;

docker network create --driver network_turu network_adi

Overlay Network : Docker containerlar arasında haberleşmeyi sağlayan network ağıdır. VXLAN(Virtual Extensible Lan) teknolojisi ile diğer katmanlardan izole bir şekilde container haberleşmelerini sağlar. Kabaca şöyle düşünebiliriz. Telefon hatları underlay network ise internet overlay network denilebilir.

Not: Docker Swarm yazımda daha detaylı inceliycez.

MacVlan Network : Bazı uygulamalar, özellikle ağ trafiğini izleyen uygulamalar doğrudan fiziksel ağa bağlanmayı bekler. Bu durumda, macvlan ağ sürücüsünü her bir containerın sanal ağ arabirimine bir MAC adresi atamak için kullanılır. Bu da fiziksel ağa doğrudan bağlı fiziksel bir ağ arabirimi gibi görünmesini sağlar. Macvlan ,Docker ana makinenizde macvlan’ın alt ağı ve ağ geçidi için fiziksel bir arabirim belirlemeniz gerekir. Hatta macvlan ağlarınızı farklı fiziksel ağ arayüzleri kullanarak izole edebilirsiniz.

Not : Docker Swarm yazımda daha detaylı inceliycez.

--

--

Deniz TÜRKMEN
Deniz TÜRKMEN

No responses yet