LXDの Web UIを使って実際に Linuxシステムコンテナを作ります。
「Linuxシステムコンテナ(LXD) 1」で、LXDの Web UIを使えるようにしましたので、ここでは実際に Linuxシステムコンテナを作ってみます。
1.システムコンテナに LXDの外からアクセスできるようにしておく
Web UIにログインする前に LXDのネットワークがどうなってるかなんですが、どうも初期状態だと内部に独立したネットワークを持ってる感じで、外から繋げない模様です。
だけど私は Linuxシステムコンテナとして作ったサーバーを家庭内LANに公開して使いたいのです。
でも LXDのネットワークは LXDの中に閉じていて、コンテナや仮想マシン同士は通信できるものの、外からコンテナにアクセスすることができなさそうです。
私ようなニーズは普通にあるだろうと思って調べてみると、どうやらホスト側にブリッジインターフェイスを作ってそこにコンテナを繋げば良いようです。
強いて図にするとこんな感じで。
ホストのブリッジインターフェイスは LXDの範疇を外れて、OSが管理するものになります。
Ubuntu Server 24.04でのネットワーク設定は netplanの機能で [/etc/netplan]ディレクトリ以下にあるファイルによって行われます。
[/etc/netplan]ディレクトリに行って内容を見てみます。
OSを入れたばかりの後は、インストーラによって作られたファイルが 1つあるのみ。
subro@UbuntuServer2404-1:~$ cd /etc/netplan
subro@UbuntuServer2404-1:/etc/netplan$ ls -l
合計 4
-rw------- 1 root root 645 4月 26 2024 50-cloud-init.yaml
[50-cloud-init.yaml] というファイルの中身はどうなっているか。
# This file is generated from information provided by the datasource. Changes # to it will not persist across an instance reboot. To disable cloud-init's # network configuration capabilities, write a file # /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following: # network: {config: disabled} network: ethernets: ens32: addresses: - 192.168.1.103/24 nameservers: addresses: - 192.168.1.1 search: - subrohouse.internal routes: - to: default via: 192.168.1.1 version: 2
IPアドレスが [192.168.1.103] に指定されたりしているのが分かると思います。
ブリッジインターフェイスを作るにあたってこのファイルを書き換えれば…と思うのですが、ファイル名に「cloud-init」ってのが気になります。
ファイルの頭にあるコメントでは「このファイルは cloud-initで書き換えられる可能性のあるものだから OS再起動後に同じになってる保証ね〜ぞ。」と言っています。
そういう訳で、このファイルを書き換えるのは実は推奨されていません。
とは言えブリッジインターフェイスを設定するためには全面的に書き換えたいので、[50-cloud-init.yaml]ファイルは YAMLファイルとして認識されなくなるよう
[50-cloud-init.yaml.bak] とリネームしてしまいました。
subro@UbuntuServer2404-1:/etc/netplan$ sudo mv 50-cloud-init.yaml 50-cloud-init.yaml.bak
subro@UbuntuServer2404-1:/etc/netplan$ ls -l
合計 4
-rw------- 1 root root 645 4月 26 2024 50-cloud-init.yaml.bak
netplanは [/etc/netplan]ディレクトリにある YAMLファイルを名前順に読み込む仕様になっていまして、名前は適当に [60-lxd.yaml] として新規にファイルを以下の内容で作ることにしました。
(YAMLファイルが 1つになってしまったのでファイル名の順番は意味がなくなってしまいましたけど)
ブリッジインターフェイス [br0] を作っています。
network:
version: 2
ethernets:
ens32:
dhcp4: false
dhcp6: false
bridges:
br0:
interfaces:
- ens32
addresses:
- 192.168.1.103/24 ← こちらにホスト用のIPアドレスがきています。
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 192.168.1.1
parameters:
forward-delay: 0
stp: no
optional: true
これで最善の設定かというとちょっと怪しいです。
上手く動くと良いけど。
このファイルのパーミッションは [-rw------](600) にしておきましょう。
(そうしないと有効化する時に「緩いぞ!」と怒られます。)
subro@UbuntuServer2404-1:/etc/netplan$ sudo chmod 600 60-lxd.yaml
[/etc/netplan]ディレクトリの下はこんな風になりました。
subro@UbuntuServer2404-1:/etc/netplan$ ls -l
合計 8
-rw------- 1 root root 645 4月 26 2024 50-cloud-init.yaml.bak
-rw------- 1 root root 387 4月 1 22:26 60-lxd.yaml
netplanの変更した設定を読み込ませる前に今の設定結果を ipコマンド(show / manipulate routing, network devices, interfaces and tunnels)で確認しておきます。
subro@UbuntuServer2404-1:/etc/netplan$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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 noprefixroute
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:53:00:54 brd ff:ff:ff:ff:ff:ff
altname enp2s0
inet 192.168.1.103/24 brd 192.168.1.255 scope global ens32
valid_lft forever preferred_lft forever
inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 13719sec preferred_lft 11919sec
inet6 fe80::20c:29ff:fe53:54/64 scope link
valid_lft forever preferred_lft forever
変更を読み込ませます。
subro@UbuntuServer2404-1:/etc/netplan$ sudo netplan apply
何も出ませんが、エラーも出ていません。
改めて確認。
subro@UbuntuServer2404-1:/etc/netplan$ ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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 noprefixroute
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
link/ether 00:0c:29:53:00:54 brd ff:ff:ff:ff:ff:ff
altname enp2s0
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 5e:a0:4e:9d:f3:f2 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.103/24 brd 192.168.1.255 scope global br0
valid_lft forever preferred_lft forever
inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 14307sec preferred_lft 12507sec
inet6 fe80::5ca0:4eff:fe9d:f3f2/64 scope link
valid_lft forever preferred_lft forever
3番に [br0] というブリッジインターフェイスができているし、元々 2番の [ens32] にあった IPアドレスも 3番の [br0] に移動しています。
とりあえず、ブリッジインターフェイスの設定はこれで良さげです。
2.ストレージブール作成
Web UIにログインします。
ログインすると言ってもユーザー証明書を使っているので、アカウント/パスワードの入力はありません。
Linuxシステムコンテナを作るにあたり、ディスク領域が必要ですので作ります。
左のメニューで [Storage] - [Pools] を選択し、Create poolを押します。
[Name] には任意のものを好きにつけます。
[Driver] はデフォルトで [ZFS] が表示されていて、説明にも「ZFSは最高!」と書いてありますので、そのままにしました。
[Size in GiB] がギガバイト単位のストレージのサイズで、とりあえず 5GBにしておきました。
Createを押します。
これがストレージのでき上がりの画面です。
実際にこのストレージが置かれているのはデフォルトでは
[/var/snap/lxd/common/lxd/disks]ディレクトリとなっています。
3.プロファイル作成
Linuxシステムコンテナを作る時の設定の雛形であるプロファイルを作ります。
デフォルトで [Default] というプロファイルがあるのですが、どうもこのプロファイルを使うとこちらの絵の形になるようです。
これだと困るので、これから作成する Linuxシステムコンテナが、上で作った [br0]ブリッジインターフェイスに接続されるようにするため、そのネットワーク設定を持ったプロファイルを新規で作ります。
左のメニューで [Profiles] を選択し、Create profileを押します。
[Profile name] は任意のものを好きに付けられるので、「やったねパパ!」的なものにしました。
このプロファイルを使った場合、[LinuxSystemContainer]ストレージが使われるようにします。
[Main Configuration]列メニューから [Devices] - [Disk] を選択するとこのような画面に成りますので、鉛筆マークをクリックします。
[Pool]行に先程作った [LinuxSystemContainer] を選択します。
本当はこの次に [Network] の設定をしたいのですが、後述の事情でできないので、このままCreateを押します。
これがプロファイルのでき上がりの画面です。
でもって、プロファイルにネットワークの設定ができていないんですが、単に WEB-UIだとこれからやる設定ができないからなのです。
バージョンアップしていくうちにできるようにしてくれるかも知れませんが、できないものは仕方ありません。
以下の通り lxcコマンドでやることになります。
[HomeLAN]プロファイルを使った Linuxシステムコンテナの [eth0]インターフェイスは [br0]ブリッジインターフェイスに接続される
という設定をしています。
subro@UbuntuServer2204-1:$ sudo lxc network attach-profile br0 HomeLAN eth0
何も出ませんが、できている模様。
[HomeLAN] をクリックします。
[Configration]タブを選択し、メニューから [Network] を選択するとこの画面になります。
[eth0] ができています。
この設定のおかげで、このプロファイルを使って作った Linuxシステムコンテナには [eth0]ネットワークインターフェイスが付与され、これが [br0]ブリッジインターフェイスに接続されるのです。
これでやっと Linuxシステムコンテナ作りの準備ができました。
4.Linuxシステムコンテナ作成
やっとこコンテナを作ります。
左のメニューで [Instances] を選択し、Create instanceを押します。
[Instance name] は適当に好きなものを付けられますが、これがマシン名になります。
Browse imagesを押します。
作れるコンテナの一覧が出ますので、好きなものを選んでSelectを押します。
色々ありますけど、Ubuntuは古いのだと 16.04がありました。
[Profiles] に上で苦心して作った [HomeLAN] を選び、Create and startを押します。
初回のみコンテナのイメージをダウンロードするのでちょっと時間がかかるようです。
一度ダウンロードするとキャッシュされて次回からは早くなるんでしょう。
[STATUS]列が [Running] になったら、もう動いています。
[Container1] をクリックします。
[IPV4] のには、ウチの光ルーターで動いている DHCPサーバーから貸与されている IPアドレスが割り振られているあたり、ちゃんと家庭内LANに繋がってそうな雰囲気。
[Terminal]タブを選ぶと、[root]ユーザーでログインした状態のコマンドプロンプトが使えます。
==========
ちょっと長くなってしまったので、問題なく使えるのだろうか?という疑問を残しつつ一端ここで切ります。
「Linuxシステムコンテナ(LXD) 3」に続きます。