Life with IT

山好きITエンジニア 木檜(こぐれ)和明 による発信の場

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

その他にも様々なコマンドがあるがここでは割愛する。詳しくは公式サイトを参照のこと。

参考サイト

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        |
+------+---------+------+------+-----------+

関連資料・記事