神戸学院大学 経営学部 林坂ゼミ

Docker 入門トップページ

« 戻る 次へ »

Docker 入門

さまざまな Web サーバを Docker Compose で構築する

nginx 単体の Web サーバを起動する

Docker Compose は複数の Docker コンテナを設定して連携させることができるツールです.YAML形式で記述した設定ファイルからコマンド一つですべてのコンテナを生成し起動させることができます.これによりローカルの開発環境で開発・テストしたサーバ環境をそのまま本番環境でも動作させることができるようになります.ここからのセクションでは nginx や Apache を使ってさまざまな Web サーバの環境を構築する例を通じて,Docker Compose の使い方を理解します.なお,このセクション全体のコードのサンプルは GitHub からダウンロードできます.全体のコードサンプルの中に各ページのコードがそれぞれのフォルダにまとめられています.このページのサンプルコードは web01Nginx フォルダで公開しています.

本題に入る前に,nginxApache を利用する前にそれぞれの特徴をまとめておきます.nginx は静的ファイルの配信,ロードバランサ,リバースプロキシ,API サーバなどでの利用に適しています.一方で Apache は .htaccess を活用した柔軟な設定が必要な場合や,PHP を直接処理したい場合に便利です.以下の表に主な違いを示します.

特徴 nginx Apache
アーキテクチャ 非同期・イベント駆動型 マルチスレド/マルチプロセス型
パフォーマンス 高速・軽量.静的コンテンツに強い 動的コンテンツに強いが,負荷が高いと遅くなる
リバースプロキシ 高性能なリバースプロキシとしても利用可能 リバースプロキシ機能はあるが性能は劣る
設定ファイル シンプルで高速な構文 (nginx.conf) 柔軟だが複雑な構文 (.htaccess など)
動的コンテンツ処理 外部プロセス (FastCGI など) に委任 モジュール (mod_php など) で直接処理可能
モジュールの扱い コンパイル時に組み込み 動的に追加・削除可能
メモリ使用量 少ない 多め
対応OS Unix系,Windows(制限あり) Unix系,Windows(広く対応)
コミュニティとサポート 活発で成長中 長年の実績あり,情報が豊富
用途の傾向 高トラフィックサイト,APIサーバなど レガシーシステム,CMS (WordPress など)

このページでは,下図のような nginx 単体の Web サーバからスタートします.

web-201

任意の名前の新規ディレクトリを作成し,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-2025-web-01

起動中のコンテナにログインすることもできます.

% 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" "-"