■まとめ
PHP+MySQLの環境を作る例
■ファイルの作成
C:\Users\refirio\docker\ 内に以下を作成するとする
apache_php8_mysql\html\index.php
<?php phpinfo() ?>
apache_php8_mysql\docker\mysql\Dockerfile
FROM mysql:5.7
apache_php8_mysql\docker\mysql\my.cnf
[mysqld]
character-set-server=utf8
apache_php8_mysql\docker\php\Dockerfile
FROM php:8.1-apache
RUN apt-get update
RUN apt-get install -y libonig-dev
RUN docker-php-ext-install pdo_mysql mysqli mbstring
apache_php8_mysql\docker\php\php.ini
date.timezone = Asia/Tokyo
apache_php8_mysql\docker-compose.yml
version: '3'
networks:
compose_network:
volumes:
compose_mysql_data:
services:
mysql:
container_name: mysql
volumes:
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro
- compose_mysql_data:/var/lib/mysql:rw
environment:
TZ: Asia/Tokyo
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_USER: user
MYSQL_PASSWORD: userpass
MYSQL_DATABASE: test
networks:
- compose_network
build: ./docker/mysql
php:
container_name: php
volumes:
- ./docker/php/php.ini:/usr/local/etc/php/conf.d/php.ini:ro
- ./:/var/www:rw
environment:
TZ: Asia/Tokyo
ports:
- 80:80
networks:
- compose_network
build: ./docker/php
■設定の上書き
docker-compose.yml と同じ階層に docker-compose.override.yml を置くと、その設定内容が優先される
以下の場合、MySQLのユーザ情報が「user / userpass」から「test / testpass」に変更される
apache_php8_mysql\docker-compose.override.yml
version: '3'
services:
mysql:
environment:
MYSQL_USER: test
MYSQL_PASSWORD: testpass
■よく使用するコマンド
$ cd docker/apache_php8_mysql
$ docker-compose build
… ビルドする場合(構成を変更した場合など)
$ docker-compose up -d
… 起動
$ docker-compose down
… 終了
$ docker container exec -it php bash
… phpコンテナのターミナルに接続する場合
$ docker container exec -it mysql bash
… mysqlコンテナのターミナルに接続する場合
$ mysql -u root -p
… MySQLに接続
$ docker volume ls ... ボリュームを確認
$ docker volume rm compose_mysql_data ... ボリュームを削除
■ブラウザからのアクセス
http://127.0.0.1/
また以下のようなコードで、PHPからMySQLに接続できる
エラーになる場合、mysqlコンテナの起動が完了していない可能性があるので待つ
<?php
try {
$pdo = new PDO(
'mysql:dbname=test;host=mysql',
'test',
'testpass'
);
$stmt = $pdo->query('SELECT NOW() AS now;');
$data = $stmt->fetch(PDO::FETCH_ASSOC);
echo "<p>" . $data['now'] . "</p>\n";
$pdo = null;
} catch (PDOException $e) {
exit($e->getMessage());
}