20191011のMySQLに関する記事は3件です。

【Docker環境構築】PHP5.3.3 + Apache + MySQL + phpMyAdminにFuelPHPをインストール

概要

既存の社内システム改修をする必要があり、PHP5.3.3、FuelPHP 1.7.2 1.7.3、Apache、MySQLという構成で、Dockerで環境構築を行いました。

調べたところPHP5.3.3は2010年頃にリリースされたらしくかなりレガシーなバージョンになるようで、記事があまり見つからない中のDocker環境構築は大変でした(最終的には色々な記事を参考になんとか構築できました・・・)。

自分が1から再構築できるようにDockerfile、docker-compose.ymlの解説や手順等を改めてまとめておこうと思います。

先に下記の先人のおかげでこの構成ができたことを感謝申し上げます!
自分の記事は先人の記事をほぼ組み合わせた感じになります。

PHP5.3.3環境を2017年に用意する方法 - Qiita
docker-compose で PHP7.2 + Apache + MySQL + phpMyAdmin 環境を構築 - Qiita
Docker 仮想CentOS6を動かす - @//メモ

ディレクトリ構成と手順

すぐ動かしたい方は、本記事と同じ構成のものをGithubに上げているのでそちらをご覧ください。本記事では、この構成を作成するまでの流れをやっていきます

追記情報は最後の方で確認してください

├─docker
│  ├─httpd
│  │  └─httpd.conf
│  └─php
│     ├─Dockerfile
│     └─php.ini
└─docker-compose.yml

docker-compose.yml

docker-compose.yml
version: '3'

services:
  php:
    build:
      context: ./docker/php/
      dockerfile: Dockerfile
    volumes:
      - .:/app
      - ./docker/php/php.ini:/etc/php.ini
      - ./docker/httpd/httpd.conf:/etc/httpd/conf/httpd.conf
    ports:
      - 8080:80
  mysql:
    image: mysql:5.7
    volumes:
      - ./docker/mysql/volumes:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions

docker/httpd/httpd.conf

httpd.conf
~~長いので省略~~

初期設定からの変更点①
#ServerName www.example.com:80
↓
ServerName www.example.com:80

初期設定からの変更点②
DocumentRoot "/var/www/html"
↓
DocumentRoot "/app"

docker/php/Dockerfile

Dockerfile
FROM centos:6.9

ENV PHP_VERSION 5.3.3

RUN yum install -y \
        php \
        php-mbstring \
        php-pgsql \
        php-mysql \
        php-gd \
        zip \
        unzip \
        git \
        httpd && \
    yum clean all

RUN mkdir /app
WORKDIR /app

EXPOSE 80

CMD ["/usr/sbin/apachectl","-DFOREGROUND"]

docker/php/php.ini

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

PHP5.3.3が動く環境を用意する

PHP5.3.3をまずインストールしなけなればいけません。
自分はすんなり@suinさんの記事をすぐに見つけられたので幸運です。
PHP5.3.3環境を2017年に用意する方法 - Qiita

うまくいった方法はCentOS 6.9でyum install phpすること。なんとRedHatは未だにPHP5.3をサポートしている。

一応、まだ過去バージョンで5.3.3もインストールできるみたいでした(僕は試していませんが…)。
PHP: Releases
windows.php.net - /downloads/releases/archives/
参考:旧バージョンのPHPをダウンロードする方法 | jMatsuzaki

CentOS 6.9のDockerイメージダウンロード

CentOS 6.9でphp5.3がインストールできるみたいなので、CentOS 6.9のイメージからコンテナを起動してコンテナ内でphpのインストールを試して、上手く行ったらDockerfileに記載していくという方法でやってみます。

CentOS 6.9をインストールするDockerfileを用意

Dockerfile
FROM centos:6.9

CentOS 6.9のDockerイメージをビルド

用意したら、Dockerfileがあるディレクトリに移動後、イメージをビルドします。

