LXD資料一覧

LXD 2.0導入手順

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

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

参考サイト