Linux上でコンテナを構築するには? 『Ubuntuサーバー徹底入門』からLinux Containerを紹介|翔泳社の本

Linux上でコンテナを構築するには? 『Ubuntuサーバー徹底入門』からLinux Containerを紹介

2018/06/19 07:00

 コンテナといえばDockerが利用されることが多いですが、LinuxではLXC(Linux Container)というコンテナを構築することができます。仮想化環境では非常に軽量で、CPUの支援機能がなくても使えるのが特徴です。今回は『Ubuntuサーバー徹底入門』からこのLXCを導入する方法を紹介します。

本記事は『Ubuntuサーバー徹底入門』の「19.3 LXC」の一部を転載・編集したものです。

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および必要なコマンド類は次のようにしてインストールします。

LXCをインストールする
$ sudo apt install lxc

 さっそくコンテナを作成してみましょう。コンテナを作成するには、lxc-createコマンドを使います。

書式

lxc-create -t download -n コンテナ名

lxc-createコマンドの主なオプション
lxc-createコマンドの主なオプション

 次の例では、ダウンロード可能なコンテナイメージ一覧から選択してダウンロードしています。

コンテナを作成する
$ 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

test-containerコンテナを起動する
$ 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コマンドを実行する
$ 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 コンテナ名

test-containerコンテナの詳細な情報を確認する
$ 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 コンテナ名

test-containerコンテナにログインする
$ sudo lxc-attach -n test-container

 すると「root@コンテナ名」のプロンプトに変わります。lsb_releaseコマンドでOS情報を表示してみましょう。

test-container内でコマンドを実行する
root@test-container:/# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 17.10
Release: 17.10
Codename: artful

 ネットワークインターフェイスの情報を確認してみます。

test-containerコンテナのネットワークインターフェイスを確認する
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を含めたサービスが稼働しているのが分かります。

test-containerコンテナ内のプロセスを表示する
# 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 コンテナ名

test-containerコンテナを停止する
$ 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 コンテナ名

test-containerコンテナを削除する
$ sudo lxc-destroy -n test-container

続きは本書で

 このあとの「lxcでCentOS」「LXCのネットワーク」はぜひ本書を読んで試してみてください。Ubuntuサーバーを導入したい方にはとっておきの1冊となっています!

Ubuntuサーバー徹底入門

Amazon SEshop その他


Ubuntuサーバー徹底入門

著者:中島能和
発売日:2018年6月13日(水)
価格:4,104円(税込)

本書について

Ubuntuサーバーのインストールからはじまり、パッケージの管理から代表的なアプリケーションの設定まで、Ubuntuをサーバーとして活用したい人に向けて基礎から徹底的に解説をしています。