$ docker build .

ビルドされるとエラーが表示されました。

SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All
files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to
double check and reset permissions for sensitive files and directories.
セキュリティ警告:WindowsからWindows以外のDockerホストに対してDockerイメージを構築しています。すべて
ビルドコンテキストに追加されたファイルとディレクトリには、「-rwxr-xr-x」権限が付与されます。お勧めです
機密性の高いファイルとディレクトリのアクセス許可を再確認してリセットします。

windowsからwindows以外のイメージを作成したため、パーミッションの警告のようです。とりあえず今回は無視します。

イメージの確認

確認できました。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              6.9                 2199b8eb8390        7 months ago        195MB

コンテナ起動

イメージ名を指定して、コンテナを起動しログインします。

$ docker run -it centos:6.9 /bin/bash

コンテナでphpインストールまで

ログインしたら、環境変数を設定します。

$ export PHP_VERSION=5.3.3
$ echo $PHP_VERSION
=> 5.3.3

phpをインストールします。

$ yum install -y php

phpのバージョン確認。php5.3.3がインストールされました!

$ php -v
PHP 5.3.3 (cli) (built: Mar 22 2017 12:27:09)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

あとは必要なモジュールを同じように確認しながらインストールしていきます(モジュールは環境に応じて適宜インストール。zip、unzip、git、httpdはFuelPHPを使う際に必須でした。ないとエラーが出ます。)。

$ yum install -y php-mbstring
$ yum install -y php-pgsql
$ yum install -y php-mysql
$ yum install -y php-gd
$ yum install -y zip
$ yum install -y unzip
$ yum install -y git
$ yum install -y httpd

Apacheが起動するか確認

コンテナにログインした状態で作業を続けます。

$ /usr/sbin/apachectl -DFOREGROUND

ServerNameのエラーが出ると思いますがここでは無視します。
Enterを押して、うごけばとりあえずOKです。

確認したら、Ctrl + Cで起動を停止します。

コンテナでの作業は終わりですので、Ctrl + Dで抜けておきましょう。

動作確認したコマンドをDockerfileに反映

先程、コンテナで実際に入力したコマンドをDockerfileを反映すると下記のようになります。

完成したDockerfile
FROM centos:6.9

ENV PHP_VERSION 5.3.3

RUN yum install -y \
        php \
        php-mbstring \
        php-pgsql \
        php-mysql \
        php-gd \
        zip \
        unzip \
        git \
        httpd && \
    yum clean all

RUN mkdir /app
WORKDIR /app

EXPOSE 80

CMD ["/usr/sbin/apachectl","-DFOREGROUND"]

先程のコンテナ時点でなかったものがあると思います。
そちらの説明です。

yum clean allはDockerイメージの容量を減らすためのよくあるTIPSらしいです。

RUN mkdir /app WORKDIR /appはappフォルダを作成して、作業フォルダをappに指定しています。のちほど、appフォルダにfuelphpのファイルを展開するときに必要になります。

EXPOSE 80は、コンテナのポート80番を使うよみたいな感じです。実際にポートが公開されるわけではなさそうです。わかりやすいように明示しておきます。

再度、ビルドを行いApacheが起動することを確認する

ここは一気にやってしまいましょう。

# ビルド時にイメージ名をつける
$ docker build -t cnetos_php:6.9 .

# -p: ホストのポート8080 を コンテナのポート 80 にバインド(割り当て)します。
# -d: バックグラウンドで起動
$ docker run -p 8080:80 -d cnetos_php:6.9

# コンテナが起動していることを確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
a9337cd1cef7        cnetos_php:6.9      "/usr/sbin/apachectl…"   7 seconds ago       Up 5 seconds        0.0.0.0:8080->80/tcp   inspiring_ride

http://localhost:8080/ にアクセス。

以下の画面が表示されていれば成功です!
image.png

起動が確認できたら、コンテナを停止しておきます。

