ฉันจะรับที่อยู่ IP ของคอนเทนเนอร์ LXC ได้อย่างไร


19

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

ตอนนี้ฉันต้องการเชื่อมต่อกับคอนเทนเนอร์เหล่านี้ผ่าน ssh ฉันจะรับที่อยู่ IP ของตนในลักษณะที่ฉันสามารถเขียนสคริปต์ได้อย่างไร ฉันไม่ต้องการตั้งค่าที่อยู่ด้วยตนเอง (แต่ฉันจะทำถ้าเป็นตัวเลือกเท่านั้น)

จนถึงตอนนี้ผมได้พยายามใช้lxc-startแต่เครื่องไม่ได้มีที่อยู่ IP /sbin/initก่อนที่ผมจะเรียกใช้


ปัญหาเดียวกันที่นี่ที่เกี่ยวข้องกับรายงานข้อผิดพลาดนี้bugs.launchpad.net/ubuntu/+source/lxc/+bug/1389954ที่มีข้อมูลยืนยันในเรื่องนี้ไม่สามารถใช้งานได้ใน Ubuntu 16.04 Server Edtions แต่ก็ใช้ได้ในเดสก์ท็อปที่ dnsmasq อยู่ เตะโดย NetworkManager (ตามที่แนะนำใน; askubuntu.com/a/545265/599087โดย 'forest') osdir.com/ml/ubuntu-bugs/2016-10/msg05441.html
OpenITeX

คำตอบ:


10

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือ:

lxc-info -n container-name -iH

ส่งคืนที่อยู่ IP โดยไม่มีข้อความอื่น

-iตัวเลือกระบุว่าที่อยู่ IP ควรจะกลับไปและ-Hปิดการใช้งานตัวเลือกเอาท์พุทของมนุษย์ที่สามารถอ่านป้ายชื่อคือ สำหรับข้อมูลเพิ่มเติมโปรดดูที่ LXC-ข้อมูลหน้าคน

EDIT สำหรับ LXC เวอร์ชั่นใหม่:

lxc info container-name

จากนั้นคุณจะได้รับข้อมูลรายละเอียด ดูบล็อก "Ips:" ซึ่งควรมีลักษณะคล้ายกับด้านล่าง คุณอาจคว้าที่อยู่ IPv4 แรก ( 10.121.48.241) ในกรณีนี้:

Ips:
  eth0: inet    10.121.48.241   vethSBP4RR
  eth0: inet6   fda5:b9a9:f3b9:ba32:216:3eff:fe4a:4d7d  vethSBP4RR
  eth0: inet6   fe80::216:3eff:fe4a:4d7d    vethSBP4RR
  lo:   inet    127.0.0.1
  lo:   inet6   ::1

ทำงานกับ LXD และคอนเทนเนอร์ที่ไม่มีสิทธิใช้งานคำสั่งนี้ไม่ได้ใช้งาน คุณจะได้รับข้อมูลที่มีตู้คอนเทนเนอร์ unprivilleged ที่เป็นค่าเริ่มต้นซึ่งโปรโมตโดย LXD ได้อย่างไร
jgomo3

10

เห็นว่าเป็นสิ่งที่ทำงานอยู่ในภาชนะบรรจุดูเหมือนจะไม่ได้รับการสนับสนุนใน Ubuntu คำแนะนำที่ดีที่สุดของฉันต่อไปคือการดูสัญญาเช่าที่อยู่ IP ที่dnsmasqแจก มันง่ายมาก:

$ cat /var/lib/misc/dnsmasq.leases
1363699477 00:16:3e:4a:ce:a4 10.0.3.83 containername *

มีเพียงสองส่วนที่มีการใช้งานใด ๆ เพื่อให้เราสามารถจัดรูปแบบที่ดีกว่ามาก:

$ awk '{ print $4,$3 }' /var/lib/misc/dnsmasq.leases | column -t
containername  10.0.3.83

มันทำงานได้อย่างสมบูรณ์แบบ!
Stefano Palazzo

2
สำหรับการอ้างอิง: รุ่นใหม่ LXC (คือหนึ่งใน raring) การแสดงที่อยู่ IP lxc-ls --fancyในการส่งออกของ
Stefano Palazzo

FYI บน Ubuntu ชื่อไฟล์ของบันทึกการเช่า IP นี้ประกอบด้วยชื่อสะพาน lxc เช่นdnsmasq.lxcbr0.leases
Flint

7

เทคนิคการพูดคุณควรจะสามารถใช้lxc-attachเพื่อเชื่อมต่อและยิงในคำสั่ง (และประมวลผลเอาต์พุต) เช่น:

sudo lxc-attach --name containername -- ifconfig

สิ่งนี้ต้องการให้คอนเทนเนอร์ทำงาน

หมายเหตุ: ฉันไม่สามารถใช้งานได้ ฉันติดตั้ง LXC และลองสิ่งนี้ แต่เพิ่งเห็นข้อผิดพลาดของ namespace ไฟล์ที่หายไปและเรื่องไร้สาระอื่น ๆ แต่ประสบการณ์เดียวของฉันกับ LXC คือ 10 นาทีที่ฉันใช้ไปกับคำถามนี้ มันอาจทำงานได้ มันอาจจะไม่ โชคดี!


