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 へアクセス
データが表示されることが確認できるかと思います