🍆

proxmoxのVMにDocker乗せるまで

に公開

これは何?

proxmox上にDockerのホストになるUbuntuをインストールする方法まとめ
特にPortainerが便利なのに仲間内で知られてなかったのがショックだったため作成した。
べんりだからもっと使って広まって

やることの流れ


proxmoxのインストール

proxmox1

  • Graphicalを選択。
    CUIで行うと正しくオプションを設定しているのに
    インストールに失敗することがあるため、
    凝ったことをするならGUIで行いましょう。
    proxmox2
  • I agreeを押す。

インストールオプション


proxmox3

デフォルトの改変

ホストとゲストイメージ、LXCを同パーティションで管理し、ボリュームグループを分ける場合
OSインストール後はWebUIデータセンターからストレージ管理にて編集が可能。

hdsize	: 最大
maxroot	: proxmox本体の容量を割り当て(8~)
	: 無し 

別パーティションで管理する場合

この場合、OSインストール後pvcreate -> vgcreate -> lvcreate
ホストシェルにて手動で行い、ゲストイメージのボリュームを作成する必要がある[1]

hdsize	: proxmox本体の容量を割り当て(8~)
swapsize: 適宜。4GBでは心もとないイメージ。
	: 無し 

ぜんぶ一緒

この場合、ゲストイメージ、LXCのストレージを別途用意する、
もしくはraw,qcow2ファイルでの管理となる。

hdsize	: 最大 - swap
swapsize: 適宜。4GBでは心もとないイメージ。
	: 無し 
  • 全般 - そのままNext
  • 地域設定
    proxmox4

jを入力してjapanをクリックすると自動で設定されるのでNext

  • パスワード
    ユーザー名はrootで固定のため、root用のパスワードを設定する。
    EmailはLinuxの風習のようなもの。そのままだとNextにいけないので
    a@b.comなど、できれば通じるメールアドレスを設定。
  • ネットワーク
    proxmox-net

この時点でDHCPからIPを受け取っていれば自動で入力されている。

Hostname	: そのサーバーがバックアップを取るときに使用される名前。
IPaddress	: 絶対に固定IPとなるので被らないものを入力
Gateway		: いわゆるルーターIP
DNSserver	: 名前解決が出来ないとproxmoxはかなり不安定になり、
		 VM,LXCを見えなくしてしまうことがあります。
  • Summary

設定再確認の場。 IP CIDRは必ず被っていないことを確認 (2敗)
問題なければinstallで勝手に再起動してWebUIのアドレスが表示される。

proxmoxインストール後の初期設定

その後はシェルで以下を叩いても良いし、WebUIでアップデートを行っても良い。

shell
sudo apt update
sudo apt -y upgrade

オプション

Proxmox VE Helper-Script[2]にて
上記 +「有効なサブスクリプションがありません」ダイアログ
を消すことのできるスクリプトが公開されている。
https://community-scripts.github.io/ProxmoxVE/scripts?id=post-pve-install
proxmoxホストのシェルにてHelper-Scriptを実行すると疑似GUIで案内される。
最後の質問はproxmoxを再起動するため、問題があれば最後はnoとする。
スクリプト制作者的には全てyesを選択することを推奨しているようだ。

shell
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/tools/pve/post-pve-install.sh)"

isoファイルのダウンロード

VM作成前に行うこと。
Windowsの場合はvirtio-win.isoのダウンロードも忘れずに。
2種類方法がある。

  • NASに保存しているisoを読みに行くか
  • proxmoxのローカルに保存する方法か

NASに保存

proxmox-NAS
データセンター -> ストレージ -> 追加を押し、SMB/CIFSを選択。
VM作成-iso

id		: なんでも良い
サーバ		: NASIPアドレス
ユーザ名	: NASのアカウント
パスワード	: NASのアカウント

ここまで入力するとShareを選択できるようになる。

内容		: ディスクイメージとコンテナ以外をおすすめする。
		 NASに保存されたイメージディスクは、
		 VM起動時にシンクライアントじみた遅さを発揮する。

サブディレクトリ: proxmoxは内容で選んだものに応じたフォルダを
		 複数展開するため汚れるのが嫌であれば`/pve`などを設定。

