ubuntu 24.04 LTS LXDの仮想環境(コンテナ)をホストと同じLANに公開

最終目標の画面。やりたいことはこんな感じ

  • 192.168.1.0/24(仮)なLANにつながってる各マシンからアクセス出来る仮想環境(コンテナ)をつくりたい
  • .netとnginxとPostgre SQLを入れてPleasanterを動かして各PCから使いたい

たったこれだけというか、よくあるシチュエーションだと思うのだが、これが相当に紆余曲折あって、1ヶ月以上悩みに悩んで調べまくって、最終的に自分の直感でやったらやっと出来たという(苦笑)。つぎやるときの自身のためにメモっとく。

// FreeBSDに始まりいまはubuntuとそれ系のOS歴はそこそこに長いのだが、自身に必要なところしか使わんし勉強しないし覚えないし(苦笑)で、特に必要に迫られなかったのでLXDとかDockerとか仮想環境を触らないままにしていたツケだろうなぁ。うん。仕事の合間に改めて調べながらだったのもあってかなり時間がかかった //

incusではなくて素直にLXDでやる

実機のubuntu serverには固定IPを割り当ててcockpitを入れている(仮に192.168.1.10とする)。なのでKVMでさくっと仮想マシンがつくれるのでそれでやれば簡単なのだが、うちのubuntu serverのmini PCではちょいと重い感じ。KVMの仮想マシンよりもっと軽くしたい。かといってDockerで.net + nginx + Postgre SQL + Pleasanterという環境をつくるのはさすがに面倒というかメリットを感じない。

そこでLXDかLXDからフォークしたincusかという話になる。ならばこれからはincusが主流になる?だろうからとincusでやってみようとincusとしばらく格闘したあと、現時点では諦めた(苦笑)。LXDに比べて情報が少なすぎなのと、うちの環境ではどうもうまく動いていないっぽい。たとえばweb UIも用意されていてInstallしてみるのだけれど、なぜかincus-uiではなくLXD-UIが起動してしまう等々、うちでは細かいところがあれこれうまくいかない。少ない情報も実際やってみると間違っていたり(苦笑)。あれこれ試した後、結局現時点ではincusの情報がまだ少ないってことでまずは素直にLXDでいこうと決めるまでに3週間かかった(あほ)。

LXDはLXDですんなりとはいかなかった(苦笑)

incusと違いLXDはさすがにあれこれ情報がnetに上がってるし、参考になる書籍も何冊か手元にあったので、さくっと行くだろうと思ったら、これもすんなりとは行かず(苦笑)。

  • ネットの情報や書籍に書いてあることが古かったり、中途半端だったり
  • 特にネットの情報については正しいことが書いてあるとは限らず、それぞれの考え方や方針で解説してあったりして、悩む原因になったりした

LXDコンテナのネットワーク設定

私の場合、LXDホストマシンは固定IPでcockpitが動いている。そこにLXDのコンテナをつくってubuntu serverをInstallして.net + nginx + Postgre SQL + Pleasanterという環境をつくってLANに公開したいのでこちらにもホストマシンと同じLANの固定IPを割り当てる必要がある。が、LXDはデフォルトではホスト上に「lxdbr0」というブリッジインターフェースがつくられて、その下にNATネットワークが作られる。たとえばホストが192.168.1.10な場合、lxdbr0がつくられコンテナを作ってubuntuをInstallするとデフォルトでは10.53.196.0/24とかなNATネットワークができてDHCPで10.53.196.2とかのIPが割り当てられる。このままではコンテナ側からは外にアクセスできるけれど、外からはコンテナ側にアクセスが出来ない。

これを私のやりたい状態にもってくのに、このあたりの情報が錯綜していて、正解を出すのに苦労した。やり方として多かったのはデフォルトの「lxdbr0」ブリッジインターフェースをそのまま使ってコンテナ内のubuntu(たとえば10.53.196.2)にルーティングするという方法。固定IPも10.53.196.0/24なネットワークで固定IPを割り当てる。いや、これだと設定がめんどいし、pleasanterを使うのもかなり面倒な設定になるよねぇ。

他のやり方を解説しているところとかも見つけたが、なんかスマートじゃなかったり、?な方法だったり。手持ちの書籍もあれこれひっくり返してみて、結局一番現実的で参考になったのが、たまたま別な事で参考にしたくて入手していた「Linuxをマスターしたい人のための実践ubuntu[第2版](秀和システム)」の「07.02.06 コンテナをネットワーク上に公開する」のmacvlanを使う方法だった。ふぅ。。。

LXDコンテナをネットワーク上に公開する(macvlanを使う方針にする)

ただし、書籍の内容をそのままやってもまるでうまくいかなかず、ここでも数日費やす(苦笑)。そもそもネットの情報や書籍の情報はubuntu 18.04だったり20.04だったり、LXDも3.0だったりだが、今はubuntuは24.04.3だしLXDは5.21.4だ。先述の当該書籍も解説自体はlxcコマンドなどでやれと解説しているが、今はLXD-UIがあるし、必要なコマンドや設定箇所など細かいところで微妙にいろいろ違ってたりする。

LXDのネットワークインターフェースとしてデフォルトなのはbridgeだが他にもmacvlanにも対応(他に2つあるがまぁあまり頻度はおおくなさそうなので割愛)。macvlanはホストマシンのネットワークインターフェースに異なるハードウェアアドレスを仮想的に複数わりあてるネットワークドライバーで、つまりbridgeではなくてmacvlanを使えばホストと同じネットワークにつなげられるって事。方針はきまった(やっと)。

LXDコンテナをネットワーク上に公開する(前提)

前提として、まずはubuntu serve(ホスト)を例によってapt updateとapt upgradeしておく。LXDのバージョンが最新になっていることも確認。LXD-UIを使えるようにしておく(このあたりはググればいくらでも解説が出てくるのでまるっと割愛)。LXD-UIを使えるようにするのに証明書とかの設定も必要になるが、それもググればいくらでも出てくるのでそちらを参照の事。前提ここまで。

あ、それと、macvlanはホストマシンのネットワークインターフェースを仮想的に共有している都合上、ホストマシンとコンテナは直接ネットワークがつながらなくなる(ホストマシンでコンテナのIP叩いてもつながらない、その逆も)。でもホストマシンの操作はcockpitでネットワーク上の別なPCからだし、LXD-UIも同じく別PCから操作、設定が無事終わった後のPleasanterももちろん別なPCで使うので、この場合、実害はなにもない、ということも前提。

なのであちこちや書籍などの説明でよくあるlxc listでみるとbridgeネットワーク(eth0)とは別なネットワーク(ethr1とか)がある状態をつくる必要もなく、macvlanだけでいい。

LXDにmacvlanなネットワークを作る

まずはLXD-UIにてmacvlanネットワークを作る。左メニューから「Networks」を選ぶとこんな画面。

右上の緑の部分「+ create network」をおす。

ここでmacvlanなネットワークを作る。

Type:Macvlan
Name: eth4(自身でわかりやすく他と判別出来ればいい)
Description:(設定しなくてもいいし、なにか分かりやすい説明書いても良い)
Parent:(ドロップダウンからホストマシンのethernetインターフェースを選択する)(wi-fiは使えないので注意)
MTU:
VLAN id:
GARP Registration:

で、右下の「Create」を押すとmacvlanが用意される。戻った画面で「eth4」「Macvlan」の行があるのを確認。

macvlanを使うLXDコンテナプロファイルを用意する

LXD-UIの左のメニューから「Profiles」を選び、右上の緑の部分「+Create profile」を押して新しいプロファイル(仮想マシンのスペックなど)をつくる。

詳しいプロファイルの作り方はググればいくらでも出てくるので、ここではmacvlanの時の要点だけ。つまりはmacvlanなネットワークを使う仮想マシンを用意する場合デフォルトのプロファイルではなくて専用のプロファイルを用意してそれで立ち上げるようにする。「Profile name」はたとえば私は「macvlan-use」とかにして分かりやすくした。

ついで「devices」→「Network」とすすみ「+ Attach network」を押す。

「Device Name」は自動で入っている状態のままでOK。大事なのは「Network」の方で、先ほど用意したmacvlanの「eth4」を選ぶ。

他、CPUやMemory、Diskなどなどを自身の望む設定(必要な設定)をしたあと右下の「Create」を押すと新しいプロファイルが出来る。

インスタンスのプロファイルを、用意したmacvlan用のプロファイルを指定して作る(切り替える)

既にインスタンスを作ってあれば下の画面ショットの「Profiles」の部分をmacvlanを使うプロファイルに切り替えて起動しなおすだけ。

これから作る場合でも同じくmacvlanを使うプロファイルを指定して作るだけ。

起動したあと、ホストマシンでlxc listコマンドでも良いしコンテナのubuntuでip aコマンドでもいいので、ネットワークを確認。DHCPでホストマシンと同じネットワークのIPがふられているのが確認出来ればOK。

固定IPを割り当てる-準備

macvlanでホストマシンと同じネットワークにつながっていることを確認出来たら、serverとして使うために固定IPアドレスにする。

やり方は同じネットワークの別なマシンからSSHでもいいし、LXD-UIを使ってもいいが、ここではより簡単なLXD-UIを使う。

LXD-UIにて起動しているインスタンスの「Overview」を再度確認

先に「Netwoks」の項目を見ると(先述の例の場合)

NAME: ethr4
INTERFACE: etc-1
TYPE;macvlan(managed)
Mac ADDRESS(xx:xx………..)

とかになっていて無事macvlanを使っている事が確認出来る。で、次がややこしいといいうかわかりにくかったのだが「General」のところを確認。

「IPv4」のところを見て欲しい。コンテナのubuntu的には先の説明で作ったeth-1とかになるのかなとか思ったら「eth0」だ(プロファイルでmacvlanを1つだけにしてあるのでそうなるのかも)。なので、固定IPアドレスを割り当てる設定をするのは「eth0」について、だ。

固定IPの設定はコンテナのubuntuにnetplanでする。起動している状態で「Overview」から「Terminal」もしくは「Console」タブに切り替えるとTerminalもしくはConsole画面になる(素の状態のままではrootユーザしかいないのでsudoが使える普段使うユーザを作ってそれで操作をする。既にユーザを作ってあればそれでよし)。ちなみにConsoleは「Graphic」と「Text console」と選べる。どっちでも良いw

一応すべて試してみたがTerminalが一番安定して使えるようなので私はTerminalで作業した。それにしてもLXD-UIがあると同じネットワーク内ならホストにさえアクセス出来ればsshとかせんでもさくっとコンテナ内のubuntuを弄れるんで圧倒的に楽です :-)

固定IPを割り当てる-コンテナ内のubuntuでの作業

コンテナのubuntuだが、まずは例によって例のごとくsudo aptupdateとsudo apt upgradeをしておく(私は最小限のubuntuイメージをいれたので、デフォルトではnanoすらない状態だったので、nano(意地でもvi使わない私)とか他必要なものを予めここでInstall)

通常のubuntu serveと同じようにネットワークの設定を追加する。

とかすると「50-cloud-init.yaml」が一つだけあるのでこれをリネームしておく。

「/etc/netplan/99-eth.yaml」とか頭に50以上の数字のついたyamlファイルを用意する

先述の例では内容はたとえばこんな感じ。ホストマシンが192.168.1.10/24なのでコンテナのubuntuはたとえば192.168.1.11とする(自身の環境にあわせて)。(注意行頭のスペースの個数とかちゃんと合わせないとエラーになるので注意。インデントにはスペース2個とかで合わせるのが一般的?)。

ここで注意するのはこれも先述したとおり「eth0」にすることだ。作ったらすぐに反映させてみたいところだがもうちょい我慢。netplanのyamlファイルはroot以外には開けないファイルでないとエラーになる。ので、オーナーと権限を変更する

ネットワーク設定を反映させる

ホストマシンでlxc listでも良いし、コンテナのubuntuでip aでも良ので設定したipアドレス192.168.1.11/24になっていることを確認。念のためコンテナ側からと外側からそれぞれpingを通して確認。ホストマシンにもPingを通してどちらもLANから使えることを確認。OK(^^)

わかってしまえば簡単。しかしこのやりかたを説明しているところは私が探した限り皆無・・・私の方が何か間違っているのか?とちょっと不安にもなるが、使えてるし、設定もどの説明より簡単でシンプルなので、とりあえずこれでよしとする。ふぅ。。。(しっかしincus使えなかったのは悔しいなぁ。。。)

目的のPleasanter入れて起動して再々確認

一応書いておくとPleasanterをInstallするにはPleasanter.zipファイルをダウンロードしてunzipする必要がある。私の場合はMac mini M4でダウンロードしてQNAP NASの共有フォルダにUPし、コンテナ内のubuntuにcifs-utilsをinstallしてsambaでQNAP NASの共有フォルダをマウントして持ってきた。まぁ方法は他にいくつもあるが私の場合というかうちの環境の場合今後もNASのフォルダを使うので、これをデフォルトで。

あとはPleasanerのInstallマニュアル通りにInstallを進めるだけ。

どれどれ。。。コンテナ内のubuntuのIPアドレス(先述の例だと192.168.1.11)でネットワーク内のmac mini M4のブラウザとかで開けばいいだけだが・・・

無事アクセス出来ましたね。ログインしてみる

無事使えるようになりました(^^ 目的達成。ふぅ。。。

ちなみにこの状態でもホストマシンの192.168.1.10にCockpitでアクセスすることも、LXD-UIを開くことも、LXD-UIでコンテナのPleasanterを入れたubuntuのterminalを開いて弄ることももちろん出来ますし、同じLAN内のServerってことになってるので、たとえばホストマシンと同じようにUPSの信号もらって安全にシャットダウンすることも出来るっすね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントは日本語で入力してください。(スパム対策)

CAPTCHA