Docker가 서브넷을 브리지 네트워크로 사용하지 않도록 하거나 라우팅 예외를 추가하는 방법

Docker가 서브넷을 브리지 네트워크로 사용하지 않도록 하거나 라우팅 예외를 추가하는 방법

나는 여러 개의 도커화된 애플리케이션을 실행하고 있는 도커 호스트(CentOs7)를 가지고 있으며 앞으로는 더 많아질 것입니다. 문제는 172.18.100.101 주소를 사용하여 호스트에서 액세스해야 하는 외부 서비스가 있다는 것입니다.

Docker는 생성된 브리지 네트워크(172.18.x, 172.19.x 등)에 서브넷을 자동으로 할당합니다.

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.x.x.x        0.0.0.0         UG    0      0        0 eth0
172.17.1.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-0a7f3df38b5c
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-636432c82f83

표시되는 옵션:
1. Docker에게 172.18.0.0 서브넷을 브리지로 사용하지 말라고 지시합니다. 도커에서는 이것이 가능하지 않다고 생각합니다.
2. 각 도커 컨테이너에 대해 서브넷 지정을 시작할 수 있습니다. 하지만 충돌하지 않는지 확인해야 하고 docker-compose.yml 파일이 호스트 간에 공유되므로 이는 매우 문제가 됩니다. 따라서 이는 관리에 있어서 악몽입니다. .
3. 172.18.0.0 서브넷이 여전히 존재하는 동안 호스트에서 원하는 IP(172.18.100.101)를 다르게 라우팅해 보았습니다. 이것이 가능한지 잘 모르겠습니다. 경로를 추가해 보았으나 도움이 되지 않았습니다. 아마도 이전이 아닌 172.18.0.0 규칙 이후에 추가되었기 때문일 것입니다.

$ sudo route add -host 172.18.100.101 dev eth0
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.x.x.x        0.0.0.0         UG    0      0        0 eth0
172.17.1.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-0a7f3dfsudo ip route show to match 172.18.198.12038b5c
172.18.100.101  0.0.0.0         255.255.255.255 UH    0      0        0 eth0
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-636432c82f83

어떤 아이디어가 있나요? 문제는 선택한 IP(또는 서브넷)에 대해 "예외" 경로를 추가하고 기본 규칙보다 먼저 적용되는지 확인하는 방법인 것 같습니다.

편집(2018-06-21): Docker 컨테이너의 ta 서비스에 연결을 시도하는 데 문제가 없습니다. 내 문제는 IP 172.18.100.101을 사용하는 내 네트워크(내가 소유/제어하지 ​​않는 다른 서버)에 서비스가 있지만 이 호스트에서 Docker가 자동으로 172.18 .0.0 범위를 할당하기 때문에 해당 호스트에서 연결할 수 없다는 것입니다. 따라서 172.18.100.101에 대한 모든 연결 시도는 해당 외부 호스트가 아닌 Docker가 생성한 브리지로 전송됩니다.

답변1

Docker bridge네트워킹은 네트워킹 구성을 위한 많은 옵션 중 하나일 뿐입니다. 이것Docker 네트워크 문서컨테이너와 통신하는 데 사용할 수 있는 다양한 네트워크 플러그인이 나열되어 있습니다.

Docker 컨테이너의 서비스에만 연결해야 하는 경우 Docker 포트에 연결된 호스트에서 서비스 포트를 열 수 있으므로 네트워크를 망칠 수 있습니다. Docker는 이를 "게시 포트"라고 부르며 또는 플래그 docker run가 있는 명령에 사용됩니다 . Docker 컨테이너에 직접 연결할 필요는 없습니다.--publish-p

그러나 컨테이너에 직접 연결하려는 경우 Docker를 통해 구성할 수 있습니다.

편집: 원래 질문이 호스트 라우팅에 관한 것이라고 오해했습니다.

호스트 라우팅과 관련하여 Docker를 사용하면 사용하는 네트워크 범위를 변경할 수 있습니다. 이를 사용하여 docker네트워크를 생성하는 경우,docker0인터페이스를 구성할 수 있습니다.원하는 범위에 관계없이 현재 네트워크에서 사용되지 않는 범위를 선택해야 합니다.

네트워크를 생성 하는 경우 프로젝트 파일에서 네트워크 범위를 구성 docker-compose해야 합니다 .docker-compose.yml

답변2

접두사가 더 큰 경로(예: 172.18.100.101호스트 경로)는 접두사가 더 작은 경로(예: docker에 의해 추가된 /16 경로)보다 우선순위가 높습니다. 따라서 초기 접근 방식이 작동해야 합니다. 그러나 172.18.100.101에서 직접 액세스할 수 없는 경우에는 게이트웨이도 지정해야 합니다 eth0.

예를 들어:

ip route add 172.18.100.101/32 via 10.x.x.x dev eth0

관련 정보