docker stop コンテナ名またはコンテナID

php用のdocker-compose.ymlを用意

最終的にはdocker-compose up -dで一発起動するようにするので、docker-compose.ymlを作っていきます。

ディレクトリ構成

まず、以下のようなディレクトリ構成にします。

作成したDockerfileはdocker/php配下に配置してください。
ないフォルダは作成してください。
その他のファイルは次で説明します。

├─docker
│  ├─httpd
│  │  └─httpd.conf
│  └─php
│     ├─Dockerfile
│     └─php.ini
└─docker-compose.yml

docker-compose.yml

docker-compose.ymlは以下の通りです。

docker-compose.yml
version: '3'

services:
  php:
    build:
      context: ./docker/php/
      dockerfile: Dockerfile
    volumes:
      - .:/app
      - ./docker/php/php.ini:/etc/php.ini
      - ./docker/httpd/httpd.conf:/etc/httpd/conf/httpd.conf
    ports:
      - 8080:80

サービス名はphpにしています。

buildでは、./docker/php/Dockerfileを指定。

volumesでは、dockerフォルダのphp.iniとhttpd.confの設定をコンテナに反映し、コンテナのappフォルダをマウントしホストから今後ファイル編集できるようにしています。

portsでは、ホストのポート8080番とコンテナのポート80番をつなげています。

これでホストの http://localhost:8080/ にアクセスすると、コンテナの80番に転送され、/appの内容が表示されます(documentrootはhttpd.confで設定しています)。

php.ini

php.iniは以下の通りです。

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

httpd.conf

httpd.confは、コンテナ内部からhttpd.confファイルをコピーしてきます。

# コピーするには「docker cp」コマンドを使用します。
# 引数は「コンテナID:コンテナパス ローカルパス」と指定します。

$ docker cp コンテナID:/etc/httpd/conf/httpd.conf docker/httpd/

コピーできたら、下記の部分を変更します。
httpd.confの変更点は以下の通りです。

httpd.conf
~~長いので省略~~

初期設定からの変更点①
#ServerName www.example.com:80
↓
ServerName www.example.com:80

初期設定からの変更点②
DocumentRoot "/var/www/html"
↓
DocumentRoot "/app"

php用のdocker-compose.ymlを起動

先程のdocker-compose.ymlをもとに、ビルドして起動します。

docker-compose build
docker-compose up -d

http://localhost:8080/ にアクセスすると、Apacheの画面が表示されると思います。

ホストのfuel-app/の中にindex.phpを作って、再度アクセスしてみましょう。

index.php
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>php5.3.3-apache</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<?php phpinfo(); ?>
</body>
</html>

以下の画面が表示されたら、成功です!

image.png

コンテナは止めておきましょう。

docker-compose stop

ここまでで、PHP5.3.3とApacheの環境ができました。

残るMySQLとphpMyAdminが動く環境を用意する。

残りのMySQLとphpMyAdminはどちらとも公式イメージを使うので、docker-compose.ymlで完結します。

MySQLのdocker-compose.yml

以下の内容を追加するだけです。

docker-compose.yml
  mysql:
    image: mysql:5.7
    volumes:
      - ./docker/mysql/volumes:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test

imageは、公式のイメージを使用しています。

volumesは、コンテナの/var/lib/mysqlにMySQLな大事な設定ファイルが入るのでそれをホスト側で見れるにしています。また、コンテナを停止してもvolumesは削除しない限り消えないので、データが永続化されます。

environmentでは、環境変数を設定しています。意味は、docker hubを見るとわかりやすいです。

mysql - Docker Hub

これで、docker-compose up -dすると、mysqlコンテナが出来上がります。
コンテナログイン後、mysql -uroot -prootでmysqlにログインできます。

phpmyadminのdocker-compose.yml

以下の内容を追記するだけです。

docker-compose.yml
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./phpmyadmin/sessions:/sessions

