Docker Üzerine Genel Bakış — Docker Network

Serkan Bingöl
AWS Certified User Group Turkey
7 min readDec 18, 2018

Container mimarisi geliştirme süreçlerine indirgendiğinden beri “Docker” biz geliştiriciler için vazgeçilemez bir araç halini aldı. Docker’ın çıkış amacı aslında çalıştırdığı sistemlerin birbirinden bağımsız (izole) olmasını sağlaması. Başka bir anlatım ile uygulamalar arasında zayıf bağımlılık (loose coupling) prensiplerinde kurgulanmış bir bağın olmasını sağlaması.

Docker ile tanışmak isteyen, tanışan yada yalın bir anlatım arayan kişiler Gökhan Şengün ‘ün blogundaki docker yazılarını ve soru / cevap serisini takip etmesi bir çok konuyu anlamak açısından faydalı olacaktır. Ayrıca devnot TV youtube kanalından docker ile ilgili videoları izleyebilirsiniz.

Containerlar ’ın birbiri arasında iletişim kurması için aynı network içerisinde yapılandırılması gerekmektedir. İşte tam bu noktada Docker Network kavramı ile karşı karşıya kalıyoruz. Bu yazı ile docker network kavramlarını açıklar iken 4 farklı web sunucusunun birbiri ile iletişimlerini sağladığımız bir senaryo ile bu kavramları örneklendirmeye çalışacağız.

Genel olarak docker ile çalıştığımız kısımlarda containerlarımızı ayaklandırmak ve kullanmak için network konusuna dikkat etmesek de docker mimarisi kendi içinde ayarlamalarını yapabileceğimiz bir altyapı bize sunmaktadır.Bu altyapıyı kısaca “Docker bridge network , Docker host network, Docker none network ,Docker user-defined networks ve Docker Service Discovery” kavramlarından oluşmaktadır.

Örnekler için genel bilgilendirme

Bu yazıda yeni docker syntaxine uygun bir yazım kullanmaya çalıştık. Daha önceleri docker ps , docker run gibi kullandığımız komutları docker container [OPTIONS] IMAGE [COMMAND] [ARG…] kuralına uygun biçimde oluşturmaya çalıştım.

Genel Yapı

Docker containerlar ayağa kaldırılırken herhangi bir network ayarlaması yapılmadığı takdirde tüm containerlar default olan bridge networke dahil edilir ve dışarısı ile ya da birbirleri arasında iletişimi bu network üzerinden sağlarlar. Bu bridge network üzerinden eğer containerlar oluşturulurken belirli portlar tanımlanmış ise dışarıya açılacak ve yapmak üzere ayaklandırıldıkları işlerini yerine getirmiş olacaklar. Aşağıdaki resim ile bu mimariyi kısaca özetleyebiliriz.

docker network genel topoloji

Docker bridge network

Docker installation ile birlikte gelen ve default olarak oluşturulan tüm containerların aksi belirtilmedikçe dahil olduğu networktur. Aslnda bu network’e dahil olan tüm containerlar kendi aralarında iletişim halindedirler. Bu kısımda docker nginx image üzerinden sunucu_1 ve sunucu_2 adlı 2 adet container çalıştırıp , sunucu_1 için 1111 portundan ve sunucu_2 için 2222 portundan dışarıya yayın yapmış olacağız. Oluşan network üzerinde aslında bu containerların default bridge networkune dahil olduğunu göstermek adına docker network komutlarından faydalanacağız. Gerekli containerları ayaklandırmak adına $ docker container run — publish 1111:80 — detach — name sunucu_1 nginx komutunu kullandık. Bu komut üzerinde detach ile oluşturulan containerı arka tarafta ayakta kalacak şekilde oluşturuyoruz. Ayrıca name parametresi ile bu oluşan containerlara adlarını atayabilir ve publish parametresi ile host makinesi üzerindeki firewallda hangi portu dinleyeceğine dair ayarlamalarımızı yapmış oluyoruz.

Bridge Network 1

Oluşturulan containerların network ayarlarını listelemek adına $ docker network ls komutunu kullanıyoruz. Bridge network içindeki containerları görmek adına $ docker network inspect bridge komutunu kullanarak oluşturduğumuz json üzerinde bulunan container alanında 2 adet nginx containerımızı görebiliriz. Aynı zamanda aşağıdaki resimden 2 sunucunun da ayakta ve çalışır konumda olduğunu görmekteyiz

bridge network 2

Docker host network

Containerlar bridge’den farklı olarak host network ile çalıştırılırsa , ilgili containerlar host’daki tüm network interface’e erişebilir olacaktır.

Docker none network

Bir containerın “none” networke dahil olarak çalıştırılması durumunda o container, docker network stack’ine alınır fakat herhangi bir network configuration’u yapılmamış olur.

Sunucu_1 olarak isimlendireceğimiz containerımızı ayaklandırırken herhangi bir network parametresi kullanmadığımız için default olarak bridge network içine dahil edilecektir.

docker none network 1

sunucu_2 isimli containerımızı oluştururken network parametresini none olarak kullandığımız takdirde herhangi bir network ayaraması yapılmadan none içine dahil edilerek ilgili container ayaklanmış olacaktır.

docker none network 2

Docker user-defined networks

Bazı özel durumlarda containerların network ayarlamalarının yapılması gerekebilir. Gerekli komutları kullanarak kendi docker networkumüzü oluşturarak , containerlarımızı bu networklere dahil edebiliriz. Öncelikle networklerimizi bir listeleyerek sadece bridge,host ve none networklerimizi görüntülüyoruz. $ docker network create — driver bridge docker_network komutu ile bir adet docker_network adı ile bridge tipinde network oluşturuyoruz.

