Linux(Centos or RHEL)/docker

도커의 브릿지 네트워크에서의 테스트 이모저모

최소양 2020. 5. 14. 16:43

사전지식

(1) CIDR..?

https://docs.netgate.com/pfsense/en/latest/book/network/understanding-cidr-subnet-mask-notation.html

 

Networking Concepts — Understanding CIDR Subnet Mask Notation | pfSense Documentation

Important Netgate is offering COVID-19 aid for pfSense software users, learn more. Understanding CIDR Subnet Mask Notation pfSense® firewalls use CIDR (Classless Inter-Domain Routing) notation rather than the common subnet mask 255.x.x.x when configuring

docs.netgate.com

 


(1) how to assign static ip

https://stackoverflow.com/questions/27937185/assign-static-ip-to-docker-container

 

Assign static IP to Docker container

I'm now trying to assign a static IP 172.17.0.1 when a Docker container be started up. I use port 2122 as the ssh port of this container so that I let this container listen port 2122. sudo docke...

stackoverflow.com

컨테이너를 실행시킬 때에 “--ip“ 옵션을 넣어줍니다.

 

 

개인적인 의문 1. 도커가 제공하는 기본 브릿지 네트워크에 속하지 않게(유저 네트워크에도) ip를 지정하면 어떻게 될까?

step 1. 도커 데몬에 기본 브릿지의 ip range를 설정해 줍니다.

[root@centos77 ~]# cat /etc/docker/daemon.json

{

"bip": "172.200.0.1/30",

}

[root@centos77 ~]# systemctl restart docker

[root@centos77 ~]#

 

 

step 2. 컨테이너에 어떤 네트워크에도 속하지 않는 ip 주소를 지정하여 실행시킵니다.

[root@centos77 ~]# docker run --ip 172.100.0.100 -itd ubuntu

5ad9a9b470b628dd57be3da6eb2b94f2e860195d098d7fa6505be41347941c60