และแน่นอนอัปเกรดเป็นifconfig eth0 | grep -Eo 'addr:[0-9.]+' | cut -d: -f2หากคุณต้องการที่อยู่ IP
Oli

น่าเสียดายที่ฉันได้รับข้อผิดพลาดชนิดเดียวกัน และNo such file or directory - failed to open '/proc/28741/ns/pid' failed to enter the namespaceฉันพบข้อผิดพลาดที่อธิบายปัญหาได้อย่างแม่นยำ แต่มาจาก 2010
Stefano Palazzo

ฉันต้องใช้เส้นทางแบบเต็มไปยัง ifconfig: lxc-attach -n container / sbin / ifconfig
Epeli

ในฐานะที่เป็นhelp.ubuntu.com/12.04/serverguide/lxc.htmlกล่าวว่าไม่รองรับ lxc-attach
ciastek

5

สิ่งนี้ใช้ได้กับ Ubuntu 14.04:

lxc-info -n $name -i

และถ้าคุณต้องการเฉพาะที่อยู่ IP (มีประโยชน์สำหรับสคริปต์), (ขอบคุณ @JulianHLam):

lxc-info -n $name -iH

หากโทรผ่านสคริปต์คุณสามารถทำได้lxc-info -n $name -Hiเพื่อรับ IP โดยไม่ต้องใช้ช่องว่างที่เกินขอบเขต
Julian H. Lam


2

Python version เพื่อใช้งาน:

#!/usr/bin/python
from pylxd import Client

client = Client(endpoint='https://10.185.96.208:8443', verify=False,    cert=('.config/lxc/client.crt', '.config/lxc/client.key'))

myCtr = client.containers.get('YOUR_CTR_NAME')
addresses = myCtr.state().network['eth0']['addresses']
for a in addresses:
   if(a['scope'] == 'global'):
      print "Found IP [%s]" %(a['address'])
      break

1

คำสั่งด้านล่างแทนที่lxc-attachตัวอย่างในโพสต์ก่อนหน้า

sudo lxc-execute --name containername --rcfile /usr/share/doc/lxc/examples/lxc-macvlan.conf /sbin/ifconfig

มันทำงานifconfigภายในคอนเทนเนอร์และแสดงผลลัพธ์

The --rcfile argument might not be required. Without it the command failed with 

lxc-execute: No such file or directory - failed to exec /usr/lib/lxc/lxc-init 

lxc-execute: invalid sequence number 1. expected 2

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


1

หากคุณใช้ LXD คุณอาจพบว่าคำสั่งนี้มีประโยชน์ในการรับที่อยู่ IP ของคอนเทนเนอร์ที่ทำงานอยู่

lxc exec <container-name> -- ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1


0

ให้ dnsmasq ทำเพื่อคุณ

กำหนดค่าอินสแตนซ์ dnsmasq ของเครื่องโฮสต์เพื่อค้นหาอินสแตนซ์ dnsmasq ของ lxc สำหรับโดเมนระดับบนสุด. lxc

ใน / etc / default / lxc-net, ไม่ใส่เครื่องหมายข้อคิดเห็นบรรทัดนี้:

LXC_DOMAIN="lxc"

หากอินสแตนซ์ dnsmasq ของโฮสต์ของคุณถูกเปิดใช้งานโดย NetworkManager (เช่นกรณีที่มีการติดตั้ง Ubuntu บนเดสก์ท็อปส่วนใหญ่ในปัจจุบัน) ให้สร้างไฟล์ชื่อ /etc/NetworkManager/dnsmasq.d/lxc.conf ด้วยบรรทัดนี้ภายใน:

server=/lxc/10.0.3.1

หาก dnsmasq โฮสต์ของคุณเปิดตัวโดยอย่างอื่นนอกเหนือจาก NetworkManager ให้เพิ่มบรรทัดนั้นใน /etc/dnsmasq.d-available/lxc แทน:

server=/lxc/10.0.3.1

จากนั้นรีสตาร์ทสิ่งต่าง ๆ เพื่อรับการเปลี่ยนแปลง:

service lxc-net stop
service lxc-net start
service network-manager restart

คุณอาจต้องรีสตาร์ท lxc container หรือทำการร้องขอ DHCP ใหม่ให้เช่าก่อนที่มันจะปรากฏใน DNS (ฉันจำไม่ได้ว่ามันจำเป็นหรือไม่เมื่อฉันทำสิ่งนี้) นอกจากนี้ยังมีมูลค่าการกล่าวถึงว่าฉันเห็นรายงานข้อผิดพลาดเกี่ยวกับ lxc-net ไม่ได้รับการเปลี่ยนแปลง dnsmasq เมื่อรีสตาร์ทดังนั้นคุณอาจต้องการรีบูตระบบโฮสต์ของคุณ เพื่อให้แน่ใจว่า.

จากนั้นลอง:

$ host mycontainer.lxc
mycontainer.lxc has address 10.0.3.21

$ ssh ubuntu@mycontainer.lxc
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-39-generic x86_64)
ubuntu@mycontainer:~$

0

คำตอบง่ายๆคือ

sudo lxc-ls -f | grep "container_name"

ถ้าคุณจำ container_name ไม่ได้ให้พิมพ์ sudo lxc-ls -f

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