पृष्ठभूमि की जानकारी
मेरे पास दो नेटवर्क इंटरफेस के साथ एक सर्वर है जो डॉकर चला रहा है। डॉकर, कुछ वर्चुअलाइजेशन टूल की तरह, एक लिनक्स ब्रिज इंटरफेस बनाता है जिसे कहा जाता है docker0
। यह इंटरफ़ेस डिफ़ॉल्ट रूप से IP के साथ कॉन्फ़िगर किया गया है 172.17.42.1
और सभी डॉकटर कंटेनर इस इंटरफ़ेस के साथ अपने गेटवे के रूप में संवाद करते हैं और एक ही /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
को एक डिफ़ॉल्ट गेटवे के लिए रूट करना चाहता हूं 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
जब मैं एक कंटेनर लाता हूं, तो मैं ऐसा करने के बाद इसे बिल्कुल भी बाहर नहीं निकाल सकता। मैं अनिश्चित हूँ अगर पुल इंटरफेस को उसी तरह से नियंत्रित किया जाता है जैसे कि इस तरह के रूटिंग के लिए भौतिक इंटरफेस हैं, और बस एक पवित्रता की जांच के साथ-साथ इस पर कोई भी सुझाव देना चाहिए कि मैं इस सरल कार्य को कैसे पूरा कर सकता हूं।