[root@centos77 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

5ad9a9b470b6 ubuntu "/bin/bash" 3 seconds ago Up 1 second interesting_buck

[root@centos77 ~]# docker inspect interesting_buck

...

"Networks": {

"bridge": {

"IPAMConfig": null,

"Links": null,

"Aliases": null,

"NetworkID": "7f204c26a7433e1cf4db8c9e38f7db8ec8a95c4cda94c6d95dabc72e47be05cf",

"EndpointID": "8a83a05678c2d1c48d8eec904a639591574df93fe929e53a110c7addc9b32306",

"Gateway": "172.200.0.1",

"IPAddress": "172.200.0.2",

"IPPrefixLen": 30,

"IPv6Gateway": "",

"GlobalIPv6Address": "",

"GlobalIPv6PrefixLen": 0,

"MacAddress": "02:42:ac:c8:00:02",

"DriverOpts": null

}

...

 

step 3. 해당 컨테이너에 ping 테스트를 해 봅니다.

[root@centos77 ~]# ping 172.200.0.2

PING 172.200.0.2 (172.200.0.2) 56(84) bytes of data.

64 bytes from 172.200.0.2: icmp_seq=1 ttl=64 time=0.048 ms

64 bytes from 172.200.0.2: icmp_seq=2 ttl=64 time=0.048 ms

64 bytes from 172.200.0.2: icmp_seq=3 ttl=64 time=0.049 ms

^C

--- 172.200.0.2 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2000ms

rtt min/avg/max/mdev = 0.048/0.048/0.049/0.005 ms

[root@centos77 ~]#

 

가끔 이상하게 컨테이너를 실행시킬 때에 지정했던 "172.100.0.100" 으로 핑이 갈 때가 있었는데, 호스트머신에서 외부와의 네트워크를 끊고나서 다시 "172.100.0.100" 으로 ping 테스트를 해 보았을 때에는 잘 되지 않았습니다. 이를보아, 저의 환경이 해당 IP를 알고 있나봅니다... 이는 호스트쪽에서의 라우팅 문제로 판단되며, 라우팅을 잘 해 주면 이상 없을 것으로 판단됩니다.

 

위의 결과에 대해서는 ”--network“ 옵션을 지정해 주지 않으면 자동으로 기본 브릿지로 컨테이너를 연결시키기 때문에 IP가 "172.200.0.2" 로 할당된 것은 당연한 결과입니다.

또한, ip range이외에 아무런 설정은 하지 않은 기본 브릿지에서는 ip를 따로 지정해 줄 수없습니다. 따라서 ”--ip“ 옵션은 무시됩니다.

또한, ”--ip“ 옵션에 다른 네트워크의 ip range에 맞는 ip 주소를 입력하여도 ”--network“ 옵션으로 해당 네트워크를 지정해 주지 않으면 자동으로 기본 브릿지로 컨테이너를 할당하고, ”--ip“ 옵션은 무시됩니다.

 

 

+추가 : 옛날버전인 17.03.1에서는 위와 같이 테스트를 해 보았을 때에, 컨테이너 자체가 생성되지가 않았습니다. 

 

[root@centos772 ~]# docker version

Client:

Version: 17.03.1-ce

API version: 1.27

Go version: go1.7.5

Git commit: c6d412e

Built: Mon Mar 27 17:05:44 2017

OS/Arch: linux/amd64

 

Server:

Version: 17.03.1-ce

API version: 1.27 (minimum version 1.12)

Go version: go1.7.5

Git commit: c6d412e

Built: Mon Mar 27 17:05:44 2017

OS/Arch: linux/amd64

Experimental: false

[root@centos772 ~]#

 

[root@centos772 ~]# docker run --ip 10.10.0.2 -dit busybox

d7f31a223330d9641f91655c7919fa010fec7e98129b7f48170c9cfad44c7467

docker: Error response from daemon: User specified IP address is supported on user defined networks only.

[root@centos772 ~]#

 

해당 결과는 19.03.6에서도 "docker run --network bridge --ip 10.10.0.2 -dit busybox"와 같이 "--network"옵션을 이용하여 기본 브릿지를 지정해 주었을 경우, 똑같이 재현할 수 있습니다.

 


개인적인 질문 2. 도커가 제공하는 기본 브릿지 네트워크에서 지정된 ip range를 넘어서게 컨테이너를 만들면 어떻게 될까?

step 1. daemon.json파일 수정

[root@centos77 ~]# cat /etc/docker/daemon.json

{

"bip": "172.200.0.1/30"

}

[root@centos77 ~]# systemctl restart docker

[root@centos77 ~]#

 

 

step 2. 컨테이너 실행

[root@centos77 ~]# docker run -itd --name t1 ubuntu

de242b2e117f5256e78617ad99a951bf331cebd6ca3d8a678fab5f679bad2c22

[root@centos77 ~]# docker run -itd --name t2 ubuntu

68160e5ecc338f9c207d16229da6ae695df7a82b8a8adbaefe3c2c9c822ad395

docker: Error response from daemon: no available IPv4 addresses on this network's address pools: bridge (7f204c26a7433e1cf4db8c9e38f7db8ec8a95c4cda94c6d95dabc72e47be05cf).

[root@centos77 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

68160e5ecc33 ubuntu "/bin/bash" 4 seconds ago Created t2

de242b2e117f ubuntu "/bin/bash" 10 seconds ago Up 9 seconds t1

[root@centos77 ~]#

 

해당 네트워크의 address pools에 더이상 이용 가능한 IP 주소가 없다는 에러가 발생합니다. 이는 17.03.1버전도 동일합니다.

 


(2) How to change the default IP address of docker bridge

https://www.thegeekdiary.com/how-to-change-the-default-ip-address-of-docker-bridge/

 

How to change the default IP address of docker bridge – The Geek Diary

 

www.thegeekdiary.com

 

(1) 에서 진행한 것과 같이 “/etc/docker/daemon.json”파일에

{

"bip": "10.10.0.1/24“

}

와 같이 ”bip” 옵션에 IP주소와 Subnet을 넣어주면됩니다.

 

https://success.docker.com/article/networking

 

Docker - Docker Swarm Reference Architecture: Exploring Scalable, Portable Docker Container Networks

Table of Contents What You Will Learn Docker containers wrap a piece of software in a complete filesystem that contains everything needed to run: code, runtime, system tools, system libraries – anything that can be installed on a server. This guarantees

success.docker.com

위의 링크를 보면

By default bridge is assigned one subnet from the ranges 172.[17-31].0.0/16 or 192.168.[0-256].0/20 which does not overlap with any existing host interface. The default bridge network can also be configured to use user-supplied address ranges. Also, an existing Linux bridge can be used for the bridge network rather than Docker creating one. Go to the Docker Engine docs for more information about customizing bridge.

 

라고 나옵니다. , 따로 설정하지 않으면, 172.[17-31].0.0/16 or 192.168.[0-256].0/20 로 자동으로 설정이 된다는 말입니다.

 

 


(3) Configure Docker to use a proxy server

https://docs.docker.com/network/proxy/#use-environment-variables

 

Configure Docker to use a proxy server

If your container needs to use an HTTP, HTTPS, or FTP proxy server, you can configure it in different ways: In Docker 17.07 and higher, you can configure the Docker...

docs.docker.com

"~/.docker/config.json" 파일에 프록시관련 설정을 넣어주면 됩니다.

 

하지만 17.06버전보다 낮은 버전에서는 컨테이너를 실행할 때에 환경변수에 프록시를 설정하여야 합니다.