LXD
2016/5/8更新
対応バージョン: 2.0
LXD 2.0上でコンテナを作成して各種管理を行う手順を示す。導入OSはUbuntu 16.04とする。
尚、LXD 1.0での手順は以下を参照のこと。
関連資料・記事
LXDインストール
インストール
# apt install lxd
初期化
まず最初にLXDの初期化を行う。必要とする環境に応じた設定を行う。
# lxd init (バックエンドのストレージを通常のディレクトリ階層(dir)かZFSから選択) Name of the storage backend to use (dir or zfs): <- ここではdir (LXDをネットワーク経由で使用するか) Would you like LXD to be available over the network (yes/no)? <- ここではyes (LXDをバインドするIPアドレス) Address to bind LXD to (not including port): <- ここではローカル(0.0.0.0) (LXDの待受ポート) Port to bind LXD to (8443 recommended): <- ここでは8443 (新しいクライアントを認証するパスワード) Trust password for new clients: <- ***** Again: <- ***** (LXD用にブリッジネットワークを構成するか) Do you want to configure the LXD bridge (yes/no)? <- ここではyes LXD has been successfully configured.
ここに画像入れる)
サービス有効化・起動
# systemctl enable lxd # systemctl start lxd
コンテナイメージの取得・インポートからコンテナ作成・起動・削除まで
コンテナイメージ取得・インポート、コンテナ作成・起動
コンテナのイメージはhttp://images.linuxcontainers.org/にて配布されているが、lxc launchコマンドでイメージのダウンロードからインポート、コンテナの作成・起動までを自動化できる。
ここではUbuntu 16.04(64bit)のイメージを取得して「u1」というコンテナを作成・起動する。
# lxc launch ubuntu:16.04 u1 # lxc image list +-----+------------+------+---------------------------------------------+------+--------+-----------------------------+ |ALIAS|FINGERPRINT |PUBLIC| DESCRIPTION | ARCH | SIZE | UPLOAD DATE | +-----+------------+------+---------------------------------------------+------+--------+-----------------------------+ | |f4c4c60a6b75|no |ubuntu 16.04 LTS amd64 (release) (20160420.3)|x86_64|137.54MB|May 8, 2016 at 3:36am (UTC)| +-----+------------+------+---------------------------------------------+------+--------+-----------------------------+ # lxc list +------+---------+---------------------+------+------------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +------+---------+---------------------+------+------------+-----------+ | u1 | RUNNING | 10.94.71.215 (eth0) | | PERSISTENT | 0 | +------+---------+---------------------+------+------------+-----------+ # lxc info u1 コンテナ名: u1 アーキテクチャ: x86_64 作成日時: 2016/05/08 03:36 UTC 状態: Running タイプ: persistent プロファイル: default Pid: 28674 IPアドレス: eth0: inet 10.94.71.215 vethADVXKT eth0: inet6 fe80::216:3eff:fea8:de06 vethADVXKT lo: inet 127.0.0.1 lo: inet6 ::1 リソース: プロセス数: 19 メモリ消費量: メモリ (現在値): 45.59MB メモリ (ピーク): 164.11MB ネットワーク使用状況: eth0: 受信バイト数: 1.23kB 送信バイト数: 1.68kB 受信パケット: 8 送信パケット: 12 lo: 受信バイト数: 1.48kB 送信バイト数: 1.48kB 受信パケット: 20 送信パケット: 20
コンテナは以下の場所に格納される。
/var/lib/lxd/containers/<コンテナ名>/
コンテナのルートファイルシステムは以下に作成され、bin、devなどひと通りのディレクトリ構成が作成される。
/var/lib/lxd/containers/<コンテナ名>/rootfs
# ls /var/lib/lxd/containers/u1/rootfs/ bin/ dev/ home/ lib64/ mnt/ proc/ run/ snap/ sys/ usr/ boot/ etc/ lib/ media/ opt/ root/ sbin/ srv/ tmp/ var/
容量にして660MB程度となる。
# du -sh /var/lib/lxd/containers/u1/rootfs/ 660M /var/lib/lxd/containers/u1/rootfs/
またコンテナ全体の設定は以下のファイルで行う。
/var/lib/lxd/containers/<コンテナ名>/metadata.yaml
コンテナ内のプログラムを実行する場合はlxc execコマンドを使用する。
# lxc exec u1 -- uname -n u1
コンテナ上ではSSHサーバが動作しているのでSSH接続が可能であるが、パスワード認証が許可されていないのでここではいったんコンテナのシェルを起動して接続する。
# ssh ubuntu@10.94.71.215 Permission denied (publickey). # lxc exec u1 -- bash root@u1:~#
SSH接続におけるパスワード認証が必要であればコンテナ上のSSHサーバの設定を変更する。
root@u1:~# vi /etc/ssh/sshd_config : 52 PasswordAuthentication no <- yesに変更 : root@u1:~# systemctl restart sshd
コンテナにはデフォルトでubuntuアカウントが定義されているのでパスワードを設定しておく。
root@u1:~# passwd ubuntu Enter new UNIX password: ***** Retype new UNIX password: ***** passwd: password updated successfully root@u1:~# exit
これでコンテナにSSH接続ができるようになる。
# ssh ubuntu@10.94.71.215 ubuntu@10.94.71.215's password: ***** : ubuntu@u1:~$
コンテナ終了
コンテナを終了させるにはlxc-stopを使用する。
# lxc-stop -n c1
コンテナ削除
コンテナを削除するにはlxc-destroyを使用する。
# lxc-destroy -n c1
コンテナ情報出力
コンテナの情報はlxc-lsやlxc-infoで確認できる。
# lxc-ls c1 # lxc-ls -f NAME STATE AUTOSTART GROUPS IPV4 IPV6 c1 RUNNING 0 - 10.0.3.45 - # lxc-info -n c1 Name: c1 State: RUNNING PID: 6077 IP: 10.0.3.45 CPU use: 0.21 seconds BlkIO use: 4.00 KiB Memory use: 12.89 MiB KMem use: 0 bytes Link: vethBNRV8T TX bytes: 1.34 KiB RX bytes: 914 bytes Total bytes: 2.23 KiB
topコマンドのような統計情報を表示するにはlxc-topを使用する。
# lxc-top Container CPU CPU CPU BlkIO Mem Name Used Sys User Total Used c1 0.22 0.12 0.07 4.00 KB 12.63 MB TOTAL 1 of 1 0.22 0.12 0.07 4.00 KB 12.63 MB
コンテナの状態を監視するにはlxc-monitorを使用する。
# lxc-monitor
例えば起動しているコンテナを停止(lxc-stop -n c1)すると以下のような出力が得られる。
# lxc-monitor 'c1' changed state to [STOPPING] 'c1' changed state to [STOPPED]
コンテナ内のプログラム実行
外部からコンテナ内のプログラムを実行するにはlxc-consoleでコンソール接続してもよいが単純に一つのプログラムを実行するだけならlxc-executeを使用すればよい。
しかもコンテナを起動している必要もなく(起動しているとエラーになる)、実行速度も申し分ない。
# lxc-execute -n c1 -- uname -n c1
コンテナ管理
コンテナのクローン作成
既存のコンテナをコピーしてクローンを作る場合lxc-copyを使用する(かつてのlxc-cloneの置き換え)。コピー元のコンテナは停止している必要がある。
# lxc-stop -n c1 # lxc-copy -n c1 -N c2 # lxc-ls -f NAME STATE AUTOSTART GROUPS IPV4 IPV6 c1 STOPPED 0 - - - c2 STOPPED 0 - - -
コンテナ内のプロセス制御
コンテナ内のプロセスを全て凍結するにはlxc-freezeを、凍結を解除するにはlxc-unfreezeをそれぞれ使用する。
# lxc-start -n c1 # lxc-freeze -n c1 # lxc-ls -f NAME STATE AUTOSTART GROUPS IPV4 IPV6 c1 FROZEN 0 - 10.0.3.45 - c2 STOPPED 0 - - - # lxc-unfreeze -n c1 # lxc-ls -f NAME STATE AUTOSTART GROUPS IPV4 IPV6 c1 RUNNING 0 - 10.0.3.45 - c2 STOPPED 0 - - -
コンテナのスナップショット管理
コンテナのスナップショットを取得したりリストアするにはlxc-snapshotを使用する。スナップショットを取得するにはコンテナが停止している必要がある。
# lxc-stop -n c1 # lxc-ls -f NAME STATE AUTOSTART GROUPS IPV4 IPV6 c1 STOPPED 0 - - - c2 STOPPED 0 - - - # lxc-snapshot -n c1
取得したスナップショットはsnapXとして/var/lib/lxc/<コンテナ名>/snaps配下に格納される。-Lオプションで一覧が参照できる。
# lxc-snapshot -n c1 -L snap0 (/var/lib/lxc/c1/snaps) 2016:05:07 20:18:33 # lxc-snapshot -n c1 # lxc-snapshot -n c1 # lxc-snapshot -n c1 -L snap0 (/var/lib/lxc/c1/snaps) 2016:05:07 20:18:33 snap1 (/var/lib/lxc/c1/snaps) 2016:05:07 20:19:12 snap2 (/var/lib/lxc/c1/snaps) 2016:05:07 20:19:44
複数あるスナップショットのうち特定の時点にリストアしたい場合は-rオプションとともにスナップショット名を指定する。
# lxc-snapshot -n c1 -r snap1
スナップショットをリストアしても削除はされないので削除したい場合は-dオプションでスナップショット名を指定して明示的に削除する。
# lxc-snapshot -n c1 -d snap0 # lxc-snapshot -n c1 -d snap1 # lxc-snapshot -n c1 -d snap2 # lxc-snapshot -n c1 -L No snapshots
その他にも様々なコマンドがあるがここでは割愛する。詳しくは公式サイトを参照のこと。
LXCコマンドManページ (Linux Conainers)
参考サイト
LXCドキュメント (Linux Conainers)
LXC技術情報 (Qiita)
2015/7/5更新
対応バージョン: 0.7 via Ubuntu15.04
LXD 1.0上でコンテナを作成してコンソール接続するまでの一連の手順を示す。
尚、LXC 2.0での手順は以下を参照のこと。
関連資料・記事
インストール、サービス有効化 & 起動
インストール
% sudo apt install lxd
サービス有効化
% sudo systemctl enable lxd.service Synchronizing state for lxd.service with sysvinit using update-rc.d... Executing /usr/sbin/update-rc.d lxd defaults Executing /usr/sbin/update-rc.d lxd enable
サービス起動
% sudo systemctl start lxd.service % sudo systemctl status lxd.service ● lxd.service - Container hypervisor based on LXC Loaded: loaded (/lib/systemd/system/lxd.service; enabled; vendor preset: enabled) Active: active (running) since 日 2015-07-05 20:15:47 JST; 8s ago Main PID: 19582 (lxd) Memory: 276.0K CGroup: /system.slice/lxd.service ‣ 19582 /usr/bin/lxd --group lxd --tcp [::]:8443 7月 05 20:15:47 k1 systemd[1]: Started Container hypervisor based on LXC. 7月 05 20:15:47 k1 systemd[1]: Starting Container hypervisor based on LXC...
コンテナイメージインポート、コンテナ作成
コンテナのイメージはhttp://images.linuxcontainers.org/にて配布されており、lxd-imagesというPythonのフロントエンドを使うとダウンロードからインポートまでを自動化できる。
ここではCentOS 6(64bit)のコンテナイメージをインポートして「centos6」という名前を付ける。
% sudo lxd-images import lxc centos 6 amd64 --alias centos6 Downloading the GPG key for https://images.linuxcontainers.org Downloading the image list for https://images.linuxcontainers.org Validating the GPG signature of /tmp/tmppke5bbta/index.json.asc Downloading the image: https://images.linuxcontainers.org/images/centos/6/amd64/default/20150619_02:16/lxd.tar.xz Validating the GPG signature of /tmp/tmppke5bbta/centos-6-amd64-default-20150619_02:16.tar.xz.asc Image imported as: afae698680fcf11b915cc3b6f06b3af6c085a59efa4b368b80ddcf9d66b73e3d Setup alias: centos6 % sudo lxc image list +---------+--------------+--------+-------------+--------+-----------------------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | UPLOAD DATE | +---------+--------------+--------+-------------+--------+-----------------------------+ | centos6 | afae698680fc | no | | x86_64 | Jul 5, 2015 at 9:16pm (JST) | +---------+--------------+--------+-------------+--------+-----------------------------+
コンテナイメージが用意できたらコンテナを作成する。ここでは「c6」という名前で作成する。
% sudo lxc launch centos6 c6 Creating container...done Starting container...done % sudo lxc list +------+---------+-----------+------+-----------+ | NAME | STATE | IPV4 | IPV6 | EPHEMERAL | +------+---------+-----------+------+-----------+ | c6 | RUNNING | 10.0.3.18 | | NO | +------+---------+-----------+------+-----------+ % sudo lxc info c6 Name: c6 Status: RUNNING Init: 25633 Ips: eth0: IPV4 10.0.3.18 lo: IPV4 127.0.0.1 lo: IPV6 ::1
コンテナが作成されたら通常のコマンドが実行できる。
% sudo lxc exec c6 -- uname -a Linux c6 3.19.0-21-generic #21-Ubuntu SMP Sun Jun 14 18:31:11 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux % sudo lxc exec c6 -- cat /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m
尚、コンテナ上のファイルシステムはホスト上の/var/lib/lxd/lxc/<コンテナ>/rootfsに格納される。
% sudo ls -l /var/lib/lxd/lxc/c6/rootfs 合計 84 dr-xr-xr-x 2 100000 100000 4096 6月 19 11:21 bin/ dr-xr-xr-x 2 100000 100000 4096 9月 23 2011 boot/ drwxr-xr-x 4 100000 100000 4096 6月 19 11:21 dev/ drwxr-xr-x 49 100000 100000 4096 7月 5 22:11 etc/ drwxr-xr-x 2 100000 100000 4096 9月 23 2011 home/ dr-xr-xr-x 7 100000 100000 4096 6月 19 11:21 lib/ dr-xr-xr-x 7 100000 100000 12288 6月 19 11:21 lib64/ drwxr-xr-x 2 100000 100000 4096 9月 23 2011 media/ drwxr-xr-x 2 100000 100000 4096 9月 23 2011 mnt/ drwxr-xr-x 2 100000 100000 4096 9月 23 2011 opt/ dr-xr-xr-x 2 100000 100000 4096 9月 23 2011 proc/ dr-xr-x--- 2 100000 100000 4096 7月 7 14:47 root/ dr-xr-xr-x 2 100000 100000 4096 6月 19 11:21 sbin/ drwxr-xr-x 2 100000 100000 4096 6月 19 11:21 selinux/ drwxr-xr-x 2 100000 100000 4096 9月 23 2011 srv/ drwxr-xr-x 2 100000 100000 4096 9月 23 2011 sys/ drwxrwxrwt 2 100000 100000 4096 7月 7 15:38 tmp/ drwxr-xr-x 13 100000 100000 4096 6月 19 11:21 usr/ drwxr-xr-x 17 100000 100000 4096 6月 19 11:21 var/ % sudo cat /var/lib/lxd/lxc/c1/rootfs/etc/issue CentOS release 6.6 (Final) Kernel \r on an \m
コンソール接続
コンテナが作成されたのでコンソールで接続してみる。接続は簡単でコンテナ上でシェルを実行すればよい。
% sudo lxc exec c6 bash [root@c6 ~]# uname -n c6 [root@c6 ~]# id uid=0(root) gid=0(root) groups=0(root) [root@c6 ~]# 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 25: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:16:3e:67:2d:4b brd ff:ff:ff:ff:ff:ff inet 10.0.3.18/24 brd 10.0.3.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::216:3eff:fe67:2d4b/64 scope link valid_lft forever preferred_lft forever [root@c6 ~]# ip r default via 10.0.3.1 dev eth0 10.0.3.0/24 dev eth0 proto kernel scope link src 10.0.3.18 169.254.0.0/16 dev eth0 scope link metric 1025 [root@c6 ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 08:19 ? 00:00:00 /sbin/init root 226 1 0 08:19 ? 00:00:00 /sbin/dhclient -H c6 -1 -q -lf / root 266 1 0 08:19 ? 00:00:00 /sbin/rsyslogd -i /var/run/syslo root 296 1 0 08:19 console 00:00:00 /sbin/mingetty --nohangup consol root 514 0 0 08:35 ? 00:00:00 bash root 521 1 0 08:35 ? 00:00:00 /sbin/mingetty --nohangup /dev/t root 522 514 0 08:35 ? 00:00:00 ps -ef [root@c6 ~]# exit exit
コンテナ起動・停止
コンテナの起動と停止はそれぞれlxc start、lxc sttopで行う。
% sudo lxc start c6 % sudo lxc list +------+---------+------+------+-----------+ | NAME | STATE | IPV4 | IPV6 | EPHEMERAL | +------+---------+------+------+-----------+ | c6 | RUNNING | | | NO | +------+---------+------+------+-----------+ % sudo lxc stop c6 % sudo lxc list +------+---------+------+------+-----------+ | NAME | STATE | IPV4 | IPV6 | EPHEMERAL | +------+---------+------+------+-----------+ | c6 | STOPPED | | | NO | +------+---------+------+------+-----------+ % sudo lxc exec c6 -- uname -a error: Container is not running.
コンテナ削除
lxc deleteを使用する。
% sudo lxc delete c6 % sudo lxc list +------+-------+------+------+-----------+ | NAME | STATE | IPV4 | IPV6 | EPHEMERAL | +------+-------+------+------+-----------+ +------+-------+------+------+-----------+
Ephemeralコンテナ使用
LXD 0.7で実装されたEphemeralコンテナを使うとlxc stopでコンテナが停止するとコンテナ自体が削除される。
この機能を使うと揮発性のコンテナを作成することができる。
コンテナをEphemeralにするにはlxc launchコマンドに-eオプションを付けるだけでよい。
ここでは永続化コンテナのc1と揮発性コンテナのc2を作成してみる。
% sudo lxc launch centos6 c1 % sudo lxc launch centos6 c2 -e % sudo lxc list +------+---------+-----------+------+-----------+ | NAME | STATE | IPV4 | IPV6 | EPHEMERAL | +------+---------+-----------+------+-----------+ | c1 | RUNNING | 10.0.3.21 | | NO | | c2 | RUNNING | 10.0.3.36 | | YES | +------+---------+-----------+------+-----------+
この状態で2つのコンテナを停止させてみるとc2だけコンテナそのものが削除されているのが分かる。
% sudo lxc stop c1 % sudo lxc stop c2 % sudo lxc list +------+---------+------+------+-----------+ | NAME | STATE | IPV4 | IPV6 | EPHEMERAL | +------+---------+------+------+-----------+ | c1 | STOPPED | | | NO | +------+---------+------+------+-----------+
関連資料・記事