Docker Network Türleri Nelerdir ve Neden Kullanılırlar?
Docker nedir ve temel komutlar nelerdir? ,Docker volume mapping nedir ve temel komutlar#2 nelerdir? ve DockerFile Nedir ve Docker Image Nasıl Oluşturulur? içeriklerinden sonra Docker Network Türleri Nelerdir, Neden Kullanılır ve kullanıcı tanımlı network nasıl tanımlayabiliriz? gibi konulara detaylı değinip bu içeriğimizde çeşitli örnekleri uygulayacağız.
Docker Container’lar Kendileri Arasında Nasıl İletişim Kurarlar?
Docker host üzerindeki docker container’lar gateway’e sahiptirler ve bu gateway üzerinden birbirilerine bağlantı kurabilirler.
Her container’ımızın kendisine ait IP adresi ve bir port numarası vardır.(container’ın portunu dışarıya publish etmediğimiz(port mapping konusu) sürece sadece docker host içerisinde container’lar arasında kendi aralarında iletişim kurabilirler. Eğer host portu vermezsek, çalışan bu container’a dışarıdan ulaşamayız. (Örnek kullanım: docker run — name nodeContainer -p 80:80 nodeApp)
Docker Network Nedir?
İlk olarak Docker container’ların network kullanımı ile aslında linux sunucuların ağ kullanımı ile neredeyse aynıdır diyebiliriz.
Docker container’ların birbirleriyle ve dışarıdaki uygulamalardan bu container’larla iletişim sağlanmasını sağlayan şey, Docker network yapısıdır.
Docker’ın temelde 3 adet network türlerinden bahsedebiliriz. Bunlardan aşağıda detaylı değiniyor olacağız.
- Bridge: Aksi belirtilmediği sürece varsayılan network türüdür. Container yarattığımızda herhangi bir network belirtmezsek, default olarak bu network yapısını yani bridge network’u kullanır.
- Host: Eğer container’lar host network’ü ile çalıştırılırsa, container’lar hosttaki ayarları kullanarak hayatına devam edecektir. İlgili container’a, Docker hostun kendi IP adresi üzerinden erişim sağlanır.
- None: Container’ların hiçbir şekilde ağ altyapısını kullanmamasını sağlarlar. Bu network türüyle yaratılan container’a, ne dışarıdan ne de docker host içerisinden erişim sağlayabilirsiniz.
Mevcuttaki Network Objelerini aşağıdaki komut ile listeleyebiliriz:
docker network ls
Eğer network objemizin özelliklerini, detaylarını listelemek istersek aşağıdaki komutu kullanabiliriz.
docker network inspect bridge
NOT: ”inspect” komutu sadece docker network objeleri ile kullanılmaz. Aynı zamanda container, volume, image detaylarını listelemek için de kullanılabilir.
Docker Network Yapısı
Docker container’ların birbirleri ile bir gateway üzerinden bağlantılı olduklarından bahsetmiştik. Bu senaryoya göre her container’a kendine ait bir IP adresi atanır ve bu IP adresleri üzerinden aynı network’deki container’lar birbirleriyle iletişim sağlayabilirler.
Örnek bir java uygulamamız olduğunu varsayarak, network türünü aşağıdaki şekilde belirtebiliriz:
docker run — name springContainer -d — network bridge javaApp
Normal şartlarda default network değeri bridge’dir fakat örnek olması adına bunu burada belirttik.[burada belirttiğimiz şudur: javaApp image’indan detach mode’da, bridge network objesinde ve springContainer adında bir container yarat]
Sonrasında ayağa kalkan container’ımızın içerisine aşağıdaki komut yardımıyla giriş yapalım ve ağ ayarlarını görüntüleyerek bir IP adresine sahip olduğunu doğrulayalım.
docker exec -it springContainer /bin/sh
ifconfig
None network’de çalışacak bir mongo’dan container yaratalım:
docker run — name mongoContainer — network=none mongo:latest None network belirtildiğinde, hiçbir şekilde yazdığımızda içeriden ve dışarıdan herhangi bir yerden erişemeyiz.)
Host network’de çalışacak mongo imajından bir container yaratalım:
docker run mongo — network=host ile çalıştırırsak, direkt olarak bu container’a dışarıdan erişebiliriz.
Kullanıcı Tanımlı Bridge Network Nasıl Yaratılır ve Neden Kullanılır?
Kendi network objemizi aşağıdaki komut yardımıyla yaratabiliriz.
docker network create testNetwork — driver bridge
docker network inspect testNetwork (yarattığımız network’ün tüm ağ detaylarını, bu network’e hangi container’larımızın bağlı olduğu gibi bilgileri görüntüleyebiliriz)
Şimdi bu kullanıcı tanımlı bridge network’ümüze bağlı çalışacak 2 adet container yaratalım.
docker run — name springContainer -d — network testNetwork javaApp
docker run — name dbContainer -d — network testNetwork mongo
Yukarıdaki 2 komut yardımıyla backend uygulamamızı ve onun kullanacağı mongo db container’ın aynı network türünde çalışmasını sağlamış olduk. 2 container aynı network’de yer aldıkları için artık ayaktaki bir container’dan diğer container’a container’ın ismini kullanarak ping atabilir ve diğer container’a sadece ismi üzerinden rahatlıkla ulaşabiliriz.
Normal şartlarda kullanıcı tanımlı bir network yaratmasaydık; bu pingleme işlemini container name üzerinden değil, IP adresi üzerinden yapmamız gerekecektir. Ancak 2 container’ın IP adresi üzerinden bağlanması çok sağlıklı bir aksiyon olmayacaktır. Bunun en önemli nedeni ise; docker container’ların her defasında IP adresi değişiklik gösterebilmesi durumudur. Bu sebepten 2 veya daha fazla container’ı konuşturabilmemiz için, sabit olan docker container name’ine ihtiyacımız olacaktır. İşte tam da bu sebepten; kullanıcı tanımlı network yapısına ihtiyaç duyarız.
NOT: Aslında kullanıcı tanımlı network’ün bize, bir nevi DNS hizmeti verdiğinden bahsedebiliriz.
Docker Network ile İlgili Sık Kullanacağımız Komut Listeleri:
docker network create testNetwork: Kullanıcı tanımlı yeni bir network yaratmak için kullanılır.
docker network inspect testNetwork: Yarattığımız network’ün ağ detaylarını listelememizi sağlar.
docker network ls: Sistemdeki tüm network’leri listelememizi sağlar.
docker network rm testNetwork: testNetwork kullanıcı tanımlı network’ü silme işlemi sağlar.
ÖNEMLİ NOT: İki veya daha fazla container’ımızı birbirine hem link mapping’e bağlayabiliriz hem de network ile yani custom bir network yaratarak bağlayabiliriz. Çoğunlukla kullanılan ve tavsiye edilen yöntem ise custom network yaratıp, containerler’ı aynı network üzerinden bağlama işlemidir.