背景情報
Dockerを実行している2つのネットワークインターフェイスを持つサーバーがあります。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| |
+------------+
問題
Dockerコンテナからのすべてのトラフィックを2番目のeth1
192.168.1.2
インターフェイスからデフォルトゲートウェイ192.168.1.1
のにルーティングし、ホストマシンからのすべてのトラフィックをeth0
10.1.1.2
インターフェイスからデフォルトゲートウェイのに送ります10.1.1.1
。これまでさまざまなことを試しましたが、最も正しいと思うのは、iproute2を次のように使用することです。
# 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
コンテナを立ち上げると、これを実行した後、コンテナからまったくpingを実行できません。ブリッジインターフェイスがこの種のルーティングの物理インターフェイスと同じ方法で処理されるかどうかはわかりませんが、この一見単純なタスクを達成するためのヒントだけでなく、健全性チェックだけが必要です。