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 )