開発環境を構築する【Docker+Nginx+Php+MySQL】
今回の投稿は、前回構築した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
⑦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の環境構築をやってみたいと思います!
タカモリ
凄いクオリティですね! 次回もめっちゃ楽しみにしています!