imageは、公式のイメージを使っています。

environmentでは、環境変数を設定しています。これもdocker hubを見るとわかりやすいです。

phpmyadmin/phpmyadmin - Docker Hub

これで、docker-compose up -dして、http://localhost:4040/ にアクセスするとphpMyAdminが開きます!

image.png

最終的なdocker-compose.yml

最終的には下記のようになります。

docker-compose up -dして正常に動くか確認してみてください。

docker-compose.yml
version: '3'

services:
  php:
    build:
      context: ./docker/php/
      dockerfile: Dockerfile
    volumes:
      - .:/app
      - ./docker/php/php.ini:/etc/php.ini
      - ./docker/httpd/httpd.conf:/etc/httpd/conf/httpd.conf
    ports:
      - 8080:80
  mysql:
    image: mysql:5.7
    volumes:
      - ./docker/mysql/volumes:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions

FuelPHPをインストールしてFuelPHPの画面を表示するまでの流れ

GitHubのREADME.mdに詳しく書いてあるのでそちらを参照してください。

さいごに

ここまでくるのに約2日かかりました。。
fuelphp自体が初めてで、何が必要か理解するまでに時間がかかりました。

fuelphpのインストールをシェルスクリプトで完結させたり、httpd.confをわざわざ2回修正したり(documentrootは存在しているディレクトリである必要がある)しているので、もうすこしいい感じにできたらしたいなーと思います。

→ httpd.confはVirtualHost機能を使うことで存在しないディレクトリを指定しても、コンテナが立ち上がるようになったので解決!

あと、正直なところがっつりfuelphpで動かしてみていないのでMySQLの連携はこれで大丈夫か心配だったりします。

とりあえずfuelphpのチュートリアルをいくつかやってみて不具合があれば修正していきます。

2019.10.12追記

phpコンテナで php oil refine migrate でマイグレーションを実行するとエラーになる。
原因は、phpコンテナとmysqlコンテナはつながっていないため、
phpコンテナから /var/lib/mysql/mysql.sock を見に行ってもないと怒られていた。

Uncaught exception Fuel\Core\Database_Exception: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
Callstack: 
#0 /app/fuel-app/fuel/core/classes/database/pdo/connection.php(193): Fuel\Core\Database_PDO_Connection->connect()
#1 /app/fuel-app/fuel/core/classes/database/query.php(305): Fuel\Core\Database_PDO_Connection->query(1, 'SELECT * FROM `...', false)
#2 /app/fuel-app/fuel/core/classes/dbutil.php(644): Fuel\Core\Database_Query->execute(NULL)
#3 /app/fuel-app/fuel/core/classes/migrate.php(608): Fuel\Core\DBUtil::table_exists('migration')
#4 /app/fuel-app/fuel/core/classes/migrate.php(74): Fuel\Core\Migrate::table_version_check()
#5 [internal function]: Fuel\Core\Migrate::_init()
#6 /app/fuel-app/fuel/core/classes/autoloader.php(375): call_user_func('Migrate::_init')
#7 /app/fuel-app/fuel/core/classes/autoloader.php(249): Fuel\Core\Autoloader::init_class('Migrate')
#8 [internal function]: Fuel\Core\Autoloader::load('Migrate')
#9 /app/fuel-app/fuel/core/tasks/migrate.php(235): spl_autoload_call('Migrate')
#10 /app/fuel-app/fuel/core/tasks/migrate.php(161): Fuel\Tasks\Migrate::_run('default', 'app')
#11 /app/fuel-app/fuel/core/base.php(455): Fuel\Tasks\Migrate->__call('run', Array)
#12 /app/fuel-app/fuel/core/base.php(455): Fuel\Tasks\Migrate->run()
#13 /app/fuel-app/fuel/packages/oil/classes/refine.php(108): call_fuel_func_array(Array, Array)
#14 [internal function]: Oil\Refine::run('migrate', Array)
#15 /app/fuel-app/fuel/packages/oil/classes/command.php(126): call_user_func('Oil\Refine::run', 'migrate', Array)
#16 /app/fuel-app/oil(68): Oil\Command::init(Array)
#17 {main}

