Webサーバー 一覧へ戻る トップUbuntu 26.04 LTSWebサーバー / Apache(Podman)
Ubuntu 26.04 LTS 構築ガイドシリーズ

Apache構築(Podmanコンテナ)

パッケージインストールではなく、コンテナでWebサーバーを動かす

対象:Ubuntu 26.04 LTS (Server) Podman 5.7.0

目次

  1. はじめに
  2. 詳細な技術要素
  3. 実証手順
  4. トラブルシューティング
  5. まとめ

はじめに

本サイトの自宅サーバーではPodman+Quadletでコンテナを運用する構成を採用しています。このシリーズでも、Apacheをパッケージから直接インストールするのではなく、Podmanコンテナとして構築します。コンテナにしておくことで、後片付け(削除)や複数バージョンの試行が容易になります。

1. 詳細な技術要素

用語説明
PodmanDockerと互換性のあるコンテナ実行エンジン。デーモン常駐が不要で、rootlessでも動作する。
-p 80:80ホストのポート80を、コンテナ内のポート80に転送する設定。
-v(ボリュームマウント)ホスト側のディレクトリをコンテナ内に見せる仕組み。今回はコンテンツ(HTMLファイル)をホスト側で管理するために使用。
--restart=alwaysコンテナが異常終了した際にPodman自身が再起動するオプション。ただしOS自体の再起動には別の仕組みが必要(後述)。
UFWのrouted(転送)ポリシーホストを経由して他の宛先へ転送される通信を許可するかどうかの設定。コンテナのポート公開はこの転送処理を経由する。

2. 実証手順

1

Podmanをインストールする

実行コマンド
sudo apt install -y podman
podman --version

実機ではPodman 5.7.0が導入された。buildah・netavark・aardvark-dns等の関連パッケージも自動的に入る。

2

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
3

ファイアウォールでポート80を許可する

実行コマンド
sudo ufw allow 80/tcp
curl -I http://localhost/

サーバー自身からのcurlでは200 OKが返るが、LANの他のPCからは繋がらなかった。原因は次章参照。

4

独自のトップページを表示する

実行コマンド
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環境向けのラベル付けオプション(つけておくと安全)。

5

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/ufwDEFAULT_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点です。

Webサーバー 一覧へ戻る