proxmox-NAS2

ローカルに保存

proxmox-upload

データセンター下部ツリーのlocal -> ISOイメージ -> アップロード
ファイルを選択し、アップロードを押すことでisoファイルをproxmoxへコピーできる。

VM作成 & Ubuntuインストール

右上水色のVMを作成からウィザードが開始される。
画像では25.04だが、ROCmなどAMD関連を使用する場合は24.10までに抑える必要がある。
Dockerホストは何でも良い風潮があるが、メンテナンスしやすいUbuntuを選択した。
Dietpiで運用していたがカーネルの問題で乗り換えた。

  • 全般
    VM作成-全般
VMid		: 今後proxmoxサーバーを追加することがあれば、
		 全てのサーバーと重複しない番号を割り当てる必要がある。

名前		: 自分がわかるようにつける。
		 日本語、アンダーバー、スペースは使用できない。

ブード時に起動	: proxmoxが起動するときに一緒に起動されるオプション。
開始停止順	: 1にすると真っ先に起動し、
		 最後まで残ってからシャットダウンされる。
  • OS
    VM-os
イメージファイルを使用	: 先の手順でNASを選んだ場合、
			 ストレージはNASの名前。ローカルの場合はlocal

isoイメージ		: インストールするOSのイメージ。
ゲストos		: Windowsの場合は種別、バージョンを変更し、
			 virtIO-win.isoも選択しておくこと。
  • システム
    VM-sys
グラフィックカード	: 既定で良い。もしパススルーするにしてもPCIデバイスのドライバが無いため初期インストールは既定で進めたほうが安定する。
マシン			: 古いOSならi440、最近のならq35。どちらもインテルのマシンを仮想化している。
ファームウェアbios	: 古いOSSMBIOS、つまりBIOSでないと起動画面にすら行けない。最近のOSであればOVMF(UEFI)で良い。Windows10以降はUEFIscsiコントローラ	: SCSI singleが最も高速
Qemuエージェント	: チェックを入れておくとWebUIでIPアドレスが見れたりする。
  • ディスク
    Dockerインストールのため、VMホストが壊れてもなんとかできるよう、SATA1を追加して/var/libをそこに保存する設定にしている。
    ディスク作成時は少しだけ容量を変えると後のインストール時に分かりやすい。
    VM-disk
バスデバイス		: SATAが良いかと。
ストレージ		: proxmoxホストと同じマシンのプールを選択すること
ディスクサイズ		: 32GBだと心もとない。64GBは必要かと
キャッシュ		: unsafeが最速。但し停電時にproxmoxも不調になるがVMもロールバックしたり不調になる。また公式ではWrite back(unsafe)を使う場合はext4 barrier ON(デフォルト)を推奨している。もちろんOFFにすると速度は上がる。
ssdエミュレーション	: SATA/NVMeのSSDであればONにすると高速。
非同期io		: threadsが良いらしい

ディスク周りの参考:
https://qiita.com/disksystem/items/b18412a69fdbf2fac0fc
https://pve.proxmox.com/wiki/Performance_Tweaks

  • CPU
    基本的にはソケット1、コア=スレッド数。但しMacOSの場合は1,2,4,8のどれかとコア数に制限がある。
    VM-cpu
種別		: 基本的にはhostが安定。もし動かない時は対応する
		 Skylake以前のCPUを指定する。
cpuの上限	: 何%まで使用するかを制限できる。
extraCPUFlags	: 基本はAuto。
		 Spectreなどのマイクロコード機能を使用するかどうか。
  • メモリ
    VM-mem
    メモリに最大容量、最小メモリに最小容量を追記する。
    Ubuntu24.04以降は最大6GBは無いとOut of Memoryとなってしまう現象が
    あったため6144MiBとしている。
  • ネットワーク

MACアドレスにはproxmoxのベンダIDが割り振られる。好きなMACアドレスに変更する場合は追記

  • 確認
    問題なければ完了。
    左下に設定反映後自動起動するオプションが有る。

Ubuntuのインストール