Docker user-defined network 1

Containerlarımızı oluştururken network parametresini dahil ederek sunucu_1 ve sunucu_2 containerlarını docker_network içine dahil ediyoruz. Default bridge networke baktığımızda oluşturulan containerların bu network içerisinde yer almadığını aşağıdaki resimden takip edebiliriz.

Docker user-defined network 2

Docker_network için listeleme yaptığımızda containerlarımızın bu network içerisine dahil edildiğini görmekteyiz.

Docker user-defined network 3

Docker Service Discovery

Oluşturulmuş olan containerlar aynı network içerisinde ise birbirlerine IP adresleri üzerinden ulaşabilirler. Burada dikkat edilmesi gereken bir nokta eğer container isimleri üzerinden bir iletişim sağlanmak istenirse default network üzerinden değil custom bir network içinde containerların konfigüre edilmiş olması gerekmektedir.

Bu örnek üzerinde 2 containerımızı da docker_network isimli network içine dahil ediyoruz. Sonrasında network inspect komutu ile bir kontrol gerçekleştiriyoruz.

Docker Service Discovery 1

Sunucu_1 isimli container içinde ping işlemi yapmak için gerekli ping paketini indirip kurulumlarını sağlıyoruz.

Docker Service Discovery 2

Sunucu_2 için aynı işlemleri tekrarlıyoruz.

Docker Service Discovery 3

Containerlarımız arasında ping işlemini yapmak için $ winpty docker container exec -it sunucu_2 ping sunucu_1 komutu ile ilgili ping işlemini gerçekleştiriyoruz. Burada windows host üzerinde işlemlerimizi yaptığımız için winpty ön komutuna ihtiyaç duymaktayız. Linux host üzerinde bu ön tanıma ihtiyaç yoktur.

Docker Service Discovery 4

Docker Network Konfigürasyon Senaryosu

Senaryomuzu genel kullanımdan biraz daha farklı olacak şekilde tasarlayalım. 2 adet nginx containeri docker_network üzerinde , 2 adet nginx containerı ise docker_network_2 üzerinde konumlandıralım. Bu sunucular birbirleri ile container isimleri üzerinden iletişim kurabilecek şekilde konfigüre edilmiş ve bizim belirlediğimiz portlar üzerinden dışarıya yayın yapabilecek şekilde yapılandırılmış olsun.

Oluşturduğumuz senaryoyu daha görsel olarak aşağıdaki resimden takip edebiliriz.

İlk olarak Nginx_Container_1 ve Nginx_Container_2 containerlarını docker network üzerinde ayaklandırıp , network inspect komutu ile oluşan containerlarımızı kontrol ediyoruz.

docker container [OPTIONS] IMAGE [COMMAND] [ARG…] syntaxi içindeki command kısmında Nginx_Container_1 üzerinde bir ping paketi olmadığı için bash komutunu kullanarak ilgili paketi indirip kuruyoruz.

Aynı işlemi Nginx_Container_2 içinde gerçekleştiriyoruz.

$ winpty docker container exec -it Nginx_Container_1 ping Nginx_Container_2 komutunu kullanarak container_1 ve container_2 arasında iletişim olduğunu ping vasıtası ile öğreniyoruz.

Container_3 ve container_4 için network create komutunu kullanarak docker_network_2 adı altında bir network daha oluşturup bu containerları da bu yeni oluşan network’e dahil ediyoruz.

network inspect komutu ile yeni oluşan docker_network_2 için ayarlarımızı gözden geçirip , containerların bu network’e dahil olduğundan emin olalım.

docker container [OPTIONS] IMAGE [COMMAND] [ARG…] syntaxi içindeki command kısmında Nginx_Container_3 üzerinde bir ping paketi olmadığı için bash komutunu kullanarak ilgili paketi indirip kuruyoruz.

Aynı işlemi Nginx_Container_4 içinde gerçekleştiriyoruz.

$ winpty docker container exec -it Nginx_Container_3 ping Nginx_Container_4 komutunu kullanarak container_3 ve container_4 arasında iletişim olduğunu ping vasıtası ile öğreniyoruz.

Bu iletişim “Container_1-Container_3" ,”Container_1-Container_4", “Container_2-Container_3" ve “Container_2-Container_4" arasında gerçekleştirilemiyor. Çünkü 1 ve 2 farklı bir network , 3 ve 4 ise ayrı bir network içinde bulunuyor

Docker_network_2 üzerinde bulunan 3 ve 4 numaralı containerları $ docker network connect — link Nginx_Container_3:Nginx_Container_3 docker_network Nginx_Container_3 ve $ docker network connect — link Nginx_Container_4:Nginx_Container_4 docker_network Nginx_Container_4 komutlarını kullanarak docker_network isimli network alanına linkleyerek tüm sunucuların iletişimini tamamlamış olmalıyız.

Docker_network alanı içinde 4 container da bulunmakta.

Daha önce sağlayamadığımız iletişiminin tekrar ping komutunu kullanarak gerçekleştiğini aşağıdaki resimden takip edebilirsiniz.

Ayrıca tüm nginx web sunucuları, tanımlamış olduğumuz portlar üzerinden yayın yapmaktadırlar.

Test Senaryosu aşamaları :https://1drv.ms/b/s!AskWoAU3NqUug_ZKp0OEeDKDHTOQQA

Docker network üzerine genel olarak bilgiler verdiğimiz ve bir sistemi birlikte kurguladığımız yazımızın sonuna geldik. Başka bir yazımızda görüşmek üzere.

--

--

Serkan Bingöl
AWS Certified User Group Turkey

Muzur bir oğlan babası, hayvan sever, Harry Potter hayranı, bazen maceracı düz yazılımcı.