Previous exception: 
Uncaught exception PDOException: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
Callstack: 
#0 /app/fuel-app/fuel/core/classes/database/pdo/connection.php(95): PDO->__construct('mysql:host=loca...', 'root', 'root', Array)
#1 /app/fuel-app/fuel/core/classes/database/pdo/connection.php(193): Fuel\Core\Database_PDO_Connection->connect()
#2 /app/fuel-app/fuel/core/classes/database/query.php(305): Fuel\Core\Database_PDO_Connection->query(1, 'SELECT * FROM `...', false)
#3 /app/fuel-app/fuel/core/classes/dbutil.php(644): Fuel\Core\Database_Query->execute(NULL)
#4 /app/fuel-app/fuel/core/classes/migrate.php(608): Fuel\Core\DBUtil::table_exists('migration')
#5 /app/fuel-app/fuel/core/classes/migrate.php(74): Fuel\Core\Migrate::table_version_check()
#6 [internal function]: Fuel\Core\Migrate::_init()
#7 /app/fuel-app/fuel/core/classes/autoloader.php(375): call_user_func('Migrate::_init')
#8 /app/fuel-app/fuel/core/classes/autoloader.php(249): Fuel\Core\Autoloader::init_class('Migrate')
#9 [internal function]: Fuel\Core\Autoloader::load('Migrate')
#10 /app/fuel-app/fuel/core/tasks/migrate.php(235): spl_autoload_call('Migrate')
#11 /app/fuel-app/fuel/core/tasks/migrate.php(161): Fuel\Tasks\Migrate::_run('default', 'app')
#12 /app/fuel-app/fuel/core/base.php(455): Fuel\Tasks\Migrate->__call('run', Array)
#13 /app/fuel-app/fuel/core/base.php(455): Fuel\Tasks\Migrate->run()
#14 /app/fuel-app/fuel/packages/oil/classes/refine.php(108): call_fuel_func_array(Array, Array)
#15 [internal function]: Oil\Refine::run('migrate', Array)
#16 /app/fuel-app/fuel/packages/oil/classes/command.php(126): call_user_func('Oil\Refine::run', 'migrate', Array)
#17 /app/fuel-app/oil(68): Oil\Command::init(Array)
#18 {main}

まず、mysqlコンテナを調べると、 /var/lib/mysql/mysql.sockはなくあったのは/var/run/mysqld/mysqld.sock
この場合、/var/run/mysqld/mysqld.sockをphpコンテナから見えるようにしてあげればいい。
ただ、phpコンテナから見ているのは、/var/lib/mysql/mysql.sockであったため、/var/run/mysqld/mysqld.sockにするとphpコンテナを修正する手間があった。

そのため、今回phpコンテナ側は修正をしたくなかったので、/var/lib/mysql/mysql.sockに合わせることにした。

①mysqlコンテナの/etc/mysql/my.cnfをホストの/docker/mysql/my.cnfでマウント。
設定は、/var/lib/mysql/mysql.sockを見るようにした。
② ①の対応をした上で、phpコンテナからも/etc/mysql/my.cnfをホストの/docker/mysql/my.cnfでマウント。

phpコンテナからも/var/lib/mysql/mysql.sockが見えるようになったことでMySQLとの通信が成功し、マイグレーションも成功した。

変更ファイルは以下の通り。

my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
docker-compose.yml
version: '3'

services:
  php:
    build:
      context: ./docker/php/
      dockerfile: Dockerfile
    volumes:
      - .:/app
      - ./docker/php/php.ini:/etc/php.ini
      - ./docker/httpd/httpd.conf:/etc/httpd/conf/httpd.conf
      - ./docker/mysql/volumes:/var/lib/mysql
    ports:
      - 8080:80
  mysql:
    image: mysql:5.7
    volumes:
      - ./docker/mysql/my.cnf:/etc/mysql/my.cnf
      - ./docker/mysql/volumes:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions

