お金をかけずにサーバーの勉強をしよう

Linuxシステムコンテナ(LXD) 2

2025年4月2日

メニューへ戻る

LXDの Web UIを使って実際に Linuxシステムコンテナを作ります。

Linuxシステムコンテナ(LXD) 1」で、LXDの Web UIを使えるようにしましたので、ここでは実際に Linuxシステムコンテナを作ってみます。


1.システムコンテナに LXDの外からアクセスできるようにしておく

Web UIにログインする前に LXDのネットワークがどうなってるかなんですが、どうも初期状態だと内部に独立したネットワークを持ってる感じで、外から繋げない模様です。
構成図 1

だけど私は Linuxシステムコンテナとして作ったサーバーを家庭内LANに公開して使いたいのです。

でも LXDのネットワークは LXDの中に閉じていて、コンテナや仮想マシン同士は通信できるものの、外からコンテナにアクセスすることができなさそうです。

私ようなニーズは普通にあるだろうと思って調べてみると、どうやらホスト側にブリッジインターフェイスを作ってそこにコンテナを繋げば良いようです。

強いて図にするとこんな感じで。
構成図 2

ホストのブリッジインターフェイスは 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を押します。
LXD WEB-UI 1

[Name] には任意のものを好きにつけます。
[Driver] はデフォルトで [ZFS] が表示されていて、説明にも「ZFSは最高!」と書いてありますので、そのままにしました。
[Size in GiB] がギガバイト単位のストレージのサイズで、とりあえず 5GBにしておきました。
Createを押します。
LXD WEB-UI 2

これがストレージのでき上がりの画面です。
LXD WEB-UI 3

実際にこのストレージが置かれているのはデフォルトでは
[/var/snap/lxd/common/lxd/disks]ディレクトリとなっています。


3.プロファイル作成

Linuxシステムコンテナを作る時の設定の雛形であるプロファイルを作ります。

デフォルトで [Default] というプロファイルがあるのですが、どうもこのプロファイルを使うとこちらの絵の形になるようです。
構成図 1

これだと困るので、これから作成する Linuxシステムコンテナが、上で作った [br0]ブリッジインターフェイスに接続されるようにするため、そのネットワーク設定を持ったプロファイルを新規で作ります。

左のメニューで [Profiles] を選択し、Create profileを押します。
LXD WEB-UI 4

[Profile name] は任意のものを好きに付けられるので、「やったねパパ!」的なものにしました。
LXD WEB-UI 5

このプロファイルを使った場合、[LinuxSystemContainer]ストレージが使われるようにします。

[Main Configuration]列メニューから [Devices] - [Disk] を選択するとこのような画面に成りますので、鉛筆マークをクリックします。
LXD WEB-UI 6

[Pool]行に先程作った [LinuxSystemContainer] を選択します。
本当はこの次に [Network] の設定をしたいのですが、後述の事情でできないので、このままCreateを押します。
LXD WEB-UI 7

これがプロファイルのでき上がりの画面です。
LXD WEB-UI 8

でもって、プロファイルにネットワークの設定ができていないんですが、単に WEB-UIだとこれからやる設定ができないからなのです。

バージョンアップしていくうちにできるようにしてくれるかも知れませんが、できないものは仕方ありません。

以下の通り lxcコマンドでやることになります。

[HomeLAN]プロファイルを使った Linuxシステムコンテナの [eth0]インターフェイスは [br0]ブリッジインターフェイスに接続される

という設定をしています。

subro@UbuntuServer2204-1:$ sudo lxc network attach-profile br0 HomeLAN eth0

何も出ませんが、できている模様。

[HomeLAN] をクリックします。
LXD WEB-UI 9

[Configration]タブを選択し、メニューから [Network] を選択するとこの画面になります。
[eth0] ができています。
LXD WEB-UI 10
この設定のおかげで、このプロファイルを使って作った Linuxシステムコンテナには [eth0]ネットワークインターフェイスが付与され、これが [br0]ブリッジインターフェイスに接続されるのです。

これでやっと Linuxシステムコンテナ作りの準備ができました。


4.Linuxシステムコンテナ作成

やっとこコンテナを作ります。

左のメニューで [Instances] を選択し、Create instanceを押します。
LXD WEB-UI 11

[Instance name] は適当に好きなものを付けられますが、これがマシン名になります。
Browse imagesを押します。
LXD WEB-UI 12

作れるコンテナの一覧が出ますので、好きなものを選んでSelectを押します。
色々ありますけど、Ubuntuは古いのだと 16.04がありました。
LXD WEB-UI 13

[Profiles] に上で苦心して作った [HomeLAN] を選び、Create and startを押します。
LXD WEB-UI 14

初回のみコンテナのイメージをダウンロードするのでちょっと時間がかかるようです。
一度ダウンロードするとキャッシュされて次回からは早くなるんでしょう。

[STATUS]列が [Running] になったら、もう動いています。
[Container1] をクリックします。
LXD WEB-UI 15

[IPV4] のには、ウチの光ルーターで動いている DHCPサーバーから貸与されている IPアドレスが割り振られているあたり、ちゃんと家庭内LANに繋がってそうな雰囲気。
LXD WEB-UI 16

[Terminal]タブを選ぶと、[root]ユーザーでログインした状態のコマンドプロンプトが使えます。
LXD WEB-UI 17


==========
ちょっと長くなってしまったので、問題なく使えるのだろうか?という疑問を残しつつ一端ここで切ります。

Linuxシステムコンテナ(LXD) 3」に続きます。