はじめに
本シリーズでは以前、Podmanコンテナ版のApache構築を紹介しました。Podmanは本サイトの他のサーバー(Rocky Linux・AlmaLinux)との一貫性を優先した選択でしたが、世の中で圧倒的に検索・利用されているのはDockerです。実際、Podmanの解説記事の多くも「Dockerとの比較」「Dockerの代替」という文脈で書かれており、Dockerが標準という位置づけは変わっていません。本ページでは同じApache構築をDockerで行い、Podman版との違いも記録します。
NOTE:Podman版との関係
Podman版のガイドは削除せず、比較・参考用に残しています。今後このシリーズで新しくコンテナを扱う際は、原則としてDockerを使用します。
1. 詳細な技術要素
| 用語 | 説明 |
|---|---|
| Docker | コンテナ技術のデファクトスタンダード。デーモン(dockerd)が常駐し、コンテナのライフサイクルを管理する。 |
| docker.io パッケージ | Ubuntuの標準リポジトリに含まれるDockerパッケージ名。公式Docker社のリポジトリを追加せずにインストールできる。 |
| DOCKERチェーン(iptables) | Dockerがコンテナのポート公開のために自分で書き込むiptablesのルール。詳細は次章のトラブルシューティング参照。 |
2. 実証手順
Dockerをインストールする
sudo apt install -y docker.io
sudo systemctl enable --now docker
docker --version
実機ではDocker 29.1.3が導入された。docker.serviceはインストール時点で自動起動有効(enabled)になる。
コンテンツを準備し、Apacheコンテナを起動する
mkdir -p ~/apache-content-docker
cat << 'EOF' > ~/apache-content-docker/index.html
<!DOCTYPE html>
<html><head><title>My Page</title></head>
<body><h1>Hello from Docker + Apache</h1></body></html>
EOF
sudo docker run -d --name apache-web --restart=always -p 80:80 \
-v ~/apache-content-docker:/usr/local/apache2/htdocs \
httpd:latest
curl http://localhost/
Podman版と違い、-vでマウントするディレクトリを事前に作成しなくても(Dockerが自動作成するため)動作する。ただし本ページでは分かりやすさのため事前に作成している。
3. トラブルシューティング(重要な注意)
DockerはUFWのルールを無視してポートを公開する
実機で確認した現象:UFWで許可していないポート(例:8081)でコンテナを起動しても、外部から普通にアクセスできてしまう。
# UFWには8081の許可ルールが無い状態で
sudo docker run -d -p 8081:80 httpd:latest
sudo ufw status | grep 8081 # → 該当なし
curl http://(サーバーIP):8081/ # → 200 OK(アクセスできてしまう)
原因:Dockerはコンテナ起動時に、UFWとは別に自分自身でiptablesのルール(DOCKERチェーン)を直接書き込み、UFWのフィルタリングより優先して処理してしまう。これはDockerの既知の仕様であり、バグではない。「UFWで塞いでいるから安全」という思い込みは、Dockerを使う場合は通用しない。
実践上の対策
最も確実な対策は、公開するつもりのないポートは-pで公開しないことに尽きる。外部に見せる意図のないコンテナは-p 127.0.0.1:8080:80のようにlocalhost限定でバインドし、意図した公開ポートだけを-p 80:80のように全体公開する、という運用を徹底すること。より厳密な制御が必要な場合は、Docker公式ドキュメントの「Docker and UFW」の項目にあるDOCKER-USERチェーンへのルール追加も検討する。
4. まとめ
Dockerを使ったApache構築自体はPodman版よりトラブルなくスムーズに完了しました。一方で、UFWによる保護を過信できないという重要な注意点が見つかりました。コンテナで公開するポートは、常に「これは本当に外部に見せてよいものか」を意識して選ぶ必要があります。