2019.10.13追記その1

fuelphpのディレクトリ構成を変更したので、それに合わせてhttpd.conf修正しました。

fuelphpを含んだディレクトリ構成は下記のようになりました。

├─docker
│  ├─httpd
│  │  └─httpd.conf
│  ├─mysql
│  │  └─my.conf
│  └─php
│     ├─Dockerfile
│     └─php.ini
├─sample(fuelphp)
└─docker-compose.yml

httpd.confの変更点は以下の通りです。

httpd.conf
# ①ServerNameは、VirtualHostを使うのでコメントアウト
#ServerName www.example.com:80

# ②Documentorootも、VirtualHostを優先して使わないのでデフォルト設定に戻した
DocumentRoot "/var/www/html"

# ③NameVirtualHostをコメントイン。localhost:80に対して、仮想ホストを設定
NameVirtualHost *:80

# ④VirtualHostの設定を追加。localhost:8080 → localhost:80に転送され、下記の設定が有効になる。htaccessを有効にするために、AllowOverride Allにしている。
<VirtualHost *:80>
  DocumentRoot /var/www/html/public
  ServerName localhost
  <Directory /var/www/html/public>
    Order Allow,Deny
    Allow from All
    Options All
    AllowOverride All
    DirectoryIndex index.php index.html
  </Directory>
</VirtualHost>

2019.10.13追記その2

いざFuelPHP触ってチュートリアルでもやろうかなーと思ったらデバッガー入れてないと思い、試行錯誤して入れました。
変更点は下記です。

Dockerfile
FROM centos:6.9

ENV PHP_VERSION 5.3.3

RUN yum install -y \
        php \
        php-mbstring \
        php-pgsql \
        php-mysql \
        php-gd \
        zip \
        unzip \
        git \
        httpd \
        php-devel \
        httpd-devel \
        php-pear \
        gcc && \
    yum clean all

RUN pecl channel-update pecl.php.net && \
    pecl install xdebug-2.2.7

RUN mkdir /app
WORKDIR /app

EXPOSE 80

CMD ["/usr/sbin/apachectl","-DFOREGROUND"]

peclをインストール必要があったので、php-devel、httpd-devel、php-pearをインストール。

CentOS 6、peclコマンドを使えるようにする|マコトのおもちゃ箱 ~ぼへぼへ自営業者の技術メモ~

peclでxdebugをインストールする際にgccが必要だったので、gccもインストール。インストール時にpeclのエラーがでたので、pecl channel-update pecl.php.netを追加。
xdebugは5.3系が使える2.2.7を指定。

PHPでモジュールを読み込むよう設定ファイルを作成しました。

PHP5.3系にxdebugをインストールする際のあれこれ | Skyarch Broadcasting

xdebug.ini
zend_extension=/usr/lib64/php/modules/xdebug.so

ホスト側のxdebug.iniを読み込むようにdocker-compose.ymlのvolumesに追加。

docker-compose.yml
version: '3'

services:
  php:
    build:
      context: ./docker/php/
      dockerfile: Dockerfile
    volumes:
      - .:/app
      - ./docker/php/php.ini:/etc/php.ini
      - ./docker/httpd/httpd.conf:/etc/httpd/conf/httpd.conf
      - ./docker/mysql/volumes:/var/lib/mysql
      - ./docker/php/xdebug.ini:/etc/php.d/xdebug.ini
    ports:
      - 8080:80
  mysql:
    image: mysql:5.7
    volumes:
      - ./docker/mysql/my.cnf:/etc/mysql/my.cnf
      - ./docker/mysql/volumes:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=test
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 4040:80
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions

あとは、xdebugがVScodeが使えるようにするための設定を追加しています。

