DockerでPHPのアプリを立ち上げてDB(MySQL)に接続する方法
170 回閲覧されました
みなさんこんにちは、jonioです。
今回はPHPアプリをDockerで立ち上げるのとDBに接続する方法のメモになります。
私は初めて構築するので細かく分かっていないのをご了承下さい。
目次
最終的なファイル構成
下記になります。
PHPプロジェクト --- Dockerfile
|
- docker-compose.yml
|
- mysql_custom.conf
|
- php.ini
Dockerfile
Dockerfileはアプリを立ち上げる為のコンテナ(アプリごとに独立して実行させる為の物みたいな感じ)のイメージ(コンテナを作成する為のファイルが集まった物みたいな感じ)を設定する為のファイルです。
コードを下記にします。
FROM php:7.2-apache
RUN apt-get update && apt-get install -y \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install gd \
&& docker-php-ext-install pdo pdo_mysql
1行目を書かないとアプリを動作させることができないので必ず書きます。
意味は「phpのバージョンを7.2にしてwebサーバーはapatchを使う」ということになります。
3行目〜9行目はインストールする物を記述します。
「RUN apt-get update」はパッケージを最新の状態にするという意味です。
「apt-get install -y」はアプリを立ち上げるのに必要なパッケージをインストールして質問は全てy(イエス)と答えるという意味です。
下記は画像処理に関するパッケージをインストールする為に記述していますが必要なら書きます。
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install gd \
DockerはDBにMySQLを使う場合はデフォルトでPDOができないようになっているみたいですが9行目を書くことでPDOをできるようにします。
docker-compose.yml
docker-comose.ymlは複数のコンテナを一括管理する為のファイルです。
コードを下記にします、インデントに意味があるので同じにして下さい。
version: '3'
services:
php:
build:
context: .
volumes:
- .:/var/www/html
- ./php.ini:/usr/local/etc/php/php.ini
- ./logs:/var/log
ports:
- 8000:80
container_name: php-container
mysql:
platform: linux/x86_64
image: mysql:5.7
volumes:
- mysql_data:/var/lib/mysql
- ./mysql_custom.cnf:/etc/mysql/conf.d/mysql_custom.cnf
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=blog
- MYSQL_USER=user
- MYSQL_PASSWORD=pass
container_name: mysql5.7-trial2
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
PMA_HOST: mysql
MYSQL_ROOT_PASSWORD: root
ports:
- 8080:80
depends_on:
- mysql
volumes:
mysql_data:
mysql_custom.conf
コードを下記にします、DBで言語を日本語にする為の設定です。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
php.ini
コードを下記にします、ログを出力する為に作成します。
error_reporting = E_ALL
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
PHPアプリの立ち上げ
下記のコマンドのどちらかで立ち上げができます。
docker-compose up
docker-compose up -d
上はログが表示されて下はログが表示されません。
PHPアプリの停止
下記のコマンドです。
docker-compose down
PDO
コードを下記にします。
<?php
class connect{
const DB_NAME = "blog";
const HOST = "mysql";
const USER = "user";
const PASS = "pass";
private $dbh;
public function __construct(){
$dsn = "mysql:host=" . self::HOST . ";dbname=" .self::DB_NAME . ";charset=utf8mb4";
try{
$this->dbh = new PDO($dsn, self::USER, self::PASS);
} catch(Exception $e) {
exit($e->getMessage());
}
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
public function query($sql, $param = null) {
$stmt = $this->dbh->prepare($sql);
$stmt->execute($param);
return $stmt;
}
}
?>
3行目〜6行目が個人的に大事だと思います、ここの設定が間違っていて1時間位悩みました。
3行目・5行目・6行目はdocker-compose.ymlの19行目・20行目・21行目を使います。
4行目のmysqlはdocker-compose.ymlの12行目のmysqlのことです。
テーブルの作成
dockerのコンテナの中のDBでテーブルを作成します。
コンテナの中に入るコマンドは下記になります。
docker exec -it php-container mysql -u user -p pass blog
「php-container」はdocker-compose.ymlの11行目で「blog」はdocker-compose.ymlの19行目です。
phpMyAdminにアクセス
docker-compose.ymlにphpMyAdminにアクセスする為の記述しています。
version: '3'
services:
php:
build:
context: .
volumes:
- .:/var/www/html
- ./php.ini:/usr/local/etc/php/php.ini
- ./logs:/var/log
ports:
- 8000:80
container_name: php-container
mysql:
platform: linux/x86_64
image: mysql:5.7
volumes:
- mysql_data:/var/lib/mysql
- ./mysql_custom.cnf:/etc/mysql/conf.d/mysql_custom.cnf
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=blog
- MYSQL_USER=user
- MYSQL_PASSWORD=pass
container_name: mysql5.7-trial2
//ここから
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
PMA_HOST: mysql
MYSQL_ROOT_PASSWORD: root
ports:
- 8080:80
depends_on:
- mysql
//ここまで
volumes:
mysql_data:
「http://localhost:8080」にアクセスするとユーザー名とパスワードを入力しないといけないのでconnect.phpの「const USER = “user”;」のuser(ユーザー名)と「const PASS = “pass”;」のpass(パスワード)を入力すればphpMyAdminに入れます。