DevOps
[Docker] 네트워크, 컨테이너간 통신
Xmobile
2020. 12. 12. 16:33
1. 네트워크 드라이버 종류
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
f5d0db8f813a bridge bridge local
13d25bc6a925 host host local
b1f2996399bf none null local
위와 같이 docker 는 3개의 네트워크를 이용하게 됩니다.
bridge : 기본 네트워크 드라이버입니다. 드라이버를 지정하지 않은 경우 default bridge를 사용하게됩니다.
host : 호스트 네트워킹을 직접 사용합니다.
none : 모든 네트워킹을 비활성화합니다.
2. bridge network를 사용하여 테스트해보기
하기 두개의 컨테이너를 실행시켜 봅니다
$ docker run -dit --name alpine1 alpine ash
$ docker run -dit --name alpine2 alpine ash
실행중인 컨테이너를 확인해 봅니다.
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
22654255a870 alpine "ash" 6 seconds ago Up 5 seconds alpine2
55159257b891 alpine "ash" 15 seconds ago Up 14 seconds alpine1
하기 명령으로 기본 네트워크를 지정하지 않았으므로 bridge 네트워크에 연결이 된 것을 확인할 수 있습니다.
$ docker network inspect bridge
...
"Name": "bridge",
...
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
...
"Containers": {
"22654255a8706b9d3ed0efe8b4c2bdf0d99d036910f1205aec5df262a080feb8": {
"Name": "alpine2",
"EndpointID": "122a834f82c6675487efe1277e4e074395812cacf57f9ae2fb233d5ed458e4ab",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"55159257b891c72e810e02ead5b7fedf755f9d5f22d24297de39edc69f54f5d9": {
"Name": "alpine1",
"EndpointID": "01d895b00c6f52fa184d130a4413335f083b788a5c10787c779be38edda46348",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
서로 연동이 잘되기 위하여 alpine1을 연결해 봅니다.
$ docker attach alpine1
//alpine1 -> alpine2로 연결확인 (ok)
# ping -c 2 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.249 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.084 ms
//컨테이너 이름으로 연결확인 (ng)
ping -c 2 alpine2
ping: bad address 'alpine2'
3. 서로 컨네이너명으로 연결해 보기 (사용자 정의 브릿지 네트워크 사용)
docker network create --driver bridge alpine-net
하기 명령으로 잘 생성된 것을 확인할 수 있습니다.
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
eb7be8cc8508 alpine-net bridge local
f5d0db8f813a bridge bridge local
13d25bc6a925 host host local
b1f2996399bf none null local
테스트 콘테이너 실행
//두개는 네트워크에 연결하가고 alpinne3은 네트워크 지정없이 기본 네트워크에 연결
$docker run -dit --name alpine1 --network alpine-net alpine ash
$docker run -dit --name alpine2 --network alpine-net alpine ash
$docker run -dit --name alpine3 alpine ash
$docker run -dit --name alpine4 alpine ash
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6058ce3e109e alpine "ash" 49 seconds ago Up 48 seconds alpine4
3df2d9c59b55 alpine "ash" 27 minutes ago Up 27 minutes alpine3
33a086be0054 alpine "ash" 27 minutes ago Up 27 minutes alpine2
3d88d4a925df alpine "ash" 27 minutes ago Up 27 minutes alpine1
네트워크 inspect 확인
$docker network inspect bridge
...
"Name": "bridge",
...
"Containers": {
"3df2d9c59b559d64df58f79d336a5495d1ef01a500a07b8d0b083fd8c15682f9": {
"Name": "alpine3",
"EndpointID": "0927f81fa6a69146e3cd75b05932b4d628223f266383d920c513c96943d505a5",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"6058ce3e109e88e87161f2b780fc18c7f2df4c884ac27e2aafdd958e90794447": {
"Name": "alpine4",
"EndpointID": "47248479369fcaba4c2f3f1535e1a7f47b0c5a0847bdc450618ad300b980491e",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
},
...
$docker network inspect alpine-net
...
"Name": "alpine-net",
...
"Containers": {
"33a086be0054693a5b4500f01264104637a0d3e3c2d89747996d89376754d3fd": {
"Name": "alpine2",
"EndpointID": "104deba1e3b9d9391846d8d3ea1dea4b80b7a4fc025aaded62c0d48c97ff5ff5",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
},
"3d88d4a925df434b45f474fd2ff2f81199f738640d013053d0a2a9bdc49d8fa7": {
"Name": "alpine1",
"EndpointID": "42d16b7058b6bd136f3d02d4c0c42d61cfe5534d252704dfcd882cf054d01614",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
}
},
...
연결 테스트
$ docker container attach alpine1
//alpine2으로 컨테이너 명으로 ping
/ # ping -c 2 alpine2 (ok)
PING alpine2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.099 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.088 ms
//alpine3으로 ping
ping -c 2 alpine3 (ng)
ping: bad address 'alpine3'
ping -c 2 172.17.0.2 (ng)
packets transmitted, 0 packets received, 100% packet loss
4. 정리
위 테스트를 그림으로 정리를 다시 하면
위 테스트를 통해서
-
같은 네트워크에 있는 컨테이너간만 통신 가능
-
사용자가 만든 외부 네트워크를 이용하면 컨테이너 이름으로 연결가능
이러한 이해는 여러 서비스를 연결할때 내부 ip를 매번 확인하면서 할 수 없기 때문에
외부 네트워크를 생성해서 컨테이너 이름으로 연결하는 것을 확인하는 테스트였습니다.
자세한 내용은 하기 document에서 확인할 수 있습니다.
https://docs.docker.com/network/