Docker × Visual Studio CodeでPHP開発【デバッグ実行】 - Qiita

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
; ホスト側のIP
; host.docker.internalはdockerのhostマシンのIPを解決してくれます。
; hostマシン以外のIPの場合は適宜IPを調べて設定してください。
xdebug.remote_host=host.docker.internal
; 空いているport番号(xdebugのデフォルトは9000)。私の場合は他と競合していたので9001に設定。
xdebug.remote_port=9001
; xdebugの出力するログの場所。今回は適当に/tmp配下に。
xdebug.remote_log=/tmp/xdebug.log
launch.json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
      {
        "name": "Listen for XDebug",
        "type": "php",
        "request": "launch",
        "port": 9001,
        "pathMappings": {
          // Dockerコンテナのdocument root : 開発環境のdocument root
          "/app/sample/public":"${workspaceFolder}/sample/public" 
        }
      }
    ]
  }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

主なRDMBS(Oracle, MySQL, PostgreSQL)の機能比較

全国で利用されているDBの分布は以下のようになっているらしいです。
スクリーンショット 2019-10-11 2.07.32.png

この中でも特に、Oracle, MySQL, PostgreSQLに焦点をあててそれぞれの機能を簡単に比較したので、それをまとめました。

Oracleの主な特徴

  • Oracle社が開発・販売する商用RDBMS

行レベルロック

  • 複数のユーザーが同一の表の別の行に同時にアクセスするのでパフォーマンスが高い

読み取り一貫性

  • ダーティ・リード(更新前の情報と更新後の情報の両方を取得)が発生しないように、更新前データのみを取得する

堅牢性

  • Oracle Data Guardと呼ばれる、災害時やデータ破損時などあらゆる障害からデータベースを保護し、サービスの継続を可能にするシステムが存在している

移植性

  • Oracle Databaseは全てC言語で書かれいているので、幅広い運用が可能
  • 管理や開発の効率化のための様々なツールが利用できる

その他特徴

  • トランザクションが自動的に開始する
  • DDL(データ定義言語)やDCL(データ制御言語)の実行後に、コミットが自動的に行われる

MySQL, PostgreSQLとの比較

  • MySQLは、MySQL ABが開発したRDBMSだが、現在の管理運営はOracle社が行っている
  • PostgreSQLは、PostgreSQL Global Development Groupによって開発が行われている

ライセンスの違い

  • Oracleは高機能高性能のため圧倒的に高いです
  • PostgreSQLはオープンソースソフトウェア

スクリーンショット 2019-10-11 2.06.29.png

派生したDBの種類

  • PostgreSQLとMySQLは派生したデータベースが多く存在し利用されています。

スクリーンショット 2019-10-11 2.20.01.png

ストレージアーキテクチャの違い

  • OracleやMySQLが「更新型」のアーキテクチャなのに比べて、PostgreSQLはストレージの管理方法が「追記型」のため、既存のデータの書き換えを行うことなく空いている領域を使って更新データを追記している
    • 更新型 : 対象レコードをそのまま更新
    • 追記型 : 既存レコードを保持したまま、新規レコードを追加して参照先を変更
      • なお、データ量についてはバキューム機能(VACUUM)により解決しているそう

スクリーンショット 2019-10-11 2.26.34.png

データベースの機能比較

  • データ型や命名規制, 書式等はそれぞれ異なる形式になっているが大きな差は無い
  • Oracleはチェック制約があるが、MySQLではトリガーで実装する必要がある
  • OracleにはシーケンスがあるがMySQLにはなく、代わりに自動インクリメントで定義
  • Oracleはシノニム(オブジェクトに対する別名を定義)があるのに対し、MySQLとPostgreSQLには無い
  • OracleはNULLとあkら文字は同一判定だが、MySQLとPostgreSQLでは別枠
  • Oracleはトランザクションは任意単位だが、MySQLとPostgreSQLは基本的にSQL文単位で確定
  • その他、実行計画の違いやヒント句の有無など

スクリーンショット 2019-10-11 2.27.53.png

参考資料

知ってるようで知らない!Oracle(オラクル)とは
2017年データベースの選択は
SQLの観点から「Oracle Database」「PostgreSQL」「MySQL」の特徴を整理しよう
PostgreSQLとMySQL、使うならどっち? データベース専門家が8つの視点で徹底比較!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

主なRDB(Oracle, MySQL, PostgreSQL)の機能比較

全国で利用されているDBの分布は以下のようになっているらしいです。
スクリーンショット 2019-10-11 2.07.32.png

この中でも特に、Oracle, MySQL, PostgreSQLに焦点をあててそれぞれの機能を簡単に比較したので、それをまとめました。

Oracleの主な特徴

  • Oracle社が開発・販売する商用RDBMS

行レベルロック

  • 複数のユーザーが同一の表の別の行に同時にアクセスするのでパフォーマンスが高い

読み取り一貫性

  • ダーティ・リード(更新前の情報と更新後の情報の両方を取得)が発生しないように、更新前データのみを取得する

堅牢性

  • Oracle Data Guardと呼ばれる、災害時やデータ破損時などあらゆる障害からデータベースを保護し、サービスの継続を可能にするシステムが存在している

移植性

  • Oracle Databaseは全てC言語で書かれいているので、幅広い運用が可能
  • 管理や開発の効率化のための様々なツールが利用できる

その他特徴

  • トランザクションが自動的に開始する
  • DDL(データ定義言語)やDCL(データ制御言語)の実行後に、コミットが自動的に行われる

MySQL, PostgreSQLとの比較

  • MySQLは、MySQL ABが開発したRDBMSだが、現在の管理運営はOracle社が行っている
  • PostgreSQLは、PostgreSQL Global Development Groupによって開発が行われている

ライセンスの違い

  • Oracleは高機能高性能のため圧倒的に高いです
  • PostgreSQLはオープンソースソフトウェア

スクリーンショット 2019-10-11 2.06.29.png

派生したDBの種類

  • PostgreSQLとMySQLは派生したデータベースが多く存在し利用されています。

スクリーンショット 2019-10-11 2.20.01.png

ストレージアーキテクチャの違い

  • OracleやMySQLが「更新型」のアーキテクチャなのに比べて、PostgreSQLはストレージの管理方法が「追記型」のため、既存のデータの書き換えを行うことなく空いている領域を使って更新データを追記している
    • 更新型 : 対象レコードをそのまま更新
    • 追記型 : 既存レコードを保持したまま、新規レコードを追加して参照先を変更
      • なお、データ量についてはバキューム機能(VACUUM)により解決しているそう

スクリーンショット 2019-10-11 2.26.34.png

データベースの機能比較

  • データ型や命名規制, 書式等はそれぞれ異なる形式になっているが大きな差は無い
  • Oracleはチェック制約があるが、MySQLではトリガーで実装する必要がある
  • OracleにはシーケンスがあるがMySQLにはなく、代わりに自動インクリメントで定義
  • Oracleはシノニム(オブジェクトに対する別名を定義)があるのに対し、MySQLとPostgreSQLには無い
  • OracleはNULLと空文字は同一判定だが、MySQLとPostgreSQLでは別枠
  • Oracleはトランザクションは任意単位だが、MySQLとPostgreSQLは基本的にSQL文単位で確定
  • その他、実行計画の違いやヒント句の有無など

スクリーンショット 2019-10-11 2.27.53.png

参考資料

知ってるようで知らない!Oracle(オラクル)とは
2017年データベースの選択は
SQLの観点から「Oracle Database」「PostgreSQL」「MySQL」の特徴を整理しよう
PostgreSQLとMySQL、使うならどっち? データベース専門家が8つの視点で徹底比較!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む