Herkese merhaba!

Uzun yıllardır bol miktarda kişisel zaman ve enerji harcayarak bilgimizi hepinizle paylaşıyoruz. Ancak şu andan itibaren bu blogu çalışır durumda tutabilmek için yardımınıza ihtiyacımız var. Yapmanız gereken tek şey, sitedeki reklamlardan birine tıklamak olacaktır, aksi takdirde hosting vb. masraflar nedeniyle maalesef yayından kaldırılacaktır. Teşekkürler.

Bu örneğimizde özel bir ağ oluşturacağız. Bununla birlikte iki tane de container oluşturup, aynı ağ üzerinden birbirleriyle iletişim kurmalarını sağlayacağız. Daha fazla bilgi için Docker container networking adresini ziyaret edin.


Genel bilgi


Varsayılan olarak, Docker containerlar diğer containerlardan ve harici ağlardan izole edilmiş halde bulunurlar. Docker servisi ilk kez kurulduğu zaman docker0 isminde bir ağ arayüzü oluşturur ve bu containerların birbirleriyle iletişim kurmaları için kullanılır.


ubuntu@xenial64:~$ ifconfig

docker0 Link encap:Ethernet HWaddr 02:42:a4:77:85:19
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

Docker ilk kez kurulduğunda üç tane ağ oluşturur.


ubuntu@xenial64:~$ docker network ls

NETWORK ID NAME DRIVER SCOPE
7ea4abd4f97c bridge bridge local
a6de0ab66715 host host local
c714fd7cee1b none null local

Ağlardan bridge, arayüz olarak docker0'ı temsil eder. Docker servisi varsayılan olarak containerları otomatik olarak bu ağa ekler ama siz başka bir ağı isterseniz docker run --network={NETWORK-NAME} şeklinde bir tanımlama yapabilirsiniz.


Yeni bir ağ yaratmak


Yeni ağ mevcut olan bridge ağ üzerine kurulu olacaktır.


ubuntu@xenial64:~$ docker network create --driver bridge inanzzz_network

dd883f1c5f72c9f13a22823d97520db2d29a2595da91ab7b9e48787db23b378b

ubuntu@xenial64:~$ docker network ls

NETWORK ID NAME DRIVER SCOPE
7ea4abd4f97c bridge bridge local
a6de0ab66715 host host local
dd883f1c5f72 inanzzz_network bridge local
c714fd7cee1b none null local

ubuntu@xenial64:~$ docker network inspect inanzzz_network

[
{
"Name": "inanzzz_network",
"Id": "dd883f1c5f72c9f13a22823d97520db2d29a2595da91ab7b9e48787db23b378b",
"Created": "2018-01-23T13:25:13.469938051Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]

Yeni ağ üzerinden container oluşturmak


Ağlardan inanzzz_network üzerinden yeni containerlar yarattığınızda veya kullandığınızda, tüm containerlar birbirleriyle iletişim kurabilirler. Ağ'ın kendisi containerları dış ağlardan izola edecektir.



Eğer containerlarınızın dışarıdan gelen trafiğe açılmasını isterseniz, container üzerinden port açmanız gerekecektir.



Container yaratma


ubuntu@xenial64:~$ docker run -i -t -d --network=inanzzz_network --name=client_container ubuntu:16.04
ubuntu@xenial64:~$ docker run -i -t -d --network=inanzzz_network --name=server_container httpd:2.4

Container server_container içinde apache sunucusu çalıştığı için, port 80 otomatik olarak iletişime açılmış olacaktır. Henüz -p eki ile dış dünyadan gelecek olan trafiğe kapılarımızı açmadık ama eğer isterseniz docker run ...-p 5000:80 ... gibi bir değişiklik yapabilirsiniz. Bu da aşağıdaki 80/tcp çıktısını 0.0.0.0:5000->80/tcp ile değiştirecektir.


ubuntu@xenial64:~$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6cbf1da80c74 httpd:2.4 "httpd-foreground" 4 seconds ago Up 3 seconds 80/tcp server_container
8d0bdb552444 ubuntu:16.04 "/bin/bash" 2 minutes ago Up 2 minutes client_container

Containerları kontrol etmek


Aşağıda'da gördüğümüz gibi, IP adresler yeni ağ'ın takibidir.


ubuntu@xenial64:~$ docker inspect client_container
[
{
.....
"HostConfig": {
.....
"NetworkMode": "inanzzz_network",
.....
},
.....
"NetworkSettings": {
.....
"Ports": {},
.....
"Networks": {
"inanzzz_network": {
.....
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
.....
}
}
}
}
]

ubuntu@xenial64:~$ docker inspect server_container

[
{
.....
"HostConfig": {
.....
"NetworkMode": "inanzzz_network",
.....
},
.....
"NetworkSettings": {
.....
"Ports": {
"80/tcp": null
},
.....
"Networks": {
"inanzzz_network": {
.....
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.3",
.....
}
}
}
}
]

İletişim testi


Client container port 80 üzerinden server container ile iletişim kurabiliyor.


ubuntu@xenial64:~$ docker exec -it client_container curl -I 172.18.0.3

HTTP/1.1 200 OK
Date: Tue, 23 Jan 2018 13:56:11 GMT
Server: Apache/2.4.29 (Unix)
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html

Server container client container ile iletişim kuramıyor çünkü açık port yok.


ubuntu@xenial64:~$ docker exec -it server_container curl -I 172.18.0.2

curl: (7) Failed to connect to 172.18.0.2 port 80: Connection refused