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/