Life with IT

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

LXC

2016/5/7更新

対応バージョン: 2.0

LXC 2.0のコンテナを作成して各種管理を行う手順を示す。導入OSはUbuntu 16.04とする。

尚、LXC 1.0での手順は以下を参照のこと。

関連資料・記事

LXCインストール

# apt install lxc

テンプレートは以下が用意されている。

# ls /usr/share/lxc/templates
lxc-alpine     lxc-centos    lxc-fedora        lxc-oracle      lxc-sshd
lxc-altlinux   lxc-cirros    lxc-gentoo        lxc-plamo       lxc-ubuntu
lxc-archlinux  lxc-debian    lxc-openmandriva  lxc-slackware   lxc-ubuntu-cloud
lxc-busybox    lxc-download  lxc-opensuse      lxc-sparclinux

コンテナ作成から起動、削除まで

コンテナ作成

ここではUbuntuのテンプレートを使ってc1という名前のコンテナを作成する。

# lxc-create -t ubuntu -n c1

コンテナは以下の場所に格納される。

/var/lib/lxc/<コンテナ名>/

コンテナのルートファイルシステムは以下に作成され、bin、devなどひと通りのディレクトリ構成が作成される。

/var/lib/lxc/<コンテナ名>/rootfs

# ls /var/lib/lxc/c1/rootfs/
bin/   dev/  home/  lib64/  mnt/  proc/  run/	srv/  tmp/  var/
boot/  etc/  lib/   media/  opt/  root/  sbin/	sys/  usr/

容量にして335MB程度となる。

# du -sh /var/lib/lxc/c1/rootfs
335M	/var/lib/lxc/c1/rootfs

またコンテナ全体の設定は以下のファイルで行う。

/var/lib/lxc/<コンテナ名>/config

コンテナ起動

コンテナが作成できたら起動する。-dオプションを付けることによってデーモンモードで起動する。

# lxc-start -n c1 -d

コンテナに接続するにはlxc-consoleを使用する。デフォルトのユーザはubuntu(パスワードも同じ)である。

# lxc-console -n c1

コンテナから抜けるにはCtrl + aを入力し、続いてqを入力する。

コンテナ終了

コンテナを終了させるには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

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

参考サイト

2014/6/12更新

対応バージョン: 1.0

LXC 1.0のコンテナを作成してコンソール接続するまでの一連の手順を示す。

尚、LXC 2.0での手順は以下を参照のこと。

関連資料・記事

準備

導入OS

Ubuntu 14.04

インストール

% sudo apt-get install lxc

コンテナ作成

ここでは"c1"という名前のUbuntuのコンテナを作る。

% sudo lxc-create -t ubuntu -n c1

/var/cache/lxc/trusty/rootfs-amd64配下のファイルが/var/lib/lxc/c1/rootfsにコピーされ、そこがコンテナのルートファイルシステムになる。

コンテナの起動

先ほど作ったコンテナ"c1"を-d(デーモンモード)で起動する。

% sudo lxc-start -n c1 -d

動作状況を確認する。コンテナのIPアドレスはDHCPで割り当てられている。

% sudo lxc-ls --fancy
NAME  STATE    IPV4        IPV6  AUTOSTART  
------------------------------------------
c1    RUNNING  10.0.3.167  -     NO         

コンソール接続

作成したコンテナ名と同じアカウント(パスワードも同じ)が作成されているのでコンソール接続する(切断はCtrl + a, q)。

(lxc-consoleを使う場合)

% sudo lxc-console -n c1
c1 login: ubuntu
Password: ******

(sshを使う場合)

% sudo lxc-info -n c1
Name:           c1
State:          RUNNING
PID:            4326
IP:             10.0.3.167
CPU use:        1.04 seconds
BlkIO use:      400.00 KiB
Memory use:     10.39 MiB
KMem use:       0 bytes
Link:           vethUC142S
 TX bytes:      11.10 KiB
 RX bytes:      20.82 KiB
 Total bytes:   31.92 KiB

% ssh ubuntu@<lxc-infoで表示されたIPアドレス>
Password: ******

コンソール接続したらコンテナ内の環境であることを確認する。

ubuntu@c1:~$ hostname
c1

ubuntu@c1:~$ ip addr
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
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:63:5d:ff brd ff:ff:ff:ff:ff:ff
    inet 10.0.3.167/24 brd 10.0.3.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fe63:5dff/64 scope link 
       valid_lft forever preferred_lft forever

コンテナのシャットダウン

コンテナ内でshutdownを実行するか、コンテナを起動したホスト上でlsx-stopを実行する。

% sudo lxc-stop -n c1

% sudo lxc-ls --fancy
NAME  STATE    IPV4  IPV6  AUTOSTART  
------------------------------------
c1    STOPPED  -     -     NO         

コンテナ制御

OS起動時のコンテナ自動起動設定

コンテナの設定は/var/lib/lxc/c1/configに格納されるので以下の設定を変更する。

lxc.start.auto = 0|1

0(自動起動しない)

1(自動起動する)

lxc.start.delay = n

このコンテナが起動したあと次のコンテナが起動するまでに待つ秒数

自動起動を有効にするとlxc-lsでAUTOSTARTがYESになっているのが確認できる。

% sudo lxc-ls --fancy
NAME  STATE    IPV4  IPV6  AUTOSTART  
------------------------------------
c1    STOPPED  -     -     YES        

ここでもう一つコンテナを作り、こちらは自動起動しないデフォルトの設定のままにしておく。

% sudo lxc-create -t ubuntu -n c2

% sudo lxc-ls --fancy
NAME  STATE    IPV4  IPV6  AUTOSTART  
------------------------------------
c1    STOPPED  -     -     YES        
c2    STOPPED  -     -     NO         

この状態でlxc-autostartを実行すると自動起動設定になっている"c1"のみが起動する。

% sudo lxc-autostart -a

% sudo lxc-ls --fancy  
NAME  STATE    IPV4        IPV6  AUTOSTART  
------------------------------------------
c1    RUNNING  10.0.3.157  -     YES        
c2    STOPPED  -           -     NO         

コンテナの削除

lxc-destroyを実行する。

% sudo lxc-destroy -n c2

% sudo lxc-ls --fancy
NAME  STATE    IPV4        IPV6  AUTOSTART  
------------------------------------------
c1    RUNNING  10.0.3.157  -     YES        

コンテナの凍結

コンテナが使用するリソース(プロセスやメモリ空間)などを保持したまま一時的に使用を停止したい場合はコンテナを凍結させることができる。

% sudo lxc-freeze -n c1

% sudo lxc-ls --fancy
NAME  STATE   IPV4        IPV6  AUTOSTART  
-----------------------------------------
c1    FROZEN  10.0.3.157  -     YES        

% sudo lxc-unfreeze -n c1

% sudo lxc-ls --fancy
NAME  STATE    IPV4        IPV6  AUTOSTART  
------------------------------------------
c1    RUNNING  10.0.3.157  -     YES