Docker + PHP + MySQL開発環境

Docker
スポンサーリンク

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

データベース用フォルダ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」で開いています。

テーブル作成

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;

 

タイトルとURLをコピーしました