Background Information
I have a server with two network interfaces that is running Docker. Docker, like some virtualization tools, creates a Linux bridge interface called docker0
. This interface is configured by default with an IP of 172.17.42.1
and all Docker containers communicate with this interface as their gateway and are assigned IP addresses in the same /16
range. As I understand it, all network traffic to/from containers goes through a NAT, so outbound it appears to come from 172.17.42.1
, and inbound it gets sent to 172.17.42.1
.
My Setup looks like so:
+------------+ /
| | |
+-------------+ 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| |
+------------+
The Problem
I want to route all traffic from/to any Docker containers out of the second eth1
192.168.1.2
interface to a default gateway of 192.168.1.1
, while having all traffic from/to the host machine go out the eth0
10.1.1.2
interface to a default gateway of 10.1.1.1
. I've tried a variety of things so far to no avail but the one thing that I think is the closest to correct is to use iproute2 like so:
# 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
When I bring up a container I cannot ping out from it at all after doing this. I'm uncertain if bridge interfaces are handled the same way physical interfaces are for this sort of routing, and just want a sanity check as well as any tips on how I might accomplish this seemingly simple task.