티스토리 뷰

728x90
반응형

Docker는 기본 네트워크 대역을 172.17.xxx.xxx 대역을 사용한다. 이로 인해 내부망 환경이 구성된 경우 대역폭의 충돌이 발생할 수 있다.

Network 대역의 충돌이라 표현했지만, 사실상 서로 다른 대역의 network라 볼 수 있다. 이로 인해 동일한 대역을 사용하는 두 영역간의 문제를 야기하는 것이 아닌 Docker를 기동한 서버에서 두 대역으로의 Out Bound Traffic에 문제를 발생 시킬 수 있다.

다음은 Docker로 기동된 Network 대역의 IP이다.


[root@ciserver ~]# ifconfig -a
br-36ef81a5d01f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:22ff:fe77:7a83  prefixlen 64  scopeid 0x20<link>
        ether 02:42:22:77:7a:83  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 28  bytes 2240 (2.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-6ec6a4a31b5f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.20.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:93ff:fe31:8f27  prefixlen 64  scopeid 0x20<link>
        ether 02:42:93:31:8f:27  txqueuelen 0  (Ethernet)
        RX packets 109  bytes 12298 (12.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 176  bytes 14739 (14.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-77515255a32d: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:26:06:fb:45  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 28  bytes 2240 (2.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-7c8f4353fa4d: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.21.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:f3ff:fe40:d69d  prefixlen 64  scopeid 0x20<link>
        ether 02:42:f3:40:d6:9d  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 28  bytes 2240 (2.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:84:25:05:22  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::3921:29:467e:a137  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:12:73:63  txqueuelen 1000  (Ethernet)
        RX packets 173418  bytes 193884055 (184.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 18854  bytes 1186907 (1.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.100  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::a0ac:2ac5:2a4:2f76  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:70:d9:1f  txqueuelen 1000  (Ethernet)
        RX packets 261  bytes 23059 (22.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 174  bytes 33829 (33.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 645  bytes 70808 (69.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 645  bytes 70808 (69.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...
...


기본으로 docker process는 172.17.xxx.xxx 대역을 사용한다. 위 network interface 중 docker0가 바로 docker container가 사용하는 network 대역이다.

그 위에 br-xxxxx로 시작하는 network interface는 바로 docker에 구성된 network bridge이다.

docker network는 다음과 같이 확인할 수 있다.


[root@ciserver ~]# docker network ls
NETWORK ID          NAME                        DRIVER              SCOPE
6143e568404d        bridge                      bridge              local
36ef81a5d01f        harbor_harbor               bridge              local
7c8f4353fa4d        harbor_harbor-chartmuseum   bridge              local
6ec6a4a31b5f        harbor_harbor-clair         bridge              local
45788dd6d6b2        host                        host                local
3231ab3f251a        none                        null                local
[root@ciserver ~]#


위에 보이는 host, bridge, none network의 경우 docker에서 제공하는 기본 network이다. 각각의 역할은 다른 포스팅에서 자세히 살펴보기로 하고, bridge network가 바로 172.17.0.1/16 대역을 제공하는 docker container들이 사용하는 bridge network이다.

network의 상세 정보는 다음과 같이 확인할 수 있다.


[root@ciserver ~]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "6143e568404dace136020072100d0279e0d87573a34bf1f8a02f6b20332e105f",
        "Created": "2020-08-29T04:57:14.712649744-04:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {},
        "Options": {
com.docker.network.bridge.default_bridge":
com.docker.network.bridge.enable_icc":
com.docker.network.bridge.enable_ip_masquerade":
com.docker.network.bridge.host_binding_ipv4":
com.docker.network.bridge.name":
com.docker.network.driver.mtu":
        },
        "Labels": {}
    }
]


위 네트워크에는 기본 네트워크 외에 앞서 살펴본 harbor가 구성되며 docker-compose가 생성하는 network bridge가 3개 추가되어 있다.


[root@ciserver ~]# docker network inspect harbor_harbor
[
    {
        "Name": "harbor_harbor",
        "Id": "36ef81a5d01fd8bb40d297e4317901f68b192905f8a0bdf30b1fa63635595064",
        "Created": "2020-08-02T05:59:48.686654635-04:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Containers": {
            "17e292ba928913540316acb514be24759f5bac2530269240f6f2dd37be6c450c": {
                "Name": "harbor-portal",
                "EndpointID": "41d2ac027542f426d3936a295e69fcd9aee50e1609bd58fe1cf01b2947f9cb10",
                "MacAddress": "02:42:ac:13:00:08",
                "IPv4Address": "172.19.0.8/16",
                "IPv6Address": ""
            },
            "4286f2cdeb659d491c213ca4821fca087ef558d079f2f23f65e63a13e5535f35": {
                "Name": "harbor-db",
                "EndpointID": "362b99517785b9c208ae074019edd4bb6710a88507dd4244989fa51ff5dec9db",
                "MacAddress": "02:42:ac:13:00:05",
                "IPv4Address": "172.19.0.5/16",
                "IPv6Address": ""
            },
            "523076a6d43ccf2c3b57ac9c95dd516f6c1f438eb6352d64e9d1833ea9e14e35": {
                "Name": "nginx",
                "EndpointID": "648de9f0b9c8765eec749d466ef2a00d06d05a3f38c8d5acdce887d661ed185a",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            },
            "83081c464566d97ef211189728ebf9554753a0b14c1d7f11454c3bdb0d625a5c": {
                "Name": "harbor-core",
                "EndpointID": "89727c0157b6d1007dbea41c77705ae008d5b45751f7e88fe653fab53342a298",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            },
            "973869f58a88696c7cd7bf826ff53b46c91d6d00fbc2861434854a6609316635": {
                "Name": "harbor-jobservice",
                "EndpointID": "663577241a3b1989bf5046fc9421060e9c6c995bd1e21787b835454d3a178ff5",
                "MacAddress": "02:42:ac:13:00:09",
                "IPv4Address": "172.19.0.9/16",
                "IPv6Address": ""
            },
            "a16216ca17a0827dda8a31260d678759e196f2f57e648f59ae3476220468e972": {
                "Name": "registryctl",
                "EndpointID": "8a94491a5d956beb704d6e5a6ff9257749e6f84118ace42214281818fec82851",
                "MacAddress": "02:42:ac:13:00:06",
                "IPv4Address": "172.19.0.6/16",
                "IPv6Address": ""
            },
            "c69912d933bf8b0fc44a710b405e425e0741235d88d22e433ac9531b06c7be0b": {
                "Name": "redis",
                "EndpointID": "a630539386b7ba653ed758eff9ba507bd2bbdfe16bfe475be60a6e578ee062ad",
                "MacAddress": "02:42:ac:13:00:07",
                "IPv4Address": "172.19.0.7/16",
                "IPv6Address": ""
            },
            "e7292f55c5bb5c12bddc9ffaf50b4e5853838b95e7ea2719b18d927dfa7f1f58": {
                "Name": "registry",
                "EndpointID": "dfce4fb7464c67cf7bcf2e89080fdfa7e7ae4fdd9da52a2a0444663fac83038d",
                "MacAddress": "02:42:ac:13:00:04",
                "IPv4Address": "172.19.0.4/16",
                "IPv6Address": ""
            },
            "f09b25c346adc52dde9ec9d1e07f2c4b71f94d12816c6d3abc03cc7800127c5d": {
                "Name": "harbor-log",
                "EndpointID": "82fe3c96efbd15f2379bf091db39d5a6b28defe17c73207588158015bd5e1367",
                "MacAddress": "02:42:ac:13:00:0a",
                "IPv4Address": "172.19.0.10/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
com.docker.compose.network":
com.docker.compose.project":
com.docker.compose.version":
        }
    }
]


위와 같이 각각 172.19.0.1/16, 172.20.0.1/16, 172.21.0.1/16 - C class 단위로 network bridge가 생성되어 있다.

이를 지금부터 10.10.0.0 대역으로 변경해 보도록하자.

docker network를 변경하는 방법은 크게 2가지 단계로 구성되어 있다.

1) bip 구성

bip는 docker container가 사용하는 bridge network의 대역을 변경할 수 있다.

docker의 구성파일은 /etc/docker/daemon.json 파일이다.


[root@ciserver ~]# cat /etc/docker/daemon.json
{
        "insecure-registries":["192.168.56.100"],
        "bip": "10.10.0.1/24"
}
[root@ciserver ~]#


위와 같이 수정 후 systemctl restart docker를 수행하면, 아래와 같이 docker network가 변경된 것을 확인할 수 있다.


[root@ciserver ~]# ifconfig -a
...
...
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.10.0.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 02:42:84:25:05:22  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

...
...


2) default-address-pools 구성

default-address-pools는 docker network가 사용하는 대역을 변경할 수 있다.이 설정을 적용하기 위해서는 먼저 docker network에 등록되어 있는 다른 network를 모두 제거한 후 반영해야 한다.현재 적용되어 있는 harbor 관련 network를 모두 먼저 제거한다.


[root@ciserver harbor]# docker network list
NETWORK ID          NAME                        DRIVER              SCOPE
7e05843a2773        bridge                      bridge              local
36ef81a5d01f        harbor_harbor               bridge              local
7c8f4353fa4d        harbor_harbor-chartmuseum   bridge              local
6ec6a4a31b5f        harbor_harbor-clair         bridge              local
45788dd6d6b2        host                        host                local
3231ab3f251a        none                        null                local
[root@ciserver harbor]# docker network rm 36ef81a5d01f 7c8f4353fa4d 6ec6a4a31b5f
36ef81a5d01f
7c8f4353fa4d
6ec6a4a31b5f
[root@ciserver harbor]# docker network list
NETWORK ID          NAME                DRIVER              SCOPE
7e05843a2773        bridge              bridge              local
45788dd6d6b2        host                host                local
3231ab3f251a        none                null                local
[root@ciserver harbor]#


삭제 후 마찬가지로 /etc/docker/daemon.json 파일에 다음을 반영한다.


{
        "insecure-registries":["192.168.56.100"],
        "bip": "10.10.0.1/24",
        "default-address-pools":
        [
          {"base":"10.10.0.1/16","size":24}
        ]
}


위와 같이 반영 후 docker를 재기동하면 다음과 같이 docker network 대역이 변경된 것을 확인할 수 있다.

이 상태로 docker-compose up -d로 harbor를 기동한 후 network를 다시 확인해 보자.


...
...
br-1b43061cef5a: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.10.2.1  netmask 255.255.255.0  broadcast 10.10.2.255
        inet6 fe80::42:e7ff:fe5c:57fe  prefixlen 64  scopeid 0x20<link>
        ether 02:42:e7:5c:57:fe  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13  bytes 1046 (1.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-b33e248d8bae: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.10.1.1  netmask 255.255.255.0  broadcast 10.10.1.255
        inet6 fe80::42:34ff:fe85:3aa1  prefixlen 64  scopeid 0x20<link>
        ether 02:42:34:85:3a:a1  txqueuelen 0  (Ethernet)
        RX packets 397  bytes 34805 (33.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 397  bytes 34805 (33.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-d28ce4b48890: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.10.3.1  netmask 255.255.255.0  broadcast 10.10.3.255
        inet6 fe80::42:48ff:fe3b:4fb1  prefixlen 64  scopeid 0x20<link>
        ether 02:42:48:3b:4f:b1  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13  bytes 1046 (1.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...
...


위와 같이 network 대역이 10.10.1.1, 10.10.2.1, 10.10.3.1 대역으로 각각 기동된 것을 확인할 수 있다.

이와 같이 docker container의 대역을 위해서는 bip, docker network bridge의 대역을 위해서는 default-address-pools로 각각 적용하여 대역을 변경할 수 있다.

728x90
반응형