도커의 브릿지 네트워크에서의 테스트 이모저모
사전지식
(1) CIDR란..?
https://docs.netgate.com/pfsense/en/latest/book/network/understanding-cidr-subnet-mask-notation.html
(1) how to assign static ip
https://stackoverflow.com/questions/27937185/assign-static-ip-to-docker-container
컨테이너를 실행시킬 때에 “--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/
(1) 에서 진행한 것과 같이 “/etc/docker/daemon.json”파일에
{
"bip": "10.10.0.1/24“
}
와 같이 ”bip” 옵션에 IP주소와 Subnet을 넣어주면됩니다.
https://success.docker.com/article/networking
위의 링크를 보면
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
"~/.docker/config.json" 파일에 프록시관련 설정을 넣어주면 됩니다.
하지만 17.06버전보다 낮은 버전에서는 컨테이너를 실행할 때에 환경변수에 프록시를 설정하여야 합니다.