Làm cách nào để lấy địa chỉ IP của container LXC?


19

Tôi đã viết một vài tập lệnh để quản lý các thùng chứa LXC và tôi có thể nhận địa chỉ IP của chúng thông qua ifconfig, giả sử tôi đã kết nối với bảng điều khiển.

Bây giờ tôi muốn kết nối với các container này thông qua ssh. Làm cách nào để có được địa chỉ IP của họ theo cách mà tôi có thể viết một tập lệnh? Tôi cũng không muốn đặt địa chỉ theo cách thủ công (nhưng tôi sẽ làm điều đó, nếu đó là lựa chọn duy nhất).

Cho đến nay, tôi đã thử sử dụng lxc-start, nhưng máy không có địa chỉ IP trước khi tôi chạy /sbin/init.


Vấn đề tương tự ở đây, liên quan đến báo cáo lỗi này, bug.launchpad.net/ubfox/+source/lxc/+orms/1389954 có chứa thông tin chứng thực về điều này không hoạt động trong Phiên bản máy chủ Ubuntu 16.04, nhưng vẫn ổn trong Máy tính để bàn có dnsmasq được khởi động bởi NetworkManager (như được đề xuất trong; Askubfox.com/a/545265/599087 bởi 'rừng'). osdir.com/ml/ubfox-bugs/2016-10/msg05441.html
OpenITeX

Câu trả lời:


10

Cách dễ nhất để làm điều này bây giờ là:

lxc-info -n container-name -iH

Điều này trả về địa chỉ IP không có văn bản khác.

Các -iquy định cụ thể tùy chọn đó địa chỉ IP cần được trả lại và -Hvô hiệu hóa tùy chọn đầu ra có thể đọc được con người tức là nhãn. Để biết thêm thông tin xem trang người đàn ông lxc-thông tin .

EDIT cho phiên bản mới hơn của LXC:

lxc info container-name

Sau đó, bạn nhận được thông tin chi tiết. Nhìn vào khối "Ips:", trông giống như khối bên dưới. Bạn có thể lấy địa chỉ IPv4 đầu tiên ( 10.121.48.241) trong trường hợp này:

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

Làm việc với LXD và các container không có đặc quyền, lệnh này không được sử dụng. Làm thế nào bạn có được thông tin đó với các thùng chứa không được mặc định được quảng bá bởi LXD vào năm 2017?
jgomo3

10

Xem như chạy mọi thứ trong các thùng chứa dường như không được hỗ trợ trong Ubuntu, đề xuất tốt nhất tiếp theo của tôi là xem xét địa chỉ IP cho thuê dnsmasqđang xử lý. Điều đó thực sự đơn giản:

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

Chỉ có hai phần được sử dụng, vì vậy chúng tôi có thể định dạng đẹp hơn rất nhiều:

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

Điều đó làm việc hoàn hảo!
Stefano Palazzo

2
Để tham khảo: các phiên bản mới của LXC (tức là phiên bản trong Rared) hiển thị địa chỉ IP ở đầu ra của lxc-ls --fancy.
Stefano Palazzo

FYI, trên Ubuntu tên tệp của bản ghi IP này chứa tên cầu nối lxc, vddnsmasq.lxcbr0.leases
Flint

7

Về mặt kỹ thuật, bạn sẽ có thể sử dụng lxc-attachđể kết nối và kích hoạt lệnh (và xử lý đầu ra), như vậy:

sudo lxc-attach --name containername -- ifconfig

Điều này đòi hỏi container phải được chạy.

Lưu ý: Tôi không thể làm việc này. Tôi đã cài đặt LXC và đã thử nó nhưng chỉ thấy một lỗi không gian tên, các tệp bị thiếu và các thứ vô nghĩa khác. Nhưng trải nghiệm duy nhất của tôi với LXC là 10 phút tôi đã dành cho câu hỏi này. Có thể đấy. Nó có thể không. Chúc may mắn!


Và tất nhiên, nâng cấp nó lên ifconfig eth0 | grep -Eo 'addr:[0-9.]+' | cut -d: -f2nếu bạn chỉ muốn địa chỉ IP.
Oli

Thật không may, tôi đang nhận được cùng một loại lỗi. No such file or directory - failed to open '/proc/28741/ns/pid'failed to enter the namespace. Tôi đã tìm thấy một lỗi mô tả chính xác vấn đề, nhưng đó là từ năm 2010
Stefano Palazzo

Tôi đã phải sử dụng đường dẫn đầy đủ đến ifconfig: lxc-Đính kèm -n container / sbin / ifconfig
Epeli

Như help.ubfox.com/12.04/serverguide/lxc.html nói, lxc-Đính kèm không được hỗ trợ.
ciastek

5

Điều này hoạt động trên Ubuntu 14.04:

lxc-info -n $name -i

và nếu bạn chỉ muốn địa chỉ IP (hữu ích cho tập lệnh), (cảm ơn @JulianHLam):

lxc-info -n $name -iH

Nếu gọi qua tập lệnh, bạn thậm chí có thể thực hiện lxc-info -n $name -Hiđể chỉ nhận IP mà không cần khoảng trắng quá mức
Julian H. Lam

4

Hoặc truy vấn dnsmasq (cung cấp IP cho các thùng chứa)

dig @10.0.3.1 $container-name +short

2

Phiên bản Python để làm điều đó:

#!/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

Lệnh dưới đây thay thế lxc-attachví dụ trong bài trước

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

Nó chạy ifconfigbên trong container và hiển thị đầu ra.

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

Có vẻ như một cái gì đó không được cấu hình đúng. Như một giải pháp thay thế, tôi đã sử dụng mẫu cấu hình được xác định trước được cung cấp bởi tài liệu LXC để làm cho nó hoạt động mà không cần điều tra thêm.


1

Nếu bạn đang chạy LXD, bạn có thể thấy lệnh này hữu ích để lấy địa chỉ IP của một container đang chạy

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

0

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


0

Hãy để dnsmasq làm điều đó cho bạn.

Định cấu hình phiên bản dnsmasq của máy chủ của bạn để truy vấn phiên bản dnsmasq của lxc cho tên miền cấp cao nhất .lxc.

Trong / etc / default / lxc-net, bỏ ghi chú dòng này:

LXC_DOMAIN="lxc"

Nếu phiên bản dnsmasq của máy chủ của bạn được khởi chạy bởi NetworkManager (như trường hợp với hầu hết các cài đặt máy tính để bàn Ubuntu hiện tại), hãy tạo một tệp có tên /etc/NetworkManager/dnsmasq.d/lxc.conf với dòng này bên trong:

server=/lxc/10.0.3.1

Nếu dnsmasq của máy chủ của bạn được khởi chạy bởi một thứ khác ngoài NetworkManager, hãy thêm dòng đó vào /etc/dnsmasq.d-av Available / lxc thay thế:

server=/lxc/10.0.3.1

Sau đó khởi động lại mọi thứ để họ nhận các thay đổi:

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

Bạn có thể phải khởi động lại các thùng chứa lxc của mình hoặc yêu cầu chúng cho thuê DHCP mới trước khi chúng xuất hiện trong DNS. . để chắc chắn.

Sau đó thử nó:

$ 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

Câu trả lời đơn giản là

sudo lxc-ls -f | grep "container_name"

Nếu bạn không nhớ container_name, chỉ cần gõ sudo lxc-ls -f.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.