🐳

初心者向けDocker入門:Webサーバー環境をコンテナで構築する基本手順

に公開

はじめに

現代のWeb開発において、「Docker」という言葉を聞かない日はないほど、コンテナ技術はデファクトスタンダードになりつつあります。
「開発環境と本番環境のズレをなくしたい」
「複数のプロジェクトを効率的に管理したい」
そんな悩みを抱えている方にとって、Dockerは強力な解決策となります。

この記事では、自身のWikiメモを元に、Dockerとは何かという基礎から、実際にDockerを使ってNginxとPHP-FPMのWebサーバー環境を構築するまでの基本手順を、初心者にも分かりやすく解説します。

Dockerとは? コンテナの魔法

Dockerは、アプリケーションとその実行に必要なすべてのもの(コード、ランタイム、システムツール、ライブラリなど)を**「コンテナ」**という隔離された環境にまとめてパッケージ化する技術です。

従来の仮想マシンと異なり、OS全体を仮想化するのではなく、OSのカーネルを共有するため、非常に軽量で高速に動作します。

コンテナのメリット:

  1. 環境の統一: 開発環境、テスト環境、本番環境で全く同じ環境を簡単に再現できる。
  2. 可搬性: コンテナイメージを一度作れば、どのDocker環境でも同じように動かせる。
  3. 分離性: アプリケーションごとに環境が隔離されるため、依存関係の競合を防げる。
  4. 効率性: 仮想マシンに比べてリソース消費が少なく、起動も高速。

Step 1: Docker Desktopのインストール

DockerをローカルPCで動かすための「Docker Desktop」をインストールします。

  • Windows / macOS: Docker公式サイトからインストーラーをダウンロードし、指示に従ってインストールしてください。
    https://www.docker.com/products/docker-desktop/
  • Linux: 各ディストリビューションの公式手順に従ってインストールします。

インストール後、ターミナルで以下のコマンドを実行し、Dockerが正しく動作することを確認します。

docker --version
docker compose version # Docker Compose V2がインストールされているか確認

Step 2: プロジェクトディレクトリの作成とファイル構成

Webサーバー環境を構築するためのプロジェクトディレクトリを作成し、必要なファイルを配置します。

.
├── docker-compose.yml
├── nginx
│   └── default.conf
└── php
    └── Dockerfile
    └── php.ini

Step 3: docker-compose.ymlの作成

docker-compose.ymlは、複数のコンテナを一括で定義・管理するためのファイルです。NginxとPHP-FPMの2つのサービスを定義します。

docker-compose.yml
version: '3.8' # Docker Composeのバージョン

services:
  # Nginxサービス
  nginx:
    image: nginx:latest # 最新のNginxイメージを使用
    ports:
      - "80:80" # ホストの80番ポートをコンテナの80番ポートにマッピング
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro # Nginx設定ファイルをマウント
      - ./html:/var/www/html # Webサイトのファイルをマウント
    depends_on:
      - php # phpサービスが起動してからnginxを起動
    networks:
      - app-network # ネットワーク設定

  # PHP-FPMサービス
  php:
    build:
      context: ./php # phpディレクトリ内のDockerfileをビルド
    volumes:
      - ./html:/var/www/html # Webサイトのファイルをマウント
    networks:
      - app-network # ネットワーク設定

  # ネットワーク定義
  app-network:
    driver: bridge # bridgeネットワークを使用

Step 4: Nginx設定ファイル (nginx/default.conf) の作成

NginxがリクエストをPHP-FPMに転送するための設定ファイルです。

nginx/default.conf
server {
    listen 80;
    server_name localhost;
    root /var/www/html;
    index index.php index.html;

    # 静的ファイルはNginxが直接処理
    location / {
        try_files $uri $uri/ =404;
    }

    # PHPファイルをPHP-FPMに転送
    location ~ \.php$ {
        fastcgi_pass php:9000; # phpサービス(コンテナ名)の9000番ポート
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # .htaccessファイルを隠す
    location ~ /\.ht {
        deny all;
    }
}

Step 5: PHP-FPM用 Dockerfilephp.iniの作成

PHP-FPMコンテナをカスタマイズするためのDockerfileと、PHPの設定ファイルphp.iniを作成します。

php/Dockerfile

PHPのベースイメージに、追加のPHP拡張機能をインストールします。

php/Dockerfile
FROM php:8.2-fpm # PHP 8.2のFPMイメージを使用

# 必要なPHP拡張機能をインストール
RUN apt-get update && apt-get install -y \
    libpq-dev \
    libzip-dev \
    libjpeg-dev \
    libpng-dev \
    libfreetype6-dev \
    && docker-php-ext-install pdo_mysql zip gd # MySQL/MariaDB接続、zip、画像処理用gdをインストール

# カスタムphp.iniをコンテナ内にコピー
COPY php.ini /usr/local/etc/php/conf.d/

php/php.ini

memory_limitdate.timezoneなど、PHPの基本的な設定を記述します。

php/php.ini
# メモリ制限
memory_limit = 256M

# アップロードファイルの最大サイズ
upload_max_filesize = 32M
post_max_size = 32M

# タイムゾーン
date.timezone = Asia/Tokyo

# エラー表示設定 (開発中はOn, 本番ではOff)
display_errors = Off
log_errors = On
error_log = /var/log/php/error.log

Step 6: Webサイトファイル (html/index.php) の作成

Webサーバーで表示されるための簡単なPHPファイルを作成します。

html/index.php
<?php
echo "<h1>Hello from Nginx & PHP-FPM with Docker!</h1>";
echo "<p>PHP Version: " . phpversion() . "</p>";
phpinfo();
?>

Step 7: Docker Composeで環境を起動する

全てのファイルが準備できたら、プロジェクトルートで以下のコマンドを実行し、Docker環境を起動します。

docker compose up -d
  • up: docker-compose.ymlに定義されたサービスを起動します。
  • -d: デタッチモードでバックグラウンド実行します。

ブラウザでhttp://localhostにアクセスし、PHP情報が表示されれば成功です!

コンテナを停止・削除する場合は、以下のコマンドを実行します。

docker compose down

おわりに

Dockerを使ったWebサーバー環境構築は、一度設定してしまえば、他のプロジェクトや開発者との環境共有が非常に簡単になります。今回の基本設定をベースに、データベース(MySQL/PostgreSQL)やComposerなどのツールを追加していくことで、より複雑な開発環境も構築できるようになります。

コンテナ技術を学ぶ第一歩として、この記事があなたの開発効率向上の一助となれば幸いです。


この記事で紹介した内容以外にも、技術情報をブログで発信しています。
MEANTECH
https://meantech.fontfontfont.com/

Discussion