도커 기본 브릿지와 사용자 정의 브릿지의 차이 (1)
이전 도커의 브릿지에 관한 글에서 사용자 정의 브릿지와 기본 브릿지의 차이들을 설명한 적이 있습니다. 차이점은 아래 같다고 나와 있었습니다.
https://docs.docker.com/network/bridge/
(1) 사용자 정의 브릿지는 자동으로 컨테이너 간의 DNS 문제를 해결해 줍니다.
(2) 사용자 정의 브릿지는 더 나은 고립을 제공합니다.
(3) 컨테이너를 정지시키지 않고 네트워크에 접근/분리 할 수 있습니다.
(4) 각각의 사용자 정의 브릿지는 설정이 가능합니다.
(5) 기본 브릿지 네트워크는 연결된 컨테이너 간의 환경변수 공유가 가능합니다.
이 중에서 (1)에 대한 테스트를 해 보겠습니다.
step 1. 사용자 정의 브릿지에서의 네트워크 테스트
1] 테스트용 네트워크를 만듭니다.
[root@centos77 ~]# docker network create testBr0
1d2d44eb4844d8e9e28264919fa39f691d3f9e29acb78a0dae59bcd155d62a01
[root@centos77 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
4bbd0af2de80 bridge bridge local
61f432d735cf host host local
16a3b4fdc56e none null local
1d2d44eb4844 testBr0 bridge local
[root@centos77 ~]#
2] 컨테이너 두 개를 앞에서 만든 네트워크에 연결시켜서 만듭니다.
[root@centos77 ~]# docker run -it -d --name alpine1 --network testBr0 alpine
7e44d3bd8107fb8de29acc2de02e0e1fa33dda768293766ade318956ab7450b8
[root@centos77 ~]# docker run -it -d --name alpine2 --network testBr0 alpine
67915e861566d82990169d05daeeca3cfc6485490c5b9da8fa98e5493439fb0c
[root@centos77 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67915e861566 alpine "/bin/sh" 10 seconds ago Up 9 seconds alpine2
7e44d3bd8107 alpine "/bin/sh" 16 seconds ago Up 15 seconds alpine1
[root@centos77 ~]#
3] 테스트용 네트워크의 정보를 확인합니다.
[root@centos77 ~]# docker network inspect testBr0
[
{
"Name": "testBr0",
...
"Containers": {
"67915e861566d82990169d05daeeca3cfc6485490c5b9da8fa98e5493439fb0c": {
"Name": "alpine2",
"EndpointID": "13961f025a1e20c8c8b9d5b76d3d69e38d9c50727ba7836d6126046a89a1856e",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"7e44d3bd8107fb8de29acc2de02e0e1fa33dda768293766ade318956ab7450b8": {
"Name": "alpine1",
"EndpointID": "a2c87635756f6f0ef427f4b0f8e10bef43a186da0eac6c33e2cdf3f9c81929a3",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
...
[root@centos77 ~]#
위에서 만든 컨테이너 두 개를 확인할 수 있습니다.
4] 컨테이너끼리의 ping테스트를 해 봅니다.
[root@centos77 ~]# docker exec alpine1 ping alpine2
PING alpine2 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.066 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.080 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.075 ms
^C
[root@centos77 ~]# docker exec alpine2 ping alpine1
PING alpine1 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.096 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.095 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.097 ms
^C
[root@centos77 ~]#
5] 컨테이너의 “/etc/hosts”파일 및 환경변수를 확인해 봅니다.
[root@centos77 ~]# docker exec alpine1 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 7e44d3bd8107
[root@centos77 ~]# docker exec alpine2 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 67915e861566
[root@centos77 ~]# docker exec alpine1 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=7e44d3bd8107
HOME=/root
[root@centos77 ~]#
호스트가 정의되어있지 않은데도 컨테이너 이름으로 서로 통신이 가능했습니다.
step 2. 기본 네트워크 브릿지에서의 컨테이너간 통신 테스트
1] 먼저 위에서 생성했던 컨테이너들을 정지 및 삭제시켜 줍니다.
[root@centos77 ~]# docker stop alpine1 alpine2
alpine1
alpine2
[root@centos77 ~]# docker rm alpine1 alpine2
alpine1
alpine2
[root@centos77 ~]#
2] 아무런 네트워크 설정 없이 컨테이너를 생성합니다.
[root@centos77 ~]# docker run -it -d --name alpine1 alpine
604faacf14cb5428570d90e4ee62da11af2bd325dda2946dec5663cad786ad7f
[root@centos77 ~]# docker run -it -d --name alpine2 alpine
42931a698cb2856747ec9d39cdbeaf01cd40577e00e4e9c2279bda76e01d59a3
[root@centos77 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42931a698cb2 alpine "/bin/sh" 3 seconds ago Up 2 seconds alpine2
604faacf14cb alpine "/bin/sh" 8 seconds ago Up 6 seconds alpine1
[root@centos77 ~]#
3] 기본 브릿지 네트워크의 정보를 확인합니다.
[root@centos77 ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "4bbd0af2de80d698ddc8d124ec954b0566f73c468f48a7c8001e97e8ef4d8c60",
...
"Containers": {
"42931a698cb2856747ec9d39cdbeaf01cd40577e00e4e9c2279bda76e01d59a3": {
"Name": "alpine2",
"EndpointID": "ce77d56b09fa29eb0ea9556ebbc0637ea102325408ac6bc5a0239da4240395f4",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/24",
"IPv6Address": ""
},
"604faacf14cb5428570d90e4ee62da11af2bd325dda2946dec5663cad786ad7f": {
"Name": "alpine1",
"EndpointID": "17b1aeffa6c7c1930267ad197ad5fa4a5dc79f23c2d3b1472800b5ff48d46eef",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/24",
"IPv6Address": ""
}
},
...
[root@centos77 ~]#
위에서 생성한 컨테이너 두 개가 소속되어있는 것을 확인할 수 있습니다.
4] 컨테이너의 이름을 이용해서 ping테스트를 해 봅니다.
[root@centos77 ~]# docker exec alpine1 ping alpine2
ping: bad address 'alpine2'
[root@centos77 ~]# docker exec alpine2 ping alpine1
ping: bad address 'alpine1'
[root@centos77 ~]#
5] 컨테이너의 ip를 이용해서 ping테스트를 해 봅니다.
[root@centos77 ~]# docker exec alpine1 ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.182 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.106 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.079 ms
^C
[root@centos77 ~]# docker exec alpine2 ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.083 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.089 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.085 ms
^C
[root@centos77 ~]#
step 3. 기본 네트워크 브릿지에서 --link 옵션을 이용하여 컨테이너간 통신 테스트
1] 앞에서 만들었던 컨테이너들을 정지 및 삭제합니다.
[root@centos77 ~]# docker ps -qa | xargs docker stop
42931a698cb2
604faacf14cb
[root@centos77 ~]# docker ps -qa | xargs docker rm
42931a698cb2
604faacf14cb
[root@centos77 ~]#
2] --link 옵션을 추가해서 컨테이너를 생성합니다. --link 옵션에 대한 설명은 아래의 링크를 참조하시면 좋을 것 같습니다.
https://docs.docker.com/network/links/
그래도 간단히 설명드리면 아래와 같은 양식으로 설정이 가능합니다.
--link <name or id>:alias
[root@centos77 ~]# docker run -it -d --name alpine1 alpine
d15d96235ed4a540a8c7ea9078a2fc1894223bb7585a661e38f54608a26f824e
[root@centos77 ~]# docker run -it -d --link alpine1:alp1 --name alpine2 alpine
fcf9ccb8fde638765947e9b10c9b252d533576e2e729aed91d42c77b6b9adb83
[root@centos77 ~]#
3] 컨테이너의 이름을 이용하여 ping테스트를 해 봅니다.
[root@centos77 ~]# docker exec alpine1 ping alpine2
ping: bad address 'alpine2'
[root@centos77 ~]# docker exec alpine2 ping alpine1
PING alpine1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.149 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.077 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.081 ms
^C
[root@centos77 ~]#
4] 컨테이너의 호스트 설정파일인 “/etc/hosts“ 및 컨테이너의 환경변수를 확인해 봅니다.
[root@centos77 ~]# docker exec alpine1 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2 dc2082ae2519
[root@centos77 ~]# docker exec alpine2 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2 alp1 dc2082ae2519 alpine1
172.18.0.3 000607f3538a
[root@centos77 ~]# docker exec alpine2 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=c2dcbd39f9d4
ALP1_NAME=/alpine2/alp1
HOME=/root
[root@centos77 ~]#
alpine1 컨테이너에는 alpine2 컨테이너의 호스트 이름이 설정되어있지 않다는 것을 확인할 수 있습니다. 또한 alpine2 컨테이너에는 alpine1에대한 환경변수가 설정되어있음을 확인할 수 있습니다. 여기서 환경변수를 확인하는 이유는 아래의 링크때문입니다.
https://docs.docker.com/network/links/#environment-variables
5] alpine1 컨테이너에 alpine2 컨테이너의 ip 및 호스트명을 지정해 줍니다.
[root@centos77 ~]# docker exec -ti alpine1 sh
/ # ls
bin etc lib mnt proc run srv tmp var
dev home media opt root sbin sys usr
/ # vi /etc/hosts
/ # exit
[root@centos77 ~]# docker exec alpine1 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2 d814fdde1b80
172.18.0.3 alp2 7b67b4128912 alpine2
[root@centos77 ~]#
6] 다시 한번 컨테이너의 이름으로 ping 테스트를 해 봅니다.
[root@centos77 ~]# docker exec alpine1 ping alp2
PING alp2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.129 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.073 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.079 ms
^C
[root@centos77 ~]# docker exec alpine2 ping alp1
PING alp1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.082 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.085 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.085 ms
^C
[root@centos77 ~]#