배경 정보
Docker를 실행하는 두 개의 네트워크 인터페이스가있는 서버가 있습니다. Docker는 일부 가상화 도구와 같은 Linux 브리지 인터페이스를 만듭니다 docker0
. 이 인터페이스는 기본적으로 IP로 구성되며 172.17.42.1
모든 Docker 컨테이너는이 인터페이스와 게이트웨이로 통신하며 동일한 /16
범위의 IP 주소가 할당됩니다 . 내가 알기로 컨테이너로 들어오고 나가는 모든 네트워크 트래픽은 NAT를 통과하므로 아웃 바운드는에서 오는 것으로 보이며 172.17.42.1
인바운드는로 전송됩니다 172.17.42.1
.
내 설정은 다음과 같습니다.
+------------+ /
| | |
+-------------+ Gateway 1 +-------
| | 10.1.1.1 | /
+------+-------+ +------------+ |
| eth0 | /
| 10.1.1.2 | |
| | |
| DOCKER HOST | |
| | | Internet
| docker0 | |
| (bridge) | |
| 172.17.42.1 | |
| | |
| eth1 | |
| 192.168.1.2 | \
+------+-------+ +------------+ |
| | | \
+-------------+ Gateway 2 +-------
| 192.168.1.1| |
+------------+
문제
호스트 시스템과의 모든 트래픽 이의 기본 게이트웨이 로 나가는 동안 두 번째 eth1
192.168.1.2
인터페이스 의 모든 Docker 컨테이너 192.168.1.1
와의 모든 트래픽을 기본 게이트웨이 로 라우팅하고 싶습니다 . 나는 지금까지 쓸모없는 다양한 것들을 시도했지만 내가 가장 가까운 것으로 생각하는 것은 iproute2를 다음과 같이 사용하는 것입니다.eth0
10.1.1.2
10.1.1.1
# Create a new routing table just for docker
echo "1 docker" >> /etc/iproute2/rt_tables
# Add a rule stating any traffic from the docker0 bridge interface should use
# the newly added docker routing table
ip rule add from 172.17.42.1 table docker
# Add a route to the newly added docker routing table that dictates all traffic
# go out the 192.168.1.2 interface on eth1
ip route add default via 192.168.1.2 dev eth1 table docker
# Flush the route cache
ip route flush cache
# Restart the Docker daemon so it uses the correct network settings
# Note, I do this as I found Docker containers often won't be able
# to connect out if any changes to the network are made while it's
# running
/etc/init.d/docker restart
컨테이너를 가져 오면이 작업을 수행 한 후 컨테이너에서 전혀 핑을 할 수 없습니다. 브리지 인터페이스가 이러한 종류의 라우팅에 물리적 인터페이스와 동일한 방식으로 처리되는지 확실하지 않으며, 단순성 태스크를 수행하는 방법에 대한 팁뿐만 아니라 온 전성 검사를 원합니다.