LXCコンテナーを管理するためのスクリプトをいくつか作成しました。コンソールに接続している場合、ifconfigを介してIPアドレスを取得できます。
今、これらのコンテナにsshで接続したいと思います。スクリプトを作成できるようにIPアドレスを取得するにはどうすればよいですか?また、アドレスを手動で設定する必要はありません(ただし、それが唯一のオプションである場合は設定します)。
これまで、lxc-start
を使用してみましたが、/sbin/init
を実行する前にマシンにIPアドレスがありません。
これを行う最も簡単な方法は次のとおりです。
lxc-info -n container-name -iH
これは、他のテキストなしでIPアドレスを返します。
-i
オプションはIPアドレスが返されることを指定し、-H
オプションは人間が読める出力、つまりラベルを無効にします。詳細については、lxc-info manページ を参照してください。
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
コンテナでの実行がUbuntuでサポートされていないように見えるので、私の次の最良の提案は、dnsmasq
が配布しているIPアドレスのリースを調べることです。それは本当に簡単です:
$ cat /var/lib/misc/dnsmasq.leases
1363699477 00:16:3e:4a:ce:a4 10.0.3.83 containername *
使用できる部分は2つしかないため、それをより適切にフォーマットできます。
$ awk '{ print $4,$3 }' /var/lib/misc/dnsmasq.leases | column -t
containername 10.0.3.83
技術的に言えば、次のようにlxc-attach
を使用して接続し、コマンドを起動(および出力を処理)できる必要があります。
Sudo lxc-attach --name containername -- ifconfig
これには、コンテナが実行されている必要があります。
注:これを機能させることができませんでした。 LXCをインストールしてこれを試してみましたが、名前空間エラー、欠落ファイル、その他のナンセンスが多数見られました。しかし、LXCでの私の唯一の経験は、この質問に費やした10分です。うまくいくかもしれません。そうではないかもしれません。幸運を!
これはUbuntu 14.04で機能します。
lxc-info -n $name -i
iPアドレスのみが必要な場合(スクリプトに便利)、(@ JulianHLamに感謝):
lxc-info -n $name -iH
またはdnsmasqを照会します(コンテナにIPを提供します)
Dig @10.0.3.1 $container-name +short
それを行うためのPythonバージョン:
#!/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
LXDを実行している場合、このコマンドは実行中のコンテナーのIPアドレスを取得するのに役立つことがあります
lxc exec <container-name> -- ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
以下のコマンドは、前の投稿の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のドキュメントで提供されている定義済みの構成テンプレートを使用して、さらに調査することなく機能させました。
Sudo lxc-ls --fancy -F ipv4 $my_container_name | tail -1
簡単な答えは
Sudo lxc-ls -f | grep "container_name"
Container_nameを覚えていない場合は、Sudo lxc-ls -fと入力するだけです。
dnsmasqがあなたのためにやってくれます
ホストマシンのdnsmasqインスタンスを設定して、lxcのdnsmasqインスタンスに.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
DNSに表示される前に、lxcコンテナを再起動するか、新しいDHCPリースを要求する必要がある場合があります。 (これを行ったときに必要だったかどうか覚えていません。)また、lxc-netが再起動時にdnsmasqの変更を取得しないというバグレポートを見たこともあるので、ホストシステムを再起動したいかもしれません念の為。
それから試してください:
$ 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:~$