LXCとは
LXC(Linux Container)は、Dockerと同様、Linux上に独立したコンテナを構築する技術です。Dockerは基本的に「1コンテナ1アプリケーション」です(アプリケーションコンテナ)。一方LXCは、コンテナ内でカーネル以外のシステムを動かします(システムコンテナ)。LXCのコンテナ内は、可能な限り独立したLinux環境に近く、かつカーネルは共用する、という環境です。LXCの特徴を以下に示します。
- 仮想化環境の中ではもっとも軽量
- コンテナイメージサイズが小さい
- コンテナには個別にIPアドレスを割り当て可能
- x86_64およびi386環境に対応
- CPUの仮想化支援機能がなくても利用できる
Linuxのみ対応しているLXCは、Ubuntuと同じく、Canonical社の支援を受けて開発されています。そのため、Ubuntuとの親和性は高いです。
LXCのインストールとコンテナの作成
LXCおよび必要なコマンド類は次のようにしてインストールします。
$ sudo apt install lxc
さっそくコンテナを作成してみましょう。コンテナを作成するには、lxc-createコマンドを使います。
書式
lxc-create -t download -n コンテナ名
次の例では、ダウンロード可能なコンテナイメージ一覧から選択してダウンロードしています。
$ sudo lxc-create -t download -n test-container Setting up the GPG keyring Downloading the image index --- DIST RELEASE ARCH VARIANT BUILD ← 利用可能な一覧が表示される --- alpine 3.4 amd64 default 20180412_17:50 alpine 3.4 armhf default 20180412_17:50 alpine 3.4 i386 default 20180412_17:50 alpine 3.5 amd64 default 20180412_17:50 ubuntu bionic amd64 default 20180413_03:49 ubuntu bionic arm64 default 20180413_03:49 ubuntu bionic armhf default 20180412_03:49 ubuntu bionic i386 default 20180413_03:49 ubuntu bionic ppc64el default 20180411_08:17 ubuntu bionic s390x default 20180413_03:49 ubuntu xenial s390x default 20180413_03:49 --- Distribution: ubuntu ← ディストリビューション名を入力 Release: artful ← リリース名を入力 Architecture: amd64 ← アーキテクチャを入力 Downloading the image index Downloading the rootfs Downloading the metadata The image cache is now ready Unpacking the rootfs --- You just created an Ubuntu container (release=artful, arch=amd64, variant=default) To enable sshd, run: apt-get install openssh-server For security reason, container images ship without user accountsand without a root password. Use lxc-attach or chroot directly into the rootfs to set a root passwordor create user accounts.
コンテナを作成するのに必要なパッケージがダウンロードされ、インストールされます。しばらくするとコンテナが作成されます。
コンテナの利用(Ubuntu)
コンテナを起動するには、lxc-startコマンドを実行します。-dは、デーモンとして実行するオプションです。
書式
lxc-start -n コンテナ名 -d
$ sudo lxc-start -n test-container -d
シェルのプロンプトが表示されたら、無事に起動できているはずです。以下のコマンドで確認してみます。
$ sudo lxc-ls -f NAME STATE AUTOSTART GROUPS IPV4 IPV6 test-container RUNNING 0 - 10.0.3.38 -
STATE欄が「RUNNING」となっていればコンテナは起動しています。IPアドレスは、ここでは10.0.3.38が割り当てられています。pingコマンドで確認してみましょう。
$ ping 10.0.3.38 PING 10.0.3.38 (10.0.3.38) 56(84) bytes of data. 64 bytes from 10.0.3.38: icmp_seq=1 ttl=64 time=0.056 ms 64 bytes from 10.0.3.38: icmp_seq=2 ttl=64 time=0.131 ms 64 bytes from 10.0.3.38: icmp_seq=3 ttl=64 time=0.100 ms 64 bytes from 10.0.3.38: icmp_seq=4 ttl=64 time=0.096 ms ^C ← Ctrl+Cを押す --- 10.0.3.38 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 2999ms rtt min/avg/max/mdev = 0.056/0.095/0.131/0.029 ms
コンテナのより詳細な情報は、lxc-infoコマンドで確認できます。
書式
lxc-info -n コンテナ名
$ sudo lxc-info -n test-container Name: test-container State: RUNNING PID: 3285 IP: 10.0.3.38 CPU use: 0.32 seconds BlkIO use: 3.59 MiB Memory use: 9.85 MiB KMem use: 0 bytes Link: vethM4MJNE TX bytes: 2.80 KiB RX bytes: 2.72 KiB Total bytes: 5.53 KiB
lxc-attachコマンドを使うと、指定したコンテナにログインする(コンテナ内でシェルを実行する)ことができます。
書式
lxc-attach -n コンテナ名
$ sudo lxc-attach -n test-container
すると「root@コンテナ名」のプロンプトに変わります。lsb_releaseコマンドでOS情報を表示してみましょう。
root@test-container:/# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 17.10 Release: 17.10 Codename: artful
ネットワークインターフェイスの情報を確認してみます。
root@test-container:/# ip a 1: lo:mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 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@if5: mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:16:3e:1a:f1:0a brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.0.3.38/24 brd 10.0.3.255 scope global dynamic eth0 valid_lft 3471sec preferred_lft 3471sec inet6 fe80::216:3eff:fe1a:f10a/64 scope link valid_lft forever preferred_lft forever
コンテナ内で実行されているプロセスを確認します。最小限ではあるものの、systemdを含めたサービスが稼働しているのが分かります。
# ps ax PID TTY STAT TIME COMMAND 1 ? Ss 0:00 /sbin/init 37 ? Ss 0:00 /lib/systemd/systemd-journald 43 ? Ss 0:00 /lib/systemd/systemd-networkd19.3 68 ? Ss 0:00 /lib/systemd/systemd-resolved 69 ? Ss 0:00 /usr/sbin/cron -f 70 ? Ssl 0:00 /usr/sbin/rsyslogd -n 71 ? Ss 0:00 /lib/systemd/systemd-logind 73 ? Ss 0:00 /usr/bin/dbus-daemon - -system - -address=systemd: - -no 77 pts/3 Ss+ 0:00 /sbin/agetty - -noclear - -keep-baud pts/3 115200,38400 78 pts/0 Ss+ 0:00 /sbin/agetty - -noclear - -keep-baud pts/0 115200,38400 79 pts/1 Ss+ 0:00 /sbin/agetty - -noclear - -keep-baud console 115200,384 80 pts/1 Ss+ 0:00 /sbin/agetty - -noclear - -keep-baud pts/1 115200,38400 81 pts/2 Ss+ 0:00 /sbin/agetty - -noclear - -keep-baud pts/2 115200,38400 83 pts/2 Ss 0:00 /bin/bash 95 pts/2 R+ 0:00 ps ax
exitコマンドでコンテナからログアウトしホストOSに戻れます。
root@test-container:/# exit exit
コンテナを停止するには、lxc-stopコマンドを使います。
書式
lxc-stop -n コンテナ名
$ sudo lxc-stop -n test-container
コンテナの構成は、[/var/lib/lxc/コンテナ名/config]ファイルで確認できます。
[/var/lib/lxc/test-container/config]
# Template used to create this container: /usr/share/lxc/templates/lxc-download
# Parameters passed to the template:
# Template script checksum (SHA-1): 9748088977ba845f625e45659f305a5395c2dc7b
# For additional config options, please look at lxc.container.conf(5)
# Uncomment the following line to support nesting containers:
#lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)
# Distribution configuration
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.arch = x86_64
# Container specific configuration
lxc.rootfs = /var/lib/lxc/test-container/rootfs
lxc.rootfs.backend = dir
lxc.utsname = test-container
# Network configuration
lxc.network.type = vethlxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:1a:f1:0a
コンテナを消去するには、lxc-destroyコマンドを実行します。
書式
lxc-destroy -n コンテナ名
$ sudo lxc-destroy -n test-container
続きは本書で
このあとの「lxcでCentOS」「LXCのネットワーク」はぜひ本書を読んで試してみてください。Ubuntuサーバーを導入したい方にはとっておきの1冊となっています!