Ubuntu-init

  1. VMを起動したらVM名 -> コンソールから画面を見ることができる。
    Try or Install Ubuntu ServerのままEnter
    Ubuntu-language
  1. Type of installation:
    Ubuntu-mini
    UbuntuServerは後からminimizedを解除できるため、最初はminimizedを選択した。
  2. archive mirror:
    Ubuntu-mirror
    通信が終わってからDoneを押したほうが後々楽。
  3. Guided storage configuration:
    Ubuntu-storage1
    /var/libを別ディスクにインストールしたいためCustomを選択。
    24.10まではLVMにチェックが入ってなかったはずだが、
    25.04からはデフォルトがLVMボリュームインストールになる。
    VM上でLVMの復旧は困難を極めるためチェックを外しておくと楽。
  4. Storage configuration
    Ubuntu-storage4
    Ubuntu-storage2
    Add GPT Partition -> 設定 -> Createを繰り返す流れ。

分かりづらいのでVM作成時にそれぞれの容量を少し変えてやると分かりやすい。

  • 25.04の場合、/bootを明示してやらないと先に進めない。
    1GBでいいのでroot側にしたい方でCreate
    Ubuntu-storage3
    同じディスクで/を指定してCreate
    Ubuntu-storage5
  • 次に/var/libに設定したいディスクを選択し、
    下のMount:/var/libにしてCreate

Ubuntu-storage6

すべての設定が済めばDone -> Continue

  • Profile
    Ubuntu-name
    以下を入力

    • お名前
    • サーバー名(avahi,mDNSで使用)
    • ユーザー名(ログイン時に使用)
    • パスワード(ログイン時に使用)
    • 確認のパスワード
  • SSH
    Ubuntu-ssh
    デフォルトでOFFとなっているのでにする。
    下のImport SSH Keyを利用すると画像のようになりGithubから取得できる。
    但しAllow password ~が外れ、公開鍵認証しかログインできなくなるので
    を付け直してDone

  • Featured server snap
    Ubuntu-3rd
    文字通りsnapを利用したサードパーティのインストール。

  • Installation
    Ubuntu-install
    Reboot Nowの表示が出るまでしばらく待ち、Enterを押すことで再起動される。
    Ubuntu-prereboot
    再起動前にcdromがアンマウントできないって言ってくるので、
    Ubuntu-Reboot2
    proxmoxのWebUIからVM名 -> ハードウェア -> CD/DVDドライブ
    「メディアを使用しない」に変更し
    改めてコンソールからEnterを押す。

Ubuntu初期設定

VM shell
sudo apt update
sudo apt -y upgrade

LiveInstallerなので恐らく爆速で完了する。

proxmox VMではqemu-guest-agentを入れることで
とてつもなく読みにくいWebUIのIPアドレスを読まなくても
サマリーで見やすくなる。

VM shell
sudo apt -y install qemu-guest-agent
sudo qemu-ga &

もしsshd_configを弄るのであればこの時に触っておくと楽。
(US/UKキーボードでは日本語109キーボードのShift+=で_が打てる。
/etc/sshd入力後Tabキー押したほうが楽。)


ここからはSSHで操作している。
キーボードレイアウトがJPに対応していないので面倒だから。
Windowsの民なのでrlogin.exeを使用している。

Dockerと周辺のインストール

Dockerのインストール

VM shell
curl https://get.docker.com | sudo sh

なにも表示されないまま止まるが、パスワードを入力すると進む。
(SSHにログインしてすぐに、nanoやらvimやらemacsやら
好きなアプリをインストールしてから行うとスムーズ。)

参考:
https://github.com/docker/docker-install

docker-composeのインストール

dockerのインストールとdocker-composeのインストール。
(当時はv2.38.2が最新版。latestで引っ張ってきたいね。無いけど。)

VM shell
COMPOSERVER=2.38.2
sudo wget -O /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/v$COMPOSERVER/docker-compose-linux-x86_64

※上の1行だけ先に行い、以下はコピペで連続行処理できる。

VM shell
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v

sudo usermod -aG docker $USER
sudo service docker restart

参考:
https://github.com/docker/compose
https://qiita.com/ryokwkm/items/f7fc5f481cd9863b55bd

Portainerのコンテナデプロイ

Portainerは他のホストと接続する時に
ポート番号を弄ると面倒なことになるのでデフォルトが使い易い。
他のホストと連携して1つのWebUIで複数のホストを管理できるようになる。

VM shell
sudo docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:lts

後は以下のサイトのようにWebUIからアカウントを作成して使用する。
https://docs.portainer.io/start/install-ce/server/setup
URLは

https://192.168.<IP>:9443

portainer-init

デフォルトでadminとなってるが好きに変えて良い。
アカウントを作ったら英語でなにやら言ってるので、portainerコンテナを再起動する。

VM shell
sudo docker restart portainer

Portainerの使い方

  • get startを押して
    見るからにココっていうデカいクジラのマークを押す
    すると今動いているDockerの管理画面に出る。

よく使う項目

  • Containersを押して各コンテナの操作が可能となる。
    もし表示されない時はStacksから該当のコンテナを選択すれば表示できる。
    (なぜ表示されたりされなかったりするかは不明。)

Container details

portainer-detail

  • Start,Stop,Kill,Restart,Pause,Resume,Removeは見たまんま。
  • Recreateはdocker exec等で弄りすぎたときに作り直すやつ。
  • Duplicate/Editはdocker-compose.yamlを弄らなくてもお手軽にWebで完結した設定が可能。
    お手軽にlatestバージョンのイメージをpullするときにも使う。
    但し、設定は控えておかないと後々で何やったか忘れて復元できなくなる。(6敗)

Container status

Logs

dmesgとはまた異なる?感じのログを見ることができる。
どうやってlogに出力してるのかは分からない。
linuxserver.ioのイメージが詳細に教えてくれるため愛用している。

inspect

コンテナの設定が確認できる。docker-compose.yamlを作るときの参考にできる。
大体はどのポートに設定したか忘れたときに見る項目。

stats

まるでVMのようにどれだけリソースを使ってるか確認できる。
異常に帯域を食ってる時に確認する項目。

✨️console✨️

🎉超便利機能🎉
>_を押すとConnectと出るので押すとDocker内の環境に9割方入ることができる。
apt updateなりapt installなり好きに動かせるが、コンテナを作り直すと消えるので
やったことはメモに書き残してDockerfileに整形してないと泣きを見る羽目になる。(20敗以上)


images

portainer-images

  • 一番使うのは下部の使っていないイメージを一目で分かる機能。
    Unusedなidのイメージを付けてRemoveするだけで簡単にストレージの整理ができる。

  • あらかじめコンテナイメージをpullできたりする。

  • tarで包まれたコンテナイメージもimportで操作ができるようだ。(使ったことはない。)

  • exportではブラウザにコンテナイメージをダウンロードするので容量には注意。
    内容はtarで包まれたイメージ。

他のDockerホストとの連携

一つのUIでまとまるから便利。
portainer-connect1

  • 左側Environment-relatedからEnvironmentsをクリック、右上 + Add environmentを押す。

  • 通常のDockerであればDocker Standaloneを選択。環境によってチェックボックスを変える
    下のStart Wizardをクリック。
    portainer-connect2

  • どの方法で接続するかのチェックボックスはデフォルトのAgentにしている。
    これはportainer agentコンテナを追加する方法。
    すると下部にコマンドが表示されているのでこれを此方側、相手方の両方で入力する。
    portainer-connect3
    終わったら分かりやすい名前で相手方の名前を付けて、
    Environment address<相手方のIP>:9001を入力する。
    するとConnectが押せるようになるので押したらHomeに追加される。

あとがき

長い作業お疲れ様でした。

脚注
  1. lvcreateの設定例lvcreate -T -n thin --poolmetadatasize 1024M --chunksize 256 --addtag base -l 100%FREE pve
    参考:
    https://qiita.com/minoden_works/items/ecd8d4d7d767917409f2 ↩︎

  2. このサイトには他にも簡単にLXCコンテナ、VMを作成できるスクリプトがあり、お世話になっている。
    スクリプトのインストール初回はproxmoxホストで行う必要がある。
    Upgradableなスクリプトはコンテナ/VM内部でインストールスクリプトを実行することで自動でアップデートができる。
    特にTailScaleを使う場合は使いたいゲスト内部でスクリプトを動かすだけで簡単にインストールができるようになっている。 ↩︎

Discussion