はじめに
本サイトの自宅サーバーではPodman+Quadletでコンテナを運用する構成を採用しています。このシリーズでも、Apacheをパッケージから直接インストールするのではなく、Podmanコンテナとして構築します。コンテナにしておくことで、後片付け(削除)や複数バージョンの試行が容易になります。
1. 詳細な技術要素
| 用語 | 説明 |
|---|---|
| Podman | Dockerと互換性のあるコンテナ実行エンジン。デーモン常駐が不要で、rootlessでも動作する。 |
| -p 80:80 | ホストのポート80を、コンテナ内のポート80に転送する設定。 |
| -v(ボリュームマウント) | ホスト側のディレクトリをコンテナ内に見せる仕組み。今回はコンテンツ(HTMLファイル)をホスト側で管理するために使用。 |
| --restart=always | コンテナが異常終了した際にPodman自身が再起動するオプション。ただしOS自体の再起動には別の仕組みが必要(後述)。 |
| UFWのrouted(転送)ポリシー | ホストを経由して他の宛先へ転送される通信を許可するかどうかの設定。コンテナのポート公開はこの転送処理を経由する。 |
2. 実証手順
Podmanをインストールする
sudo apt install -y podman
podman --version
実機ではPodman 5.7.0が導入された。buildah・netavark・aardvark-dns等の関連パッケージも自動的に入る。
Apacheコンテナを起動する
sudo podman run -d --name apache-web --restart=always -p 80:80 docker.io/library/httpd:latest
sudo podman ps
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
b99aaeeaf8ae docker.io/library/httpd:latest httpd-foreground Up 0.0.0.0:80->80/tcp apache-web
ファイアウォールでポート80を許可する
sudo ufw allow 80/tcp
curl -I http://localhost/
サーバー自身からのcurlでは200 OKが返るが、LANの他のPCからは繋がらなかった。原因は次章参照。
独自のトップページを表示する
mkdir -p ~/apache-content
cat << 'EOF' > ~/apache-content/index.html
<!DOCTYPE html>
<html><head><title>My Page</title></head>
<body><h1>Hello from Podman + Apache</h1></body></html>
EOF
sudo podman rm -f apache-web
sudo podman run -d --name apache-web --restart=always -p 80:80 \
-v ~/apache-content:/usr/local/apache2/htdocs:Z \
docker.io/library/httpd:latest
ホスト側の~/apache-contentフォルダにHTMLファイルを置くだけで、コンテンツを更新できるようになる。:ZはSELinux/AppArmor環境向けのラベル付けオプション(つけておくと安全)。
OS再起動後も自動復旧するようにする
sudo systemctl enable --now podman-restart.service
sudo systemctl is-enabled podman-restart.service
--restart=alwaysはコンテナ単体の異常終了時の再起動を担うだけで、OS自体の再起動後にコンテナを立ち上げ直すのは別の仕組み(podman-restart.service)が必要。実機で実際に再起動し、このサービスを有効化していればコンテナが自動復旧すること、有効化していなければ復旧しないことの両方を確認した。
3. トラブルシューティング
サーバー自身からはアクセスできるが、LANの他のPCから繋がらない
原因:UFWの転送(routed)ポリシーがDROPになっており、外部から来てコンテナへ転送される通信がブロックされていた。/etc/default/ufwのDEFAULT_FORWARD_POLICYで確認できる。
sudo sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw
sudo ufw reload
実機でこの変更後、LANの別PCから正常にアクセスできることを確認した。UFWを有効化した状態でPodman/Dockerのコンテナを公開する場合、必ずこの設定を確認すること。
OS再起動後、コンテナが起動していない
解決策:--restart=alwaysを付けていても、podman-restart.serviceが無効(disabled)だと再起動後には反映されない。sudo systemctl enable --now podman-restart.serviceで有効化すること(実機では初期状態でdisabledだった)。
4. まとめ
Podmanコンテナ形式でApacheを構築しました。ポイントは、①UFWの転送(routed)ポリシーがコンテナの公開ポートに影響すること、②--restart=alwaysだけではOS再起動後の自動復旧は保証されずpodman-restart.serviceの有効化が別途必要なこと、の2点です。