【docker】コンテナ(ディレクトリ)の作成

今回は、例としてメール管理システムのコンテナを作成する。

今まではXAMPPを使用し、VSCodeのワークスペース内で以下のディレクトリ構成で開発していました。

VSCodeワークスペース(従来のやり方:xamppの場合)
C:Users\user\xampp/
└ email_mangement_system/
| └index.php
└ xxxxxx/

上記をdockerでは、以下のディレクトリ構成とする。
言語ごとに分けたかったので以下の構造になっています。
今回使用するのは、email_management_systemのみです。

VSCodeワークスペース(今後のやり方:dockerの場合)
C:Users\user\docker/
└ php/
| └ email_mangement_system/
| | └ index.php
| └ xxxxxx/
└ html/
└ c/
| └ c++/
| └ c#/
└ typescript/
└ java/
└ python/

1.必要なフォルダを作成

1.dockerフォルダの作成

エクスプローラーを開き、以下の順でC:\Users\Userを開く。

[PC]をクリック。

[ローカルディスク(C:)]をクリック。

[ユーザー名(※デフォルトならユーザー)]をクリック。

[User]をクリック。

ここ(User)で、右クリック。

[新規作成]をクリック。

[フォルダー]をクリック。

名前をdockerにする。

ここから下は、今やってきた基本的なフォルダの作り方をコマンドにてやっていく。
PowerShellを起動し、以下のコマンドを入力する。

2.ディレクトリ移動

↓C:\Users\Userに移動。

cd C:\Users\User

3.ディレクトリ構造を作成

↓Userディレクトリに移動。

mkdir docker\php\email_management_system

↓C:\Users\User\docker\php\email_management_systemに移動。

cd docker\php\email_management_system

4.必要なディレクトリを作成

↓email_management_systemフォルダにsrcフォルダを作成。

mkdir src

↓email_management_systemフォルダにmysql_dataフォルダを作成。

mkdir mysql_data

5.docker-compose.ymlファイルの作成

↓docker-compose.ymlを作成と同時にメモ帳を起動。

notepad docker-compose.yml

以下の内容を貼り付ける。

version: '3.8'

services:
  # Apache + PHP サービス
  web:
    image: php:8.2-apache
    container_name: email_management_system_web
    ports:
      - "8001:80"
    volumes:
      - ./src:/var/www/html
    depends_on:
      - db
    environment:
      - APACHE_DOCUMENT_ROOT=/var/www/html
    networks:
      - email_network

  # MySQL データベース
  db:
    image: mysql:8.0
    container_name: email_management_system_db
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: email_management
      MYSQL_USER: email_user
      MYSQL_PASSWORD: email_password
    ports:
      - "3307:3306"
    volumes:
      - ./mysql_data:/var/lib/mysql
    networks:
      - email_network

  # phpMyAdmin
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: email_management_system_phpmyadmin
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
      PMA_USER: root
      PMA_PASSWORD: rootpassword
    ports:
      - "8002:80"
    depends_on:
      - db
    networks:
      - email_network

networks:
  email_network:
    driver: bridge

volumes:
  mysql_data:

[Ctrl]+[S]で保存。

6.簡単なPHPファイルを作成

↓srcフォルダに移動。

cd src

↓index.phpを作成。

notepad index.php

以下の内容を貼り付ける。

<?php
echo "<h1>Email Management System</h1>";
echo "<p>Apache + PHP + MySQL environment is working!</p>";
echo "<p>PHP Version: " . phpversion() . "</p>";
echo "<p>Current Time: " . date('Y-m-d H:i:s') . "</p>";

// データベース接続テスト
try {
    $pdo = new PDO('mysql:host=db;dbname=email_management', 'email_user', 'email_password');
    echo "<p>✓ Database connection successful!</p>";
} catch(PDOException $e) {
    echo "<p>✗ Database connection failed: " . $e->getMessage() . "</p>";
}
?>

2.コンテナの作成と起動

↓email_managementディレクトリに戻る。

cd ..

↓Dockerイメージをダウンロードしてコンテナを起動。

docker-compose up -d

3.動作確認

↓コンテナの状態確認。

docker-compose ps

↓ログ確認。

docker-compose logs

↓Webサイトにアクセスする場合
http://localhost:8001

↓phpMyadminにアクセスする場合
http://localhost:8002

4.便利なコマンド

– コンテナを停止

docker-compose stop

– コンテナを起動

docker-compose start

– コンテナを削除(データも削除)

docker-compose down

– ログをリアルタイム表示

docker-compose logs -f

他のdockerコマンドはこちら

5.最終的なディレクトリ構造

C:\Users\User\docker\php\email_management_system\
├── docker-compose.yml
├── src\
│   └── index.php
└── mysql_data\      (自動作成)

6.docker-compose.ymlの役割

1.複数コンテナの管理設定ファイル

  • 複数のDockerコンテナをまとめて管理するための設定ファイル。
  • 1つのコマンドで複数のサービス(コンテナ)を同時に起動・停止できる。

2.サービス構成の定義

email_managementの例では以下の3つのサービスを定義している。

services:
  web:        # Apache + PHPコンテナ
  db:         # MySQLコンテナ  
  phpmyadmin: # phpMyAdminコンテナ

3.各サービスの詳細設定

例として、webサービス(Apache + PHP)の設定

web:
  image: php:8.2-apache          # 使用するDockerイメージ
  container_name: email_management_system_web  # コンテナ名
  ports:
    - "8001:80"                  # ポート転送(ホスト:コンテナ)
  volumes:
    - ./src:/var/www/html        # ファイル共有(ホスト:コンテナ)

4.主な設定項目

項目役割
image使用するDockerイメージphp:8.2-apache
portsポート転送設定"8001:80"
volumesホストとコンテナ間のファイル共有./src:/var/www/html
environment環境変数設定データベースパスワードなど
depends_onサービス間の依存関係webがdbに依存
networksネットワーク設定コンテナ間通信

5.ネットワーク設定

networks:
  email_network:    # カスタムネットワーク作成
    driver: bridge
  • コンテナ同士が通信できるネットワークを作成。
  • webコンテナからdbコンテナにアクセス可能。

6.Docker Composeの利点

従来の方法(個別実行)

docker run -d --name web php:8.2-apache
docker run -d --name db mysql:8.0
docker run -d --name phpmyadmin phpmyadmin/phpmyadmin
# ネットワーク、ボリューム設定も個別に...

Docker Composeを使用

docker-compose up -d    # 全サービス一括起動

7.実際の動作

docker-compose up -d

↑を実行すると、以下が動作する。

  1. ネットワーク email_network を作成
  2. MySQLコンテナを起動
  3. Apache+PHPコンテナを起動(MySQLを待つ)
  4. phpMyAdminコンテナを起動
  5. 全てのコンテナが連携して動作開始

コメント