23/01/2018 - DOCKER
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.
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 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": {}
}
]
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.
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
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",
.....
}
}
}
}
]
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