Bagaimana cara saya mendapatkan alamat IP kontainer LXC?

19

Saya telah menulis beberapa skrip untuk mengelola wadah LXC, dan saya bisa mendapatkan alamat IP mereka melalui ifconfig, dengan asumsi saya terhubung ke konsol.

Saya sekarang ingin terhubung ke wadah ini melalui ssh. Bagaimana cara saya mendapatkan alamat IP sedemikian rupa sehingga saya bisa menulis skrip? Saya juga tidak ingin mengatur alamat secara manual (tapi saya akan melakukannya, kalau itu satu-satunya pilihan).

Sejauh ini, saya sudah mencoba menggunakan lxc-start, tetapi mesin tidak memiliki alamat IP sebelum saya jalankan /sbin/init.

Stefano Palazzo
sumber
Masalah yang sama di sini, terkait dengan laporan bug ini, bugs.launchpad.net/ubuntu/+source/lxc/+bug/1389954 yang berisi info yang mendukung hal ini tidak berfungsi di Ubuntu 16.04 Server Edtions, tetapi menjadi ok di Desktop tempat dnsmasq berada ditendang oleh NetworkManager (seperti yang disarankan dalam; askubuntu.com/a/545265/599087 oleh 'forest'). osdir.com/ml/ubuntu-bugs/2016-10/msg05441.html
OpenITeX

Jawaban:

10

Cara termudah untuk melakukan ini sekarang adalah:

lxc-info -n container-name -iH

Ini mengembalikan alamat IP tanpa teks lain.

The -ipilihan menentukan bahwa alamat IP harus dikembalikan dan -HMenonaktifkan opsi manusia keluaran dibaca yaitu label. Untuk info lebih lanjut lihat LXC-info halaman manual .

EDIT untuk versi LXC yang lebih baru:

lxc info container-name

Maka Anda mendapatkan info rinci. Lihatlah blok "Ips:", yang seharusnya terlihat seperti yang di bawah ini. Anda mungkin harus mengambil alamat IPv4 pertama ( 10.121.48.241) dalam kasus ini:

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
Andy
sumber
Bekerja dengan LXD dan kontainer yang tidak terjangkau, perintah ini tidak digunakan. Bagaimana Anda mendapatkan informasi itu dengan kontainer standar yang tidak dipromosikan yang dipromosikan oleh LXD pada 2017?
jgomo3
10

Melihat menjalankan hal-hal dalam wadah tampaknya tidak didukung di Ubuntu, saran terbaik saya berikutnya adalah untuk melihat penyewaan alamat IP yang dnsmasqdibagikan. Itu sangat sederhana:

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

Hanya ada dua bagian yang bisa digunakan, jadi kita bisa memformatnya jauh lebih bagus:

$ awk '{ print $4,$3 }' /var/lib/misc/dnsmasq.leases | column -t
containername  10.0.3.83
Oli
sumber
Itu bekerja dengan sempurna!
Stefano Palazzo
2
Untuk referensi: versi baru LXC (yaitu yang ada di Raring) menunjukkan alamat IP di output lxc-ls --fancy.
Stefano Palazzo
FYI, di Ubuntu nama file catatan sewa IP ini berisi nama lxc bridge misalnyadnsmasq.lxcbr0.leases
Flint
7

Secara teknis Anda harus bisa menggunakannya lxc-attach untuk menghubungkan dan menjalankan perintah (dan memproses output), seperti:

sudo lxc-attach --name containername -- ifconfig

Ini membutuhkan wadah untuk berjalan.

Catatan: Saya tidak bisa mengaktifkan ini. Saya menginstal LXC dan mencoba ini tetapi hanya melihat sedikit kesalahan namespace, file yang hilang dan omong kosong lainnya. Tapi satu-satunya pengalaman saya dengan LXC adalah 10 menit yang saya habiskan untuk pertanyaan ini. Mungkin berhasil. Mungkin tidak. Semoga berhasil!

