Docker 入門
さまざまな Web サーバを Docker Compose で構築する
nginx 単体の Web サーバを起動する
Docker Compose は複数の Docker コンテナを設定して連携させることができるツールです.YAML形式で記述した設定ファイルからコマンド一つですべてのコンテナを生成し起動させることができます.これによりローカルの開発環境で開発・テストしたサーバ環境をそのまま本番環境でも動作させることができるようになります.ここからのセクションでは nginx や Apache を使ってさまざまな Web サーバの環境を構築する例を通じて,Docker Compose の使い方を理解します.なお,このセクション全体のコードのサンプルは GitHub からダウンロードできます.全体のコードサンプルの中に各ページのコードがそれぞれのフォルダにまとめられています.このページのサンプルコードは web01Nginx フォルダで公開しています.
本題に入る前に,nginx や Apache を利用する前にそれぞれの特徴をまとめておきます.nginx は静的ファイルの配信,ロードバランサ,リバースプロキシ,API サーバなどでの利用に適しています.一方で Apache は .htaccess を活用した柔軟な設定が必要な場合や,PHP を直接処理したい場合に便利です.以下の表に主な違いを示します.
特徴 | nginx | Apache |
---|---|---|
アーキテクチャ | 非同期・イベント駆動型 | マルチスレド/マルチプロセス型 |
パフォーマンス | 高速・軽量.静的コンテンツに強い | 動的コンテンツに強いが,負荷が高いと遅くなる |
リバースプロキシ | 高性能なリバースプロキシとしても利用可能 | リバースプロキシ機能はあるが性能は劣る |
設定ファイル | シンプルで高速な構文 (nginx.conf) | 柔軟だが複雑な構文 (.htaccess など) |
動的コンテンツ処理 | 外部プロセス (FastCGI など) に委任 | モジュール (mod_php など) で直接処理可能 |
モジュールの扱い | コンパイル時に組み込み | 動的に追加・削除可能 |
メモリ使用量 | 少ない | 多め |
対応OS | Unix系,Windows(制限あり) | Unix系,Windows(広く対応) |
コミュニティとサポート | 活発で成長中 | 長年の実績あり,情報が豊富 |
用途の傾向 | 高トラフィックサイト,APIサーバなど | レガシーシステム,CMS (WordPress など) |
このページでは,下図のような nginx 単体の Web サーバからスタートします.
任意の名前の新規ディレクトリを作成し,docker-compose.yml という名前のファイルを設置し,その他いくつかのディレクトリとファイルを次の通り設置します.ただし,web/logs/access.log と web/logs/error.log は実行時に自動的に作成されるので,現時点では作成する必要はあります.また,tree は Bash で利用可能なコマンドです.
% tree -a -F ⏎
./
├── docker-compose.yml
├── nginx/
│ └── conf.d/
│ └── default.conf
├── Readme.md
└── web/
├── html/
│ └── index.html
└── logs/
├── .gitignore
├── access.log
└── error.log
6 directories, 7 files
全体の設計図である docker-compose.yml には次のような内容を記述します.ここでは2行目以下で nginx というサービスを定義し,そのコンテナには nginx1 というコンテナ名を設定しています.
docker-compose.yml
services:
nginx:
image: nginx:latest
container_name: nginx1
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./web/html:/var/www/html/
- ./web/logs:/var/log/nginx
nginx/conf.d/ というディレクトリを作成し,その中に default.conf とういうファイルを作成します.
nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html/;
location / {
index index.html index.htm;
}
}
Web ページのコンテンツは web/html/ ディレクトリの中に設置します.トップページは index.html とし,その他にも任意のファイルを設置するとよいでしょう.
web/html/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>nginx</title>
</head>
<body>
<h1>Hello nginx</h1>
<p>
nginx単体のWebサーバです.
</p>
</body>
</html>
Web サーバのアクセスログ (access.log と error.log) を保存する volume となる web/logs/ というディレクトリも作成します.Docker のプロジェクトは Git でバージョン管理できることから,アクセスログが Git のリポジトリに含まれないように,.gitignore ファイルを作成しておきます.このファイルにはワイルドカードで「*」とだけ指定することで,このディレクトリ以下にあるすべてのファイル/ディレクトリが Git の管理対象から除外されることになります.
web/logs/.gitignore
*
なお,ファイル .gitignore は git add
コマンドでもステージングエリアにアップされないので -f
オプションを付ける必要があることに注意してください.
% git add -f web/logs/.gitignore ⏎
Docker Compose で定義したコンテナをまとめて実行するには docker compose up -d
コマンドを利用します.ここで,-d
オプションはコンテナをデーモン(つまり,バックグラウンドでの常駐プロセス)として実行するためのオプションです.
% docker compose up -d ⏎
[+] Running 8/8
✔ nginx Pulled 12.4s
✔ 0878ecc8b0af Pull complete 4.9s
✔ d482c1064d09 Pull complete 5.5s
✔ 8f42b11f40a7 Pull complete 5.5s
✔ 75e874aacbee Pull complete 5.5s
✔ 68e4d7b9f947 Pull complete 5.5s
✔ 605513a168b0 Pull complete 5.5s
✔ fdf316665463 Pull complete 5.5s
[+] Running 2/2
✔ Network web01nginx_default Created 0.0s
✔ Container nginx1 Started 0.4s
%
上のコマンドでイメージがダウンロードされているので,イメージを一覧で確認します.
% docker image ls ⏎
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 17848b7d08d1 5 weeks ago 198MB
%
起動中のコンテナを一覧で確認します.ローカル環境の TCP 80 番ポートへの通信が,nginx1
コンテナの 80 番ポートへ転送される設定になっていることが分かります.
% docker container ls ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b7a57a3fc508 nginx:latest "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, [::]:80->80/tcp nginx1 %
コンテナの起動が確認できたので,Web ブラウザで http://localhost/ に接続します.次のようなページが表示されたら成功です.なお,ローカル環境で web/html/index.html
の内容を変更して保存したあと Web ブラウザで再読み込みすると,直ちに変更が反映されることに注意しよう.
起動中のコンテナにログインすることもできます.
% docker exec -it nginx1 /bin/bash ⏎ root@b7a57a3fc508:/# ls ⏎ bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib media mnt opt proc root run sbin srv sys tmp usr var root@b7a57a3fc508:/# exit ⏎ exit What's next: Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug nginx1 Learn more at https://docs.docker.com/go/debug-cli/ %
コンテナを停止するには docker compose stop
を実行します.
% docker compose stop ⏎
[+] Stopping 1/1
✔ Container nginx1 Stopped 0.2s
%
コンテナの実行が終了したことを次のコマンドで確認します.
% docker container ls -a ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b7a57a3fc508 nginx:latest "/docker-entrypoint.…" 2 minutes ago Exited (0) 13 seconds ago nginx1 %
再びコンテナを起動します.既にイメージはローカル環境に存在することから,起動にはわずかな時間しか必要ありません.
% docker compose up -d ⏎ [+] Running 1/1 ✔ Container nginx1 Started 0.1s % docker container ls ⏎ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b7a57a3fc508 nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 6 seconds 0.0.0.0:80->80/tcp, [::]:80->80/tcp nginx1 %
コンテナの終了と同時に廃棄も行う場合は docker compose down
コマンドを利用します.
% docker compose down ⏎
[+] Running 2/2
✔ Container nginx1 Removed 0.2s
✔ Network web01nginx_default Removed 0.2s
%
実行中のコンテナがなくなったことが分かります.
% docker container ls ⏎
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
%
(実行中も含め)実行を終了したコンテナもすべてなくなったことが分かりました.
% docker container ls -a ⏎
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
%
なお,nginx へのアクセスログはローカル環境のボリューム web/logs/access.log
に残されていることを確認すると良いでしょう.
web/logs/access.log
192.168.65.1 - - [21/Sep/2025:00:17:41 +0000] "GET / HTTP/1.1" 200 268 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36" "-"
192.168.65.1 - - [21/Sep/2025:00:17:41 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36" "-"