Linux(Centos or RHEL)/docker

도커 기본 브릿지와 사용자 정의 브릿지의 차이 (1)

최소양 2020. 4. 27. 16:52

이전 도커의 브릿지에 관한 글에서 사용자 정의 브릿지와 기본 브릿지의 차이들을 설명한 적이 있습니다. 차이점은 아래 같다고 나와 있었습니다.

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

 

Legacy container links

Warning: The --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks...

docs.docker.com

 

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 ~]#