Edited at

docker-composeでPHPとMySQLを連携させてみる

PHPとMySQLのコンテナをつくり、そのコンテナ間で連携できるものをdocker-composeを使って作っていきます。


前提


ホスト環境

macOS Mojave 10.14.2


ディレクトリ構成

├── docker-compose.yml

├── index.php
├── mysql
│   ├── Dockerfile
│   ├── mysql_conf
│     └── custom.cnf
├── php
   └── Dockerfile


手順


カスタムネットワークの作成

$ docker network create [network_name]

[network_name]には, 任意の名前を指定する


Dockerfile, docker-compose.ymlを書いていく


php/Dockerfile

PHP,Apacheのイメージを元に必要最低限の拡張モジュールをインストールします。

FROM php:7.2-apache

RUN apt-get update && \
# PHPのExtensionをインストール.
docker-php-ext-install pdo_mysql mysqli mbstring

WORKDIR /var/www/html

EXPOSE 80


mysql/Dockerfile

動くものを作りたいので、とりあえずイメージだけ

FROM mysql:8.0


docker-compose.yml

version: '3'

services:
app:
container_name: php
build:
context: ./php
dockerfile: Dockerfile
tty: true
volumes:
- ${PWD}:/var/www/html
ports:
- "80:80"
network_mode: "sample-network" # 上で作成したカスタムネットワークの名前を記載する

db1:
container_name: mysql
build:
context: ./mysql
dockerfile: Dockerfile
environment:
- MYSQL_ROOT_PASSWORD=pass
volumes:
# MySQLの設定ファイル
- ./mysql/mysql_conf:/etc/mysql/conf.d
network_mode: "sample-network"

networks:
sample-network:


MySQLの設定ファイルを書く

MySQL8.0を実行した時, The server requested authentication method unknown to the clientエラーが発生したので, 一応下記の設定を追加しておく.


mysql/custom.cnf

[mysqld]

default_authentication_plugin=mysql_native_password


docker-composeを実行

バックグラウンドで実行させるため, -dオプションをつける

$ docker-compose up -d


PHP側の設定


確認用スクリプトを書く

index.php

<meta charset="UTF-8">

<title>テスト</title>
<?php
try {
# hostには「docker-compose.yml」で指定したコンテナ名を記載
$dsn = "mysql:host=mysql;dbname=sample;";
$db = new PDO($dsn, 'root', 'pass');

$sql = "SELECT * FROM test";
$stmt = $db->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($result);
} catch (PDOException $e) {
echo $e->getMessage();
exit;
}


MySQL側の設定


コンテナ内に入る

$ docker container exec -it mysql /bin/sh


MySQLへ接続

パスワードは docker-compose.ymlの環境変数で指定

$ mysql -ppass

適当なデータベースとテーブルを作成

mysql> CREATE DATABASE sample;

mysql> USE sample;
mysql> CREATE TABLE test(id int AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255));
mysql> INSERT INTO test (name) VALUES ('John');


ブラウザで確認

http://localhost:80/index.php へアクセス

データが表示されることが確認できるかと思います