LXD 0.7ではlxc execでシェルの対話操作もできるようになっていました
はじめに
LXDを試してみた · hnakamur’s blog at githubの記事を書いて以来、LXD触る時間を作れてなかったのですが、久々に試してみました。
今ではlxc/lxdにVagrantfileが同梱されているので、それを使うだけで簡単に試せます。
VirtualBox 4.3.26, Vagrant 1.7.2, OS X Yosemiteという環境で試しました。
操作手順
VagrantでVMを起動
まずOS X上で以下のコマンドを実行します。
git clone https://github.com/lxc/lxd
cd lxd
vagrant up
Vagrantfileを見てみると、Vagrantのシェルプロビジョナでgoとlxdをインストールするようになっています。
lxd/install-lxd.sh at lxd-0.7 · lxc/lxdを見てみると、lxdのREADMEと同様のセットアップ手順に加えてlxdをサービスとして登録して起動する処理まで含まれています。
VMにログインしてlxcコマンドを試してみる
以下のコマンドを実行してVMにログインします。
vagrant ssh
以降のコマンドはVM上で実行します。
lxc
と lxd
にはPATHが通った状態になっていることを確認しました。
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ which lxc
/home/vagrant/go/bin/lxc
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ which lxd
/home/vagrant/go/bin/lxd
バージョンを確認してみると、 lxc
, lxd
ともに0.7でした。
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxd --version
0.7
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc --version
0.7
lxdのREADMEのFirst stepsに添って、ubuntuとdebianのイメージを取得します。
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ ./scripts/lxd-images import lxc ubuntu trusty amd64 --alias ubuntu --alias ubuntu/trusty
Downloading the GPG key for https://images.linuxcontainers.org
Downloading the image list for https://images.linuxcontainers.org
Validating the GPG signature of /tmp/tmpsccxc1fa/index.json.asc
Downloading the image: https://images.linuxcontainers.org/images/ubuntu/trusty/amd64/default/20150420_03:49/lxd.tar.xz
Validating the GPG signature of /tmp/tmpsccxc1fa/ubuntu-trusty-amd64-default-20150420_03:49.tar.xz.asc
Image imported as: c9176e837c0012d6d0eed221312ee9fc761765319701f57e65e63542ad9beade
Setup alias: ubuntu
Setup alias: ubuntu/trusty
debianのほうは最初コピペミスでaliasに2回同じ値を指定してしまってエラーになりましたが、再度実行すると成功しました。
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ scripts/lxd-images import lxc debian wheezy amd64 --alias debian --alias debian/wheezy --alias debian/wheezy
Downloading the GPG key for https://images.linuxcontainers.org
Downloading the image list for https://images.linuxcontainers.org
Validating the GPG signature of /tmp/tmp_d1gz0q6/index.json.asc
Downloading the image: https://images.linuxcontainers.org/images/debian/wheezy/amd64/default/20150419_22:42/lxd.tar.xz
Validating the GPG signature of /tmp/tmp_d1gz0q6/debian-wheezy-amd64-default-20150419_22:42.tar.xz.asc
Image imported as: cd398814f6e4e1e50799ba8249b80aa3558e5b05edf71a996a174def87569ae5
Setup alias: debian
Setup alias: debian/wheezy
Traceback (most recent call last):
File "scripts/lxd-images", line 410, in <module>
args.func(parser, args)
File "scripts/lxd-images", line 367, in import_lxc
setup_alias(parser, args, fingerprint)
File "scripts/lxd-images", line 330, in setup_alias
lxd.aliases_create(alias, fingerprint)
File "scripts/lxd-images", line 83, in aliases_create
raise Exception("Failed to create alias: %s" % name)
Exception: Failed to create alias: debian/wheezy
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ scripts/lxd-images import lxc debian wheezy amd64 --alias debian --alias debian/wheezy --alias debian/wheezy/amd64
Downloading the GPG key for https://images.linuxcontainers.org
Downloading the image list for https://images.linuxcontainers.org
Validating the GPG signature of /tmp/tmpeqkwuvfw/index.json.asc
Downloading the image: https://images.linuxcontainers.org/images/debian/wheezy/amd64/default/20150419_22:42/lxd.tar.xz
Validating the GPG signature of /tmp/tmpeqkwuvfw/debian-wheezy-amd64-default-20150419_22:42.tar.xz.asc
This image is already in the store.
コンテナを起動します。
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc launch ubuntuCreating container...done
Starting container...done
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc launch debian debian01
Creating container...done
Starting container...done
コンテナの一覧を表示してみます。ubuntuのほうはコンテナ名を指定しなかったので、自動で付けられています。
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc list
+---------------------+---------+------------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | EPHEMERAL |
+---------------------+---------+------------+------+-----------+
| preterhuman-araceli | RUNNING | 10.0.3.188 | | NO |
| debian01 | RUNNING | | | NO |
+---------------------+---------+------------+------+-----------+
debianのほうはIPアドレスが空になっていて、あれ?と思ったのですが、実行するタイミングが早すぎたようで、数秒立ってから再度実行するとアドレスが表示されました。
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc list
+---------------------+---------+------------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | EPHEMERAL |
+---------------------+---------+------------+------+-----------+
| preterhuman-araceli | RUNNING | 10.0.3.188 | | NO |
| debian01 | RUNNING | 10.0.3.42 | | NO |
+---------------------+---------+------------+------+-----------+
以前未実装だった lxc shell
の代わりに lxc exec
でコマンド実行やシェルでの対話操作ができるようになっていました。
lxc exec コンテナ名 コマンド 引数
のように指定すると、コンテナ内でコマンドを実行できます。
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec debian01 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:3e:01:bd:a1 brd ff:ff:ff:ff:ff:ff
inet 10.0.3.42/24 brd 10.0.3.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fe01:bda1/64 scope link
valid_lft forever preferred_lft forever
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec preterhuman-araceli ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:3e:5e:6c:79 brd ff:ff:ff:ff:ff:ff
inet 10.0.3.188/24 brd 10.0.3.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fe5e:6c79/64 scope link
valid_lft forever preferred_lft forever
uname -a
のようなコマンドを lxc exec コンテナ名 コマンド 引数
のように指定するとlxcのオプションと解釈するようで、以下のエラーになりました。
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec preterhuman-araceli uname -a
error: flag provided but not defined: -a
コンテナ名のあとに --
を入れれば回避出来ました。
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec preterhuman-araceli -- uname -a
Linux preterhuman-araceli 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
ただ、原因は不明なのですが、何回か実行してみると、時々何も出力されないことがありました。
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec debian01 -- uname -a
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec debian01 -- uname -a
Linux debian01 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 GNU/Linux
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec debian01 -- uname -a
Linux debian01 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 GNU/Linux
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec debian01 -- uname -a
Linux debian01 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 GNU/Linux
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec debian01 -- uname -a
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec debian01 -- uname -a
Linux debian01 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 GNU/Linux
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec debian01 -- uname -a
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec debian01 -- uname -a
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec debian01 -- uname -a
Linux debian01 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 GNU/Linux
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec debian01 -- uname -a
Linux debian01 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 GNU/Linux
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec debian01 -- uname -a
Linux debian01 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 GNU/Linux
lxc exec コンテナ名 /bin/bash
のようにコマンドにシェルを指定すると、コンテナ内でシェルが起動され対話操作が出来ました。ubuntuコンテナの実際の画面では ls
の結果もカラー表示されていました。
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$ lxc exec preterhuman-araceli /bin/bash
root@preterhuman-araceli:~# ls
root@preterhuman-araceli:~# pwd
/root
root@preterhuman-araceli:~# cd /
root@preterhuman-araceli:/# ls -l
total 60
drwxr-xr-x 2 root root 4096 Apr 20 03:55 bin
drwxr-xr-x 2 root root 4096 Apr 10 2014 boot
drwxr-xr-x 5 root root 420 Apr 22 13:51 dev
drwxr-xr-x 63 root root 4096 Apr 22 13:51 etc
drwxr-xr-x 3 root root 4096 Apr 20 03:55 home
drwxr-xr-x 12 root root 4096 Apr 20 03:54 lib
drwxr-xr-x 2 root root 4096 Apr 20 03:54 lib64
drwxr-xr-x 2 root root 4096 Apr 20 03:53 media
drwxr-xr-x 2 root root 4096 Apr 10 2014 mnt
drwxr-xr-x 2 root root 4096 Apr 20 03:53 opt
dr-xr-xr-x 109 nobody nogroup 0 Apr 22 13:51 proc
drwx------ 2 root root 4096 Apr 20 03:53 root
drwxr-xr-x 9 root root 380 Apr 22 13:51 run
drwxr-xr-x 2 root root 4096 Apr 20 03:55 sbin
drwxr-xr-x 2 root root 4096 Apr 20 03:53 srv
dr-xr-xr-x 13 nobody nogroup 0 Apr 22 13:51 sys
drwxrwxrwt 2 root root 4096 Apr 20 03:55 tmp
drwxr-xr-x 10 root root 4096 Apr 20 03:53 usr
drwxr-xr-x 11 root root 4096 Apr 20 03:53 var
root@preterhuman-araceli:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@preterhuman-araceli:/# pwd
/
root@preterhuman-araceli:/# exit
vagrant@vagrant-ubuntu-trusty-64:~/go/src/github.com/lxc/lxd$
おわりに
以前試した時に比べて、かなり進歩してますね。
ten_forwardさんのライブマイグレーションの記事とかも、今後試してみようと思います。