นักเทียบท่า + สะพาน + DHCP


13

ฉันมีคอนเทนเนอร์นักเทียบท่าจำนวนมากที่ฉันต้องการแอดเดรสบน LAN เดียวกันกับโฮสต์ของพวกเขา จนถึงตอนนี้ฉันได้รับสิ่งนี้โดยใช้การตั้งค่าบริดจ์และกำหนด IP ด้วยตนเองและจัดการ IP ด้วยตนเอง ตัวอย่างการเริ่มต้นจะเป็นเช่นนั้น:

docker run \
--net="none" \ \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.ipv4 = 192.168.1.3/24" \
--lxc-conf="lxc.network.ipv4.gateway = 192.168.1.254" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.name = eth0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]

ด้วยโฮสต์ที่มีการกำหนดบริดจ์ใน/etc/network/interfaces(Ubuntu) ดังนี้:

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.1.2
        netmask 255.255.255.0
        gateway 192.168.1.254
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

ตั้งแต่ที่ผมค้นพบทาสฉันได้รับการพยายามที่จะย้ายไปใช้การค้นหาโดยอัตโนมัติภายในภาชนะบรรจุเพื่อให้ DHCP สามารถติดตาม IP ที่มือและพวกเขาออกไปตู้คอนเทนเนอร์ ฉันเปลี่ยนคำสั่งเริ่มต้นเป็น:

docker run \
--net="none" \
--lxc-conf="lxc.network.type = veth" \
--lxc-conf="lxc.network.link = br0" \
--lxc-conf="lxc.network.flags = up" \
-d [Docker Image ID]
/bin/bash

และสะพานไปที่:

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

สิ่งนี้ส่งผลให้คอนเทนเนอร์เริ่มต้น แต่ไม่มี IP จากนั้นผมก็เอาคำแนะนำจากโพสต์ออนไลน์ที่มีการจัดการที่จะได้รับมันทำกับ Fedora dhclientโดยโทร น่าเสียดายที่นี่ใช้ไม่ได้กับฉันในตู้ที่ใช้ Ubuntu

ด้านล่างนี้เป็นข้อความแสดงข้อผิดพลาดที่ฉันได้รับภายใต้เงื่อนไขต่าง ๆ :

  • ทำงานdhclientเมื่อฉันเปิดใช้งาน--privilegedในการเริ่มต้นคอนเทนเนอร์:

    dhclient: error while loading shared libraries: libc.so.6: cannot open shared object file: Permission denied
    
  • ทำงานsudo dhclient eth0เมื่อไม่ได้อยู่ใน--privileged

    RTNETLINK answers: Operation not permitted
    mv: cannot move '/etc/resolv.conf.dhclient-new.31' to '/etc/resolv.conf': Device or resource busy
    
  • วิ่งsudo dhclientหรือdhclient(ไม่ได้ระบุส่วนต่อประสาน)

    ส่งคืนทันทีและยังไม่มีการเชื่อมต่อ IP หรือเครือข่าย

ฉันจะรับคอนเทนเนอร์นักเทียบท่าเพื่อดึง IP แบบไดนามิกจากซับเน็ตเดียวกันกับโฮสต์ของพวกเขาได้อย่างไรเช่นฉันสามารถปรับใช้คอนเทนเนอร์ข้ามหลายโฮสต์โดยไม่ต้องติดตาม IP

ข้อมูลเสริม

  • วิ่งDOCKER_OPTS="-e lxc"เข้า/etc/default/docker
  • โฮสต์คือ Ubuntu 14.04
  • คอนเทนเนอร์ของนักเทียบท่าสร้างขึ้นโดยใช้from ubuntu:14.04ใน Dockerfile

คำตอบ:


3

ดูเหมือนว่านี่เป็นปัญหาที่เปิดอยู่และนี่เป็นสิ่งที่เฉพาะเจาะจงกับตู้คอนเทนเนอร์ของ Ubuntu และ apparmor

มีวิธีแก้ไขปัญหาชั่วคราวที่โพสต์จาก bprodoehl:

  • เริ่มคอนเทนเนอร์ด้วยสิทธิพิเศษด้วย --privileged
  • เพิ่มบรรทัดต่อไปนี้ในไฟล์ dockerfile: RUN mv /sbin/dhclient /usr/sbin/dhclient
  • เรียกใช้dhclient eth0และคุณจะยังคงเห็นข้อความแสดงข้อผิดพลาด: mv: cannot move '/etc/resolv.conf.dhclient-new.29' to '/etc/resolv.conf': Device or resource busyแต่ตอนนี้คุณจะมี IP และคุณสามารถใช้เครือข่ายได้

มันใช้งานได้อย่างมีเสน่ห์สำหรับเคสของฉัน แต่ทำไม mv นั้นถึงต้องการ? คุณช่วยอธิบายได้มั้ย
Federico Bonelli

นั่นคือสิ่งที่เป็นวิธีแก้ปัญหาที่ผู้ชายโพสต์ (ซึ่งฉันเชื่อมโยง) และดูเหมือนว่าจะทำงาน บางทีคนอื่นสามารถอธิบายได้
โปรแกรม

1
@Federico Bonelli: Apparmor ใช้ข้อ จำกัด ด้านความปลอดภัยกับแอปพลิเคชันที่จัดการ จัดการแอปพลิเคชันเท่านั้นที่มีข้อกำหนดนโยบายสำหรับ นโยบายเหล่านี้จับคู่แอปพลิเคชันตามเส้นทางของพวกเขา เมื่อคุณย้ายdhclientจาก/sbinไป/usr/sbinยังข้อกำหนดของนโยบาย Apparmor จะไม่ตรงกันอีกต่อไปและ Apparmor จะไม่ใช้ข้อ จำกัด ด้านความปลอดภัยใด ๆ กับแอปพลิเคชัน "ไม่รู้จัก" นี้
paprika

ฉันต้องหันไปใช้ "sudo apparmor_parser -R /etc/apparmor.d/sbin.dhclient" เนื่องจากวิธีแก้ปัญหาไม่ได้นี่เป็นอูบุนตู 14.04 คอนเทนเนอร์ fyi อย่างไรก็ตามข้อความแสดงข้อผิดพลาดด้านบนถูกมองเห็นและที่อยู่ IP ถูกกำหนดแล้ว
Neil McGill

1

ฉันพบสคริปต์แล้ว

https://github.com/jkrauska/tech-notes/blob/master/docker-dhclient.md

นั่นเป็นสิ่งที่คุณต้องการอย่างแน่นอน

จำเป็นต้องใช้คำสั่ง mv เนื่องจากเมื่อคุณเรียกใช้คอนเทนเนอร์นักเทียบท่าในโหมดที่ได้รับสิทธิพิเศษนักเทียบท่าไม่ได้กำหนดโปรไฟล์ AppArmor สำหรับคอนเทนเนอร์ ดังนั้นจะใช้โปรไฟล์ AppArmor ที่เป็นค่าเริ่มต้นของเครื่องจักรและจะป้องกันไม่ให้คุณเรียกใช้ dhclient ที่พา ธ เริ่มต้น


1

หากคุณกำลังพยายามหาที่อยู่ dhcp บนคอนเทนเนอร์ ubuntu docker ให้ทำดังต่อไปนี้:

  1. ตั้งค่าตัวเลือก dns ในคำสั่งคุณ docker daemon ( --dns <my_dns_ip>)
  2. เปิด/etc/dhcp/dhclient.confและแก้ไขบรรทัดที่มีrequest subnet-mask, broadcast-address...และลบคำdomain-name, domain-name-servers
  3. หลังจากสมัครแล้วservice networking restartคุณจะได้รับที่อยู่ dhcp ใหม่โดยไม่มีข้อความแสดงข้อผิดพลาด

-2

ความเป็นไปได้อื่นคือใช้ "pipework" คุณต้องเรียกใช้นอกคอนเทนเนอร์ของคุณ https://github.com/jpetazzo/pipework


5
สวัสดีและยินดีต้อนรับสู่เว็บไซต์ เราชอบคำตอบที่จะครอบคลุมมากขึ้นเล็กน้อยที่นี่ คุณสามารถแก้ไขและอธิบายสิ่งpipeworkที่จะหาได้ที่ไหนมันจะติดตั้งได้อย่างไรอาจเป็นตัวอย่างของการใช้งานได้? คำตอบของคุณคือความคิดเห็นไม่ใช่คำตอบ
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.