LXDとは
- Linux Container Daemon の略
- Canonical によって開発されているシステムコンテナの管理ツール
- Canonical は Ubuntu を開発している企業
- 上の理由から Ubuntu への導入が比較的容易(CentOS等でも導入可能)
- Linux コンテナを使用する

コンテナと仮想化の違い
- 仮想化では、VMware ESXi などのハイパーバイザによってハードウェアを仮想的に分割して独立した実行環境を構築します。分割された各環境にOS (Windows、Linux など) その他アプリをインストールして仮想マシンとして動作させます。
- コンテナは、単一のホストOS内で1つのプロセスとして動作します。各コンテナはホストOSのリソース(CPU、メモリ等)を共有します。
LXDでできることと特徴
- 1台のホストOS内に複数のコンテナを起動(サーバを構築)することが容易に可能
- コンテナの削除も容易に可能
- 使用できるイメージ(サーバのOS)は Linux に限られます
- イメージはリモートサーバからダウンロードするかローカルにあるものを使用します
以下のURLはデフォルトのリモートサーバの一つで、イメージリストが記載されています
- リモートサーバからダウンロードしたイメージはローカルにキャッシュされるため、2度目以降は高速でコンテナを起動できます
- 既存のコンテナのスナップショット(バックアップ)作成
- スナップショットからイメージの作成
- ホストOSへの通信をコンテナへポートフォワーディングすることも容易に可能
- lxdui を使用すればブラウザ上でのコンテナ管理も可能
上記の特徴から、1台のPC内で複数のサーバを作ったり削除したりが容易にできます。
Linuxサーバ構築の勉強をするための環境としては最適なのではないかと思います。
LXDのインストール手順
環境
- Ubuntu 18.04.3 LTS (Bionic Beaver)
- LXD 3.0.3
Ubuntu PC を用意
以下の URL より Ubuntu のイメージがダウンロードできます。
日本語 Remix イメージを使用することをお勧めします。
容量は 2GB くらいです。
イメージをダウンロードしたらブータブルメディア(USBなど)を作成してPCにUbuntuをインストールしてください。
ブータブルUSBの作成方法については以下の記事を参考にしてください。
LXDのインストール手順
パッケージのインストール
sudo権限のあるユーザにて以下コマンドを実行し、LXDおよびLXDに関連するパッケージをインストールします。
$ sudo apt install -y lxd lxd-client lxd-tools criu
インストールされるパッケージは以下の4つです。
- lxd
- lxd-client
- lxd-tools
- criu
パッケージをインストール後、以下のコマンドを実行しLXDデーモンの準備が完了するのを待ちます。
$ sudo lxd waitready
LXDの初期設定
続いて、[ $ sudo lxd init ] コマンドを実行しLXDの初期設定を行います。
対話的に各設定を行っていきます。良くわからなければすべてデフォルトのままでOKです。
$ sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
We detected that you are running inside an unprivileged container.
This means that unless you manually configured your host otherwise,
you will not have enough uids and gids to allocate to your containers.
LXD can re-use your container's own allocation to avoid the problem.
Doing so makes your nested containers slightly less safe as they could
in theory attack their parent container and gain more privileges than
they otherwise would.
Would you like to have your containers share their parent's allocation? (yes/no) [default=yes]:
Would you like LXD to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
これでLXDの初期設定は完了です。
LXDを使用するユーザをlxdグループに追加しておくと、sudoをすることなくLXDのコマンドを使用できるようになるため、追加しておくことをお勧めします。
$ sudo gpasswd -a "${USER}" lxd
※グループに追加後は、設定を有効化するために当該ユーザで再ログインしてください。
LXDの動作確認
LXDのバージョン確認
$ lxd --version
3.0.3
ローカルイメージの確認
$ lxc image list
+-------+-------------+--------+-------------+------+------+-------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE |
+-------+-------------+--------+-------------+------+------+-------------+
初期状態ではローカルイメージは空となっています。
Ubuntu18.04とCentOS8のイメージがキャッシュされている場合は以下のように表示されます。
$ lxc image list
+-------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE |
+-------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
| | 412fb387e01d | no | ubuntu 18.04 LTS amd64 (release) (20191218) | x86_64 | 178.66MB | Dec 28, 2019 at 7:53am (UTC) |
+-------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
| | 943be4382047 | no | Centos 8 amd64 (20191230_07:08) | x86_64 | 120.93MB | Dec 30, 2019 at 8:37am (UTC) |
+-------+--------------+--------+---------------------------------------------+--------+----------+------------------------------+
コンテナリストの確認
$ lxc list
+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+
コンテナについても初期状態では何もない状態となっています。
コンテナが作成されている場合は以下のように表示されます。
$ lxc list
+--------------+---------+---------------------+-----------------------------------------------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+--------------+---------+---------------------+-----------------------------------------------+------------+-----------+
| centos01 | RUNNING | 10.69.34.54 (eth0) | fd42:a4b8:6ccc:c32d:216:3eff:fe89:bd14 (eth0) | PERSISTENT | 0 |
+--------------+---------+---------------------+-----------------------------------------------+------------+-----------+
| driven-pony | RUNNING | 10.69.34.73 (eth0) | fd42:a4b8:6ccc:c32d:216:3eff:fe85:e195 (eth0) | PERSISTENT | 0 |
+--------------+---------+---------------------+-----------------------------------------------+------------+-----------+
| lxdtest | RUNNING | 10.69.34.160 (eth0) | fd42:d22:519f:6bff::1 (lxdbr0) | PERSISTENT | 0 |
| | | 10.4.115.1 (lxdbr0) | fd42:a4b8:6ccc:c32d:216:3eff:fefd:1329 (eth0) | | |
+--------------+---------+---------------------+-----------------------------------------------+------------+-----------+
リモートリストの確認
イメージのダウンロード元サーバのリストを表示する場合は以下のコマンドを実行します。
$ lxc remote list
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| NAME | URL | PROTOCOL | AUTH TYPE | PUBLIC | STATIC |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| images | https://images.linuxcontainers.org | simplestreams | | YES | NO |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| local (default) | unix:// | lxd | tls | NO | YES |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| ubuntu | https://cloud-images.ubuntu.com/releases | simplestreams | | YES | YES |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| ubuntu-daily | https://cloud-images.ubuntu.com/daily | simplestreams | | YES | YES |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
コンテナの起動
例として、リモートの images から centos8 のイメージをダウンロードしてコンテナを起動する場合は以下のコマンドを実行します。
$ lxc launch images:centos/8 centosTEST
centosTEST を作成中
centosTEST を起動中
※初回実行時はイメージのダウンロードが発生します
コンテナ起動後にコンテナのリストを確認すると以下のようにリストに表示されています。
$ lxc list
+--------------+---------+---------------------+-----------------------------------------------+------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+--------------+---------+---------------------+-----------------------------------------------+------------+-----------+
| centosTEST | RUNNING | 10.69.34.27 (eth0) | fd42:a4b8:6ccc:c32d:216:3eff:fecc:eb7d (eth0) | PERSISTENT | 0 |
+--------------+---------+---------------------+-----------------------------------------------+------------+-----------+
作成したコンテナ(centosTEST)にてコマンドを実行したい場合は、以下のコマンドを実行するとコンテナ(centosTEST)のCLIを表示できます。
$ lxc exec centosTEST /bin/bash
[root@centosTEST ~]#
LXDにおけるネットワーク通信について
LXDでは、仮想スイッチが作成されホストOSと各コンテナが仮想スイッチを介してネットワーク接続されます。
コンテナから外部への通信について
LXDインストール時にホストOSの仮想スイッチ側の仮想インターフェースが自動で作成され、IPアドレスも自動で設定されます(xxx.xxx.xxx.1が割り振られます)。
また各コンテナのIPアドレスについては、ホストOSの仮想インターフェースのIPアドレスと同一セグメント内のIPアドレスがコンテナ作成時に自動で割り振られます。
各コンテナのゲートウェイはホストOSの仮想スイッチ側のインターフェースとなっており、ホストOSを介して外部ネットワークと通信します。
各コンテナのIPアドレスは、ホストOSでの lxc list コマンドの出力、または当該コンテナのCLIにてLinux標準の方法で確認できます。
外部からコンテナへの通信について
ホストOSの外部からホストOS内のコンテナへ通信する場合、外部からはホストOSのIPアドレスしか見えないため、デフォルトの状態では通信できません。
外部からコンテナへ通信できるようにするためには、ホストOSにてポートフォワーディングの設定をする必要があります。
例:
外部からcentosTEST(10.69.34.27)にSSH接続をさせたい場合は、以下のように設定します。
- ホストOS(10.1.10.5)のポート50005宛に受信した通信についてはコンテナcentosTEST(10.69.34.27)のポート22へ転送させる
■設定コマンド
※ホストOSにて実行
$ lxc config device add centosTEST ssh proxy listen=tcp:10.1.10.5:50005 connect=tcp:10.69.34.27:22 bind=host
この設定によって、コンテナ centosTEST(10.69.34.27)にSSH接続したい場合は、 ホストOS(10.1.10.5)のポート50005宛に接続すれば、接続できるということになります。
書式:
$ lxc config device add "コンテナ名" "任意の識別名" proxy listen=tcp:"ホストOSのIP":"ポート番号" connect=tcp:"コンテナのIP":"ポート番号" bind=host
対象コンテナのポートフォワーディング設定を確認したい場合は以下のコマンドを実行します。
$ lxc config device show centosTEST
ssh:
bind: host
connect: tcp:10.69.34.27:22
listen: tcp:10.1.10.5:50005
type: proxy
書式:
$ lxc config device show "コンテナ名"
―――――――――――――