今回の投稿は、前回構築したphpの開発環境にデータベースを管理するシステム(RDBS)を追加します。 RDBSは、MySQLを使用し、MySQLをGUIで操作できるphpMyAdminも追加したいと思います。 前回の投稿はこちら

PCの環境

  • Mac(intel) Catalina 10.15.7
  • Docker version 20.10.8

ディレクトリの構成

project
    ├── docker
    │   ├── mysql
    │   │   ├── data
    │   │   └── my.cnf
    │   ├── php
    │   │   ├── php.ini
    │   │   └── Dockerfile
    │   └── nginx
    │       └── default.conf
    ├── source
    │   └── index.php
    └── docker-compose.yml
  • docker/mysql以下を追加しています。
  • docker/mysql/dataは、MySQLのデータなどを永続化するためのディレクトリ(コンテナ内と共有)。
  • my.cnfは、MySQLの設定ファイル

①phpのDockerfileを修正する

docker/php/Dockerfile

FROM php:7.4.9-fpm

COPY php.ini /usr/local/etc/php/

# 修正箇所
RUN apt update \
  && apt install -y default-mysql-client \
  && docker-php-ext-install pdo_mysql

WORKDIR /var/www

説明

# phpのコンテナからmysqlに接続するツールをインストール
apt install -y default-mysql-client
# phpからmysqlに接続するためのドライバ(pdo_mysql)をインストール
docker-php-ext-install pdo_mysql

②my.cnfを作成する

タイムゾーンの設定と文字化けを防ぐために定義します。

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-time-zone = 'Asia/Tokyo'

[client]
default-character-set = utf8mb4

以下説明

[mysqld]
# サーバの文字コードをutf8にする
character-set-server = utf8mb4

# アルファベットの大文字・小文字を区別するなどの設定
collation-server = utf8mb4_unicode_ci

# タイムゾーンの設定
default-time-zone = 'Asia/Tokyo'
[client]
# コマンドラインクライアントの文字コードを設定
default-character-set = utf8mb

③docker-compose.ymlファイルの修正

version: '3.8'

services:
  nginx:
    image: nginx:1.21.1
    ports:
      - "80:80"
    volumes:
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
  php:
    build: ./docker/php
    volumes:
      - ./source:/var/www/
    # 追記
    depends_on:
      - mysql

  # 追記
  mysql:
    image: mysql:8.0.26
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: php_db
      MYSQL_USER: phper
      MYSQL_PASSWORD: password
    command:
      mysqld --default-authentication-plugin=mysql_native_password
    volumes:
      - ./docker/mysql/data:/var/lib/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf

  # 追記
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=phper
      - PMA_PASSWORD=password
    depends_on:
      - mysql
    ports:
      - 8080:80

説明
php:
    build: ./docker/php
    volumes:
      - ./source:/var/www/
    # 追記
    # mysqlのコンテナが起動した後、phpのコンテナが起動するようにする
    depends_on:
      - mysql
  # 追記
  # mysqlのコンテナを定義
  mysql:
    image: mysql:8.0.26
    # 環境変数(MySQLのデータベースの名前・ユーザーの作成・パスワードなど)を設定
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: php_db
      MYSQL_USER: phper
      MYSQL_PASSWORD: password
    command:
      # 認証プラグインの変更
      mysqld --default-authentication-plugin=mysql_native_password
    volumes:
      # PCとコンテナ内のデータを共有する(:の左がコンテナの外、:の右がコンテナ内)永続化
      - ./docker/db/data:/var/lib/mysql
      # PCとコンテナ内のデータを共有する(:の左がコンテナの外、:の右がコンテナ内)
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
  # 追記
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    # 環境変数を設定、MySQLのコンテナで定義したユーザー名、パスワード、データベース名などを設定する
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=phper
      - PMA_PASSWORD=password
    # mysqlのコンテナが起動した後、このコンテナが起動するようにする
    depends_on:
      - mysql
    # localhost:8080でアクセスできるようにする
    ports:
      - 8080:80
  • phpMyAdminは、MySQLをGUIで操作できるツール。
  • 必要なければ(MySQLをCUIで操作するなど)、定義しなくても環境構築はできる。

④docker composeでコンテナを起動させる。

ターミナルを起動させ、docker-compose.ymlファイルがあるディレクトリ内に移動して実行する。

# projectディレクトリに移動
cd project

# コンテナを起動、オプションの-dは、バックグラウンドで起動するという意味、--buildはDockerfileに基づき、最初からイメージをつくるということ
docker compose up --build -d

⑤正常に起動しているかを確認する

# コンテナの起動を確認
docker compose ps

# 次のように4つのコンテナがつくられ、STATUSがrunningになっていれば正常に起動している
nginx-php-mysql-phpmyadmin_mysql_1        "docker-entrypoint.s…"   mysql               running             3306/tcp, 33060/tcp
nginx-php-mysql-phpmyadmin_nginx_1        "/docker-entrypoint.…"   nginx               running             0.0.0.0:80->80/tcp, :::80->80/tcp
nginx-php-mysql-phpmyadmin_php_1          "docker-php-entrypoi…"   php                 running             9000/tcp
nginx-php-mysql-phpmyadmin_phpmyadmin_1   "/docker-entrypoint.…"   phpmyadmin          running             0.0.0.0:8080->80/tcp, :::8080->80/tcp

⑥phpMyAdminの動作確認

ブラウザ(Google chromeなど)で http://localhost:8080 にアクセスして、次のような画面が表示されればOK phpmyadmin.jpg


⑦phpからMySQLに接続できるかを確認する

/project/source/index.php

<?php
const HOSTNAME = 'mysql';
const DATABASE = 'php_db';
const USERNAME = 'phper';
const PASSWORD = 'password';

try {

  $pdo = new PDO('mysql:host=' . HOSTNAME . ';dbname=' . DATABASE, USERNAME, PASSWORD);
  $msg = 'MySQLに接続成功!';

} catch (PDOException $e) {

  $msg  = 'MySQLへの接続失敗...<br>' . $e->getMessage();

}

echo $msg;
# docker-compose.ymlのMySQLのコンテナで定義したホスト名(mysql)環境変数(データベース名、ユーザー名、パスワード)を定数に入れる
const HOSTNAME = 'mysql';
const DATABASE = 'php_db';
const USERNAME = 'phper';
const PASSWORD = 'password';
# phpのコンテナにインストールしたpdo_mysqlでデータベースに接続する
$pdo = new PDO('mysql:host=' . HOSTNAME . ';dbname=' . DATABASE, USERNAME, PASSWORD);

ブラウザ(Google chromeなど)で http://localhost にアクセスして、

MySQLに接続成功!

と表示されればデータベースに接続できている。


その他

コンテナを終了する

docker compose down

再度この環境を構築するには、次のコマンドで構築できる。(docker-compose.ymlのファイルがあるディレクトリで実行する。)

docker compose up -d

次回は、Laravelの環境構築をやってみたいと思います!