एक ही होस्ट पर केवीएम वीएम और डॉकर कंटेनर के बीच नेटवर्किंग

एक डेबियन-स्ट्रेच होस्ट (भौतिक लैन से जुड़ा) पर मेरे पास एक डेटाबेस कंटेनर (होस्ट के लिए मैप किया गया पोर्ट) के साथ एक नया डॉकर इंस्टॉलेशन (वी 18.09) है और मैं कुछ डेबियन-स्ट्रेच वीएम के साथ केवीएम/लिबवर्ट चलाता हूं । मैं लैन से डॉकर कंटेनर और वीएम तक पहुंच सकता हूं (कॉन्फ़िगरेशन गर्त एसएसएच सुरंग या प्रत्यक्ष के आधार पर) लेकिन मैं वीएम से डॉकर कंटेनर तक पहुंचने के लिए संघर्ष कर रहा हूं ।

enter image description here

# brctl showbridge name         bridge id           STP enabled interfacesbr-f9f3ccd64037     8000.0242b3ebe3a0   no      docker0             8000.024241f39b89   no      veth35454acvirbr0              8000.525400566522   yes     virbr0-nic

दिनों तक पढ़ने के बाद, मुझे इस पोस्ट में एक बहुत ही सम्मोहक समाधान मिला एक पुल के साथ डॉकर और केवीएम (मूल) कि मुझे काम नहीं मिला। समाधान एक-पंक्ति कॉन्फ़िगरेशन डेमॉन के साथ डॉकर शुरू करने का सुझाव देता है । केवीएम "डिफ़ॉल्ट" पुल का उपयोग करने के लिए जेसन कोड । यह कितना अच्छा होगा! क्या कोई उम्मीद है?

मैंने केवीएम वीएम के बीच नेटवर्किंग के लिए दो अलग-अलग कॉन्फ़िगरेशन की कोशिश की । दोनों ही मामलों में वीएम और लैन+राउटर+क्लाउड के बीच संचार निर्दोष है, लेकिन मुझे नहीं पता कि बाड़ पर कैसे जाना है - हरियाली घास के लिए । .. :)

एनएटी के साथ कॉन्फ 1 - केवीएम डिफ़ॉल्ट पुल: मैं डेबियन होस्ट को एसएसएच कर सकता हूं और डॉकर कंटेनर पोर्ट तक पहुंच सकता हूं लेकिन क्या सीधा मार्ग वाला सेटअप है?

कॉन्फ 2-लैन के लिए ब्रिज मोड में मैकवीटीएपी एडाप्टर: मैं वीएम से होस्ट लैन आईपी को पिंग नहीं कर सकता, हालांकि दोनों एक ही राउटर से जुड़े हैं । वीएम से ही प्रतिक्रिया है Destination Host Unreachable. कोई सोचा क्यों?

क्या डॉकर डेमॉन को सीधे डेबियन होस्ट पर चलाने के बजाय एक अलग वीएम में चलाना बेहतर होगा? इस तरह, कंटेनर और वीएम दोनों, केवीएम डिफ़ॉल्ट पुल तक पहुंच सकते हैं । लेकिन मुझे लगा कि केवीएम होस्ट पर वीएम में डॉकर चलाना थोड़े अजीब है ।

किसी भी स्पष्ट मार्गदर्शन की सराहना की जाएगी!

Btw, पुल br-f9f3ccd64037 एक उपयोगकर्ता-परिभाषित पुल है जिसे मैंने भविष्य के अंतर-कंटेनर संचार के लिए डॉकर के साथ बनाया है । इसका उपयोग नहीं होता ।

अद्यतन करें:

मुझे अभी एहसास हुआ कि पहले कॉन्फ़िगरेशन के साथ मैं वीएम मेहमानों से अपने आईपी पते (172.17.0.2) द्वारा डॉकर कंटेनर से जुड़ सकता हूं ।

मेरा प्रारंभिक सेटअप दूसरा कॉन्फ़िगरेशन था क्योंकि मैं वीएमएस में आरडीपी करना चाहता था, जो कि आसान है क्योंकि मैकवीटीएपी ड्राइवर वीएमएस को सीधे लैन से जोड़ता है और कोई एसएसएच लिंक की आवश्यकता नहीं है । तभी मैं कंटेनर तक नहीं पहुंच सका ।

समाधान उतना ही सरल था जितना कि लिंक किए गए लेख में कहा गया है । मुझे यकीन नहीं है कि पहली बार जब मैंने डॉकर डेमॉन को फिर से शुरू किया तो मेरा कॉन्फ़िगरेशन क्यों नहीं बदला ।

के बाद मैं में सबूत मिला डॉकर डेमॉन प्रलेखन डेमॉन में पुल तर्क के लिए । जेसन, मैंने इसे एक और कोशिश दी और डॉकर डेमॉन ने स्टार्टअप पर केवीएम डिफ़ॉल्ट पुल उठाया ।

पहले मैंने कॉन्फ़िगरेशन फ़ाइल बनाई /etc/docker/daemon.json जैसा कि निम्नलिखित सामग्री के साथ प्रलेखन में सुझाया गया है (आईपीटीबल्स लाइन की भी आवश्यकता नहीं हो सकती है):

{"bridge": "virbr0","iptables": false}

सभी की जरूरत थी:

docker stop mysqlsystemctl stop dockersystemctl start dockerdocker start mysql

और मौजूदा डॉकर कंटेनर केवीएम पुल पर चल रहा था । कंटेनर के आईपी पते की जांच की जा सकती है:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql192.168.122.2

मुझे यकीन नहीं है कि मैं अब डॉकर0 ब्रिज को हटा सकता हूं, लेकिन कंटेनर को वीआरबीआर0 के तहत तीन वीएम के साथ सूचीबद्ध किया गया है ।

brctl showbridge name bridge id           STP enabled interfacesdocker0     8000.024241f39b89   no      virbr0      8000.068ff2a4a56e   yes         veth2abcff1                                            virbr0-nic                                            vnet0                                            vnet1                                            vnet2

मैं निम्नलिखित सेटअप का उपयोग करके इसे लागू करने के लिए उपयोग किया जाता हूं :

  • मैं एक बनाता हूं br0 अंदर भौतिक एनआईसी के साथ पुल

  • केवीएम मशीनें नीचे क्यूईएमयू एक्सएमएल कॉन्फ़िगरेशन स्निपेट का उपयोग करके पुल पर जुड़ी हुई हैं

    <interface type='bridge'>      <mac address='52:54:00:a9:28:0a'/>      <source bridge='br0'/>      <model type='virtio'/>      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>    </interface>
  • डॉकर स्टैक सभी समान चल रहे हैं: मैं प्रत्येक स्टैक के लिए एक सार्वजनिक रूटेबल आईपी आरक्षित करता हूं । मैं इस सार्वजनिक आईपी को पुल से जोड़ता हूं br0 नीचे ओपनएसवीसी सेवा कॉन्फ़िगरेशन स्निपेट का उपयोग करना ।

    • [ip#0] अनुभाग बताता है कि हम आईपी चाहते हैं 1.2.3.4 संसाधन आईडी के साथ कंटेनर में कॉन्फ़िगर किया गया container#0 जो एक डॉकर गूगल/पॉज़ है, और ब्रिज से जुड़ा है br0

    • स्टैक हेरिट नेटवर्क कॉन्फ़िगरेशन में अन्य सभी डॉकर्स container#0 कारण config करने के लिए netns = container#0 डॉकर घोषणा में

    • जब ओपनएसवीसी सेवा शुरू होती है, तो नेटवर्क सेटअप एजेंट द्वारा किया जाता है, नीचे दिए गए लॉग में रिपोर्ट किए गए सभी कमांड का उत्पादन करता है

opensvc सेवा विन्यास

[DEFAULT]docker_daemon_args = --log-opt max-size=1m --storage-driver=zfs --iptables=falsedocker_data_dir = /{env.base_dir}/dockerenv = PRDnodes = srv1.acme.com srv2.acme.comorchestrate = startid = 4958b24d-4d0f-4c30-71d2-bb820e043a5d[fs#1]dev = {env.pool}/{namespace}-{svcname}mnt = {env.base_dir}mnt_opt = rw,xattr,acltype = zfs[fs#2]dev = {env.pool}/{namespace}-{svcname}/dockermnt = {env.base_dir}/dockermnt_opt = rw,xattr,acltype = zfs[fs#3]dev = {env.pool}/{namespace}-{svcname}/datamnt = {env.base_dir}/datamnt_opt = rw,xattr,acltype = zfs[ip#0]netns = container#0ipdev = br0ipname = 1.2.3.4netmask = 255.255.255.224gateway = 1.2.3.1type = netns[container#0]hostname = {svcname}image = google/pauserm = truerun_command = /bin/shtype = docker[container#mysvc]image = mysvc/mysvc:4.1.3netns = container#0run_args = -v /etc/localtime:/etc/localtime:ro    -v {env.base_dir}/data/mysvc:/home/mysvc/server/datatype = docker[env]base_dir = /srv/{namespace}-{svcname}pool = data

स्टार्टअप लॉग

2019-01-04 11:27:14,617 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - checking 1.2.3.4 availability2019-01-04 11:27:18,565 - srv1.acme.com.appprd.mysvc.fs#1 - INFO - mount -t zfs -o rw,xattr,acl data/appprd-mysvc /srv/appprd-mysvc2019-01-04 11:27:18,877 - srv1.acme.com.appprd.mysvc.fs#2 - INFO - mount -t zfs -o rw,xattr,acl data/appprd-mysvc/docker /srv/appprd-mysvc/docker2019-01-04 11:27:19,106 - srv1.acme.com.appprd.mysvc.fs#3 - INFO - mount -t zfs -o rw,xattr,acl data/appprd-mysvc/data /srv/appprd-mysvc/data2019-01-04 11:27:19,643 - srv1.acme.com.appprd.mysvc - INFO - starting docker daemon2019-01-04 11:27:19,644 - srv1.acme.com.appprd.mysvc - INFO - dockerd -H unix:///var/lib/opensvc/namespaces/appprd/services/mysvc/docker.sock --data-root //srv/appprd-mysvc/docker -p /var/lib/opensvc/namespaces/appprd/services/mysvc/docker.pid --exec-root /var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec --log-opt max-size=1m --storage-driver=zfs --iptables=false --exec-opt native.cgroupdriver=cgroupfs2019-01-04 11:27:24,669 - srv1.acme.com.appprd.mysvc.container#0 - INFO - docker -H unix:///var/lib/opensvc/namespaces/appprd/services/mysvc/docker.sock run --name=appprd..mysvc.container.0 --detach --hostname mysvc --net=none --cgroup-parent /opensvc.slice/appprd.slice/mysvc.slice/container.slice/container.0.slice google/pause /bin/sh2019-01-04 11:27:30,965 - srv1.acme.com.appprd.mysvc.container#0 - INFO - output:2019-01-04 11:27:30,965 - srv1.acme.com.appprd.mysvc.container#0 - INFO - f790e192b5313d7c3450cb257d075620f40c2bad3d69d52c8794eccfe954f2502019-01-04 11:27:30,987 - srv1.acme.com.appprd.mysvc.container#0 - INFO - wait for up status2019-01-04 11:27:31,031 - srv1.acme.com.appprd.mysvc.container#0 - INFO - wait for container operational2019-01-04 11:27:31,186 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - bridge mode2019-01-04 11:27:31,268 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link add name veth0pl20321 mtu 1500 type veth peer name veth0pg20321 mtu 15002019-01-04 11:27:31,273 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link set veth0pl20321 master br02019-01-04 11:27:31,277 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link set veth0pl20321 up2019-01-04 11:27:31,281 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /sbin/ip link set veth0pg20321 netns 203212019-01-04 11:27:31,320 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 ip link set veth0pg20321 name eth02019-01-04 11:27:31,356 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 ip addr add 1.2.3.4/27 dev eth02019-01-04 11:27:31,362 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 ip link set eth0 up2019-01-04 11:27:31,372 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 ip route replace default via 1.2.3.12019-01-04 11:27:31,375 - srv1.acme.com.appprd.mysvc.ip#0 - INFO - /usr/bin/nsenter --net=/var/lib/opensvc/namespaces/appprd/services/mysvc/docker_exec/netns/fc2fa9b2eaa4 /usr/bin/python3 /usr/share/opensvc/lib/arp.py eth0 1.2.3.42019-01-04 11:27:32,534 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - docker -H unix:///var/lib/opensvc/namespaces/appprd/services/mysvc/docker.sock run --name=appprd..mysvc.container.mysvc -v /etc/localtime:/etc/localtime:ro -v /srv/appprd-mysvc/data/mysvc:/home/mysvc/server/data --detach --net=container:appprd..mysvc.container.0 --cgroup-parent /opensvc.slice/appprd.slice/mysvc.slice/container.slice/container.mysvc.slice mysvc/mysvc:4.1.32019-01-04 11:27:37,776 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - output:2019-01-04 11:27:37,777 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - 1616cade9257d0616346841c3e9f0d639a9306e1af6fd750fe70e17903a110112019-01-04 11:27:37,797 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - wait for up status2019-01-04 11:27:37,833 - srv1.acme.com.appprd.mysvc.container#mysvc - INFO - wait for container operational

जब मैंने प्रश्न पढ़ा, तो मैं देख रहा था कि क्या कनेक्ट करने का कोई तरीका है virbr0 एक डॉकर नेटवर्क के लिए । नीचे दी गई छवि मेरा संशोधन है जो मुझे लगता है कि पूछा जा रहा था:

enter image description here

यदि ऐसा है, तो उत्तर का उपयोग करना है macvlan नेटवर्क, जो आपको डॉकर नेटवर्क को सीधे होस्ट डिवाइस से जोड़ने की अनुमति देता है । तो निम्नलिखित की तरह कुछ आपको वह मिलेगा जो आप चाहते हैं:

docker network create --driver=macvlan --subnet=192.168.0.0/16 -o parent=virbr0 mynet