Oli
sumber
Dan tentu saja, tingkatkan ke ifconfig eth0 | grep -Eo 'addr:[0-9.]+' | cut -d: -f2jika Anda hanya menginginkan alamat IP.
Oli
Sayangnya saya mendapatkan kesalahan yang sama. No such file or directory - failed to open '/proc/28741/ns/pid'dan failed to enter the namespace. Saya menemukan bug yang menggambarkan masalah dengan tepat, tetapi berasal dari 2010.
Stefano Palazzo
Saya harus menggunakan path lengkap ke ifconfig: lxc-attach -n container / sbin / ifconfig
Epeli
Seperti yang dikatakan help.ubuntu.com/12.04/serverguide/lxc.html , lxc-attach tidak didukung.
ciastek
5

Ini berfungsi di Ubuntu 14.04:

lxc-info -n $name -i

dan jika Anda hanya menginginkan alamat IP (berguna untuk skrip), (terima kasih @JulianHLam):

lxc-info -n $name -iH
vaab
sumber
Jika menelepon melalui skrip, Anda bahkan dapat melakukannya lxc-info -n $name -Hiuntuk mendapatkan IP tanpa spasi putih
Julian H. Lam
4

Atau permintaan dnsmasq (yang memberikan IP ke kontainer)

dig @10.0.3.1 $container-name +short
Carl Hörberg
sumber
2

Versi python untuk melakukannya:

#!/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
Ektor
sumber
1

Perintah di bawah ini menggantikan lxc-attachcontoh di posting sebelumnya

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

Itu berjalan ifconfigdi dalam wadah dan menunjukkan output.

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

Sepertinya ada sesuatu yang tidak dikonfigurasi dengan benar. Sebagai solusi, saya telah menggunakan templat konfigurasi yang disediakan oleh dokumentasi LXC untuk membuatnya berfungsi tanpa penyelidikan lebih lanjut.

cfalguiere
sumber
1

Jika Anda menjalankan LXD, Anda mungkin menemukan perintah ini berguna untuk mendapatkan alamat IP wadah yang sedang berjalan

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

sudo lxc-ls --fancy -F ipv4 $my_container_name | tail -1

ramigg
sumber
0

Biarkan dnsmasq melakukannya untuk Anda.

Konfigurasikan instance dnsmasq mesin host Anda ke kueri instance dnsmasq lxc untuk domain tingkat atas .lxc.

Di / etc / default / lxc-net, batalkan komentar pada baris ini:

LXC_DOMAIN="lxc"

Jika instance dnsmasq host Anda diluncurkan oleh NetworkManager (seperti halnya dengan kebanyakan instalasi desktop Ubuntu saat ini) buat file bernama /etc/NetworkManager/dnsmasq.d/lxc.conf dengan baris di dalam ini:

server=/lxc/10.0.3.1

Jika dnsmasq host Anda diluncurkan oleh sesuatu selain NetworkManager, tambahkan baris itu ke /etc/dnsmasq.d- sebagai gantinya / lxc sebagai gantinya:

server=/lxc/10.0.3.1

Kemudian mulai kembali hal-hal sehingga mereka mengambil perubahan:

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

Anda mungkin harus memulai ulang wadah lxc Anda atau membuatnya meminta penyewaan DHCP baru sebelum muncul di DNS. (Saya tidak ingat apakah itu perlu ketika saya melakukan ini.) Ini juga layak disebutkan bahwa saya melihat laporan bug tentang lxc-net tidak menerima perubahan dnsmasq ketika restart, jadi Anda mungkin ingin me-reboot sistem host Anda hanya untuk memastikan.

Kemudian cobalah:

$ host mycontainer.lxc
mycontainer.lxc has address 10.0.3.21

$ ssh [email protected]
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-39-generic x86_64)
ubuntu@mycontainer:~$
ʇsәɹoɈ
sumber
0

Jawaban sederhana adalah

sudo lxc-ls -f | grep "container_name"

Jika Anda tidak ingat nama containernya, ketik saja sudo lxc-ls -f.

pengguna646873
sumber