Dockerを利用してPHPの開発環境を用意してみましょう。
下記の記事の続きです。
前回は、NginxでWebサーバーを構成し、PHPを動作させるために、APサーバーを構築しました。
今回は、mysqlサーバーを構築してきたいと思います。
MySQLサーバーの構築
docker-compose.ymlを下記のように編集します。
version: '3'
services:
web:
image: nginx:1.15.6
ports:
- "8000:80"
depends_on:
- app
volumes:
- ./web/default.conf:/etc/nginx/conf.d/default.conf
- ./src:/var/www/
app:
image: php:7.2.15-fpm
depends_on:
- mysql
volumes:
- ./src:/var/www/
mysql:
image: mysql:5.7
environment:
MYSQL_DATABASE: test
MYSQL_USER: root
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
ports:
- "3306:3306"
volumes:
- ./mysql/mysql-data:/var/lib/mysql
編集後、下記のコマンドでwebサーバーとAPサーバーとMySQLサーバーが立ち上がります。
$ docker-compose up -d
MySQLサーバーに接続してみましょう
$ docker-compose exec mysql bash # mysqlサーバーに入ってmysqlに接続する $ mysql -u root -p # データベースを確認する mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.06 sec)
すると、docker-compose.ymlのenvironmentで定義した「test」データベースができているのが確認できるはずです。
では、試しにPHPでMySQLを操作するプログラムを動かしてみます。
ただ、公式のPHPイメージのままで、MySQLに接続するのは難しいので、必要なパッケージなどをインストールする必要があります。
Docker fileを使ってPHPイメージをカスタマイズします。
作業用のディレクトリ(php_docker)に「php」というディレクトリを作成し、作成した「php」ディレクトリに「Dockerfile」を作成します。
とりあえず、コンテナは止めておきましょう。
$ docker-compose stop $ mkdir php $ cd php $ vi Dockerfile
Dockerfileは下記のように記述します。
FROM php:7.2.15-fpm RUN docker-php-ext-install pdo_mysql
docker-compose.ymlも編集します。
version: '3'
services:
web:
image: nginx:1.15.6
ports:
- "8000:80"
depends_on:
- app
volumes:
- ./web/default.conf:/etc/nginx/conf.d/default.conf
- ./src:/var/www/
app:
build: ./php
depends_on:
- mysql
volumes:
- ./src:/var/www/
mysql:
image: mysql:5.7
environment:
MYSQL_DATABASE: test
MYSQL_USER: root
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
ports:
- "3306:3306"
volumes:
- ./mysql/mysql-data:/var/lib/mysql
Dockerコンテナを立ち上げてみましょう。
$ docker-compose up -d
これで、PHPとMySQLの開発環境が整いました。
それでは、実際にPHPプログラムを作成して、MySQLに接続してみましょう。
例として、MySQLに適当なデータを追加して、PHPで呼び出してみます。
MySQLコンテナに入って、データベース「test」の中にテーブルを作成します。
今回は例として「users」テーブルを作成してみます。テーブルを作成したら適当に3つほどデータを入れておきます。
$ docker-compose exec mysql bash
$ mysql -u root -p
# mysql
mysql> use test
Database changed
mysql> CREATE TABLE users(
-> id INT AUTO_INCREMENT NOT NULL,
-> name VARCHAR(30) NOT NULL ,
-> age INT NOT NULL,
-> PRIMARY KEY (id));
Query OK, 0 rows affected (0.10 sec)
mysql> INSERT INTO users(name, age) VALUES('tom',22);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO users(name, age) VALUES('john',34);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO users(name, age) VALUES('emily',28);
Query OK, 1 row affected (0.00 sec)
次に、MySQLに接続するためのPHPプログラムを作成します。
作業用ディレクトリ「php_docker」の中に作成した「src」ディレクトリの中のindex.phpを下記のように書き換えます。
$dsn = 'mysql:host=php_docker_mysql_1;dbname=test';
$user = 'root';
$password = 'password';
$dbh = new PDO($dsn, $user, $password);
$sql = "SELECT * from users";
foreach ($dbh->query($sql, PDO::FETCH_ASSOC) as $row) {
print_r($row);
}
ブラウザからhttp:// localhost:8000にアクセスしてみます。
下記のように表示されれば成功です。
Array ( [id] => 1 [name] => tom [age] => 22 ) Array ( [id] => 2 [name] => john [age] => 34 ) Array ( [id] => 3 [name] => emily [age] => 28 )