Docker + PHP + MySQL開発環境
mysql環境の追加
前回のcgidocker環境をdbdockerにコピーしてmysqlデータベースを追加していきます。
ファイル構成
dbdocker
├──db
│ ├──data
│ └──ini.cnf
├──phpmyadmin
│ └──sessions
├──phpapache
│ ├──apache
│ │ └──cgialias.conf
│ ├──php
│ │ └──php.ini
│ └──Dockerfile
├──pub
│ ├──app
│ │ └──index.pl
│ └──html
│ ├──create.php
│ ├──insert.php
│ ├──select.php
│ ├──update.php
│ ├──delete.php
│ ├──drop.php
│ └──index.php
└──docker-compose.yml
dbdocker
├──db
│ ├──data
│ └──ini.cnf
├──phpmyadmin
│ └──sessions
├──phpapache
│ ├──apache
│ │ └──cgialias.conf
│ ├──php
│ │ └──php.ini
│ └──Dockerfile
├──pub
│ ├──app
│ │ └──index.pl
│ └──html
│ ├──create.php
│ ├──insert.php
│ ├──select.php
│ ├──update.php
│ ├──delete.php
│ ├──drop.php
│ └──index.php
└──docker-compose.yml
dbdocker/db/data
データベース用フォルダvolumesでリンクしています。
dbdocker/db/ini.cnf
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci [client] default-character-set=utf8mb4
mysqlの文字コード設定ファイル
dbdocker/phpmyadmin/sessions
phpmyadmin用sessionsデータフォルダvolumesでリンクしています。
dbdocker/phpapache/Dockerfile
# dockerイメージ FROM php:7.4-apache COPY ./php/php.ini /usr/local/etc/php/ COPY ./apache/cgialias.conf /etc/apache2/conf-available/ # インストール RUN apt-get update \ && apt-get install -y --no-install-recommends \ git \ zip \ unzip \ nano \ #python3 \ #ruby \ && apt-get -y clean \ && rm -rf /var/lib/apt/lists/* \ && a2enmod cgi \ && a2enmod rewrite \ && a2enconf cgialias RUN pecl install xdebug \ && docker-php-ext-enable xdebug \ && docker-php-ext-install pdo_mysql RUN useradd -o -U -m -u 1000 lifeup WORKDIR /var/www
変更点
#python3 \
#ruby \
は必要な人は、#をはずして下さい。
RUN pecl install xdebug \
&& docker-php-ext-enable xdebug \
&& docker-php-ext-install pdo_mysql
はデータベースmysqlとphpを繋ぐために必要なツールのインストールです。
dbdocker/docker-compose.yml
version: '3' services: webdb: container_name: webdb build: ./phpapache ports: - 80:80 # - 8000:8000 volumes: - ./pub:/var/www depends_on: - db db: image: mysql:5.7 container_name: mydb environment: MYSQL_ROOT_PASSWORD: rpass MYSQL_DATABASE: sqldb MYSQL_USER: dbuser MYSQL_PASSWORD: dbpass TZ: 'Asia/Tokyo' volumes: - ./db/data:/var/lib/mysql - ./db/ini.cnf:/etc/mysql/conf.d/ini.cnf ports: - 3306:3306
depends_on:
– db
「depends_on:」で「webdb」を「db」の後にビルドするように指定しています。db:
image: mysql:5.7
container_name: mydb
mysql公式のイメージを使用してビルドします。PHPから接続する際にhost=dbまたはhost=mydbで接続します。environment:
MYSQL_DATABASE: sqldb
MYSQL_ROOT_PASSWORD: rpass
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbpass
TZ: ‘Asia/Tokyo’
データベース名、rootのパスワード、ユーザー名+パスワードと日本時間に設定をしています。dbname=sqldbとし接続の際に必要になります。volumes:
– ./db/data:/var/lib/mysql
– ./db/ini.cnf:/etc/mysql/conf.d/ini.cnf
データ用ローカルフォルダ、設定用ファイルをサーバー側とリンクしています。ports:
– 3306:3306
データベース用ポートを「3306」で開いています。
– db
「depends_on:」で「webdb」を「db」の後にビルドするように指定しています。db:
image: mysql:5.7
container_name: mydb
mysql公式のイメージを使用してビルドします。PHPから接続する際にhost=dbまたはhost=mydbで接続します。environment:
MYSQL_DATABASE: sqldb
MYSQL_ROOT_PASSWORD: rpass
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbpass
TZ: ‘Asia/Tokyo’
データベース名、rootのパスワード、ユーザー名+パスワードと日本時間に設定をしています。dbname=sqldbとし接続の際に必要になります。volumes:
– ./db/data:/var/lib/mysql
– ./db/ini.cnf:/etc/mysql/conf.d/ini.cnf
データ用ローカルフォルダ、設定用ファイルをサーバー側とリンクしています。ports:
– 3306:3306
データベース用ポートを「3306」で開いています。
テーブル作成
dbdocker/pub/html/create.php
<?php try { $dsn = 'mysql:host=mydb;dbname=sqldb;port=3306; charset=utf8mb4'; $db = new PDO($dsn, 'dbuser', 'dbpass'); $sql = 'CREATE TABLE IF NOT EXISTS user ( id INT(7) AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT(3) )'; //$res = $db->query($sql); $res = $db->exec($sql); echo "テーブル作成OK!"; } catch (PDOException $e) { echo $e->getMessage(); exit; } $db = null;
上記の場合query($sql)でも動きますが、exec($sql)を使った方が良いようです。
返値を必要とする検索(読み込み)の場合等は、query($sql)を使います。(id name age)カラムを持ったuser テーブルを作成
テーブルの作成
CREATE TABLE tablename ()
CREATE TABLE IF NOT EXISTS tablename ()
id : カラム名
INT(7) : 7桁の整数
AUTO_INCREMENT : オートナンバリング
PRIMARY KEY : 一意の、重複禁止
name :
VARCHAR(255) : 256バイトの可変長文字列
age :
INT(3) : 3桁の整数
レコード作成
dbdocker/pub/html/insert.php
<?php try { $dsn = 'mysql:host=mydb;dbname=sqldb;port=3306; charset=utf8mb4'; $db = new PDO($dsn, 'dbuser', 'dbpass'); $sql = 'INSERT INTO user(name,age) VALUES ("大谷","26")'; //$res = $db->query($sql); $res = $db->exec($sql); echo "レコード入力OK!"; } catch (PDOException $e) { echo $e->getMessage(); exit; } $db = null;
データ検索
dbdocker/pub/html/select.php
<?php try { $dsn = 'mysql:host=mydb;dbname=sqldb;port=3306; charset=utf8mb4'; $db = new PDO($dsn, 'dbuser', 'dbpass'); $sql = 'SELECT * FROM user'; $dat = $db->query($sql); if( !empty($dat) ) { foreach( $dat as $val ) { var_dump($val['id']); var_dump($val['name']); var_dump($val['age']); } } } catch (PDOException $e) { echo $e->getMessage(); exit; } $db = null;
返値$datを使う場合exec($sql)では無くquery($sql)を使います。
データの更新
dbdocker/pub/html/update.php
<?php try { $dsn = 'mysql:host=mydb;dbname=sqldb;port=3306; charset=utf8mb4'; $db = new PDO($dsn, 'dbuser', 'dbpass'); $sql = 'UPDATE user SET age = age + 1'; //$res = $db->query($sql); $res = $db->exec($sql); echo "アップデート入力OK!"; } catch (PDOException $e) { echo $e->getMessage(); exit; } $db = null;
レコードの削除
dbdocker/pub/html/delete.php
<?php try { $dsn = 'mysql:host=mydb;dbname=sqldb;port=3306; charset=utf8mb4'; $db = new PDO($dsn, 'dbuser', 'dbpass'); $sql = "DELETE FROM user WHERE id = 1"; //$res = $db->query($sql); $res = $db->exec($sql); echo "レコード削除OK!"; } catch (PDOException $e) { echo $e->getMessage(); exit; } $db = null;
テーブルの削除
dbdocker/pub/html/drop.php
<?php try { $dsn = 'mysql:host=mydb;dbname=sqldb;port=3306; charset=utf8mb4'; $db = new PDO($dsn, 'dbuser', 'dbpass'); $sql = 'DROP TABLE IF EXISTS user'; //$res = $db->query($sql); $res = $db->exec($sql); echo "テーブル削除OK!"; } catch (PDOException $e) { echo $e->getMessage(); exit; } $db = null;