- 投稿日:2019-10-11T19:26:30+09:00
【Docker環境構築】PHP5.3.3 + Apache + MySQL + phpMyAdminにFuelPHPをインストール
概要
既存の社内システム改修をする必要があり、PHP5.3.3、FuelPHP
1.7.21.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.ymldocker-compose.yml
docker-compose.ymlversion: '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:/sessionsdocker/httpd/httpd.conf
httpd.conf~~長いので省略~~ 初期設定からの変更点① #ServerName www.example.com:80 ↓ ServerName www.example.com:80 初期設定からの変更点② DocumentRoot "/var/www/html" ↓ DocumentRoot "/app"docker/php/Dockerfile
DockerfileFROM 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をダウンロードする方法 | jMatsuzakiCentOS 6.9のDockerイメージダウンロード
CentOS 6.9でphp5.3がインストールできるみたいなので、CentOS 6.9のイメージからコンテナを起動してコンテナ内でphpのインストールを試して、上手く行ったらDockerfileに記載していくという方法でやってみます。
CentOS 6.9をインストールするDockerfileを用意
DockerfileFROM centos:6.9CentOS 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.3phpをインストールします。
$ yum install -y phpphpのバージョン確認。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 httpdApacheが起動するか確認
コンテナにログインした状態で作業を続けます。
$ /usr/sbin/apachectl -DFOREGROUNDServerNameのエラーが出ると思いますがここでは無視します。
Enterを押して、うごけばとりあえずOKです。確認したら、Ctrl + Cで起動を停止します。
コンテナでの作業は終わりですので、Ctrl + Dで抜けておきましょう。
動作確認したコマンドをDockerfileに反映
先程、コンテナで実際に入力したコマンドをDockerfileを反映すると下記のようになります。
完成したDockerfileFROM 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_ridehttp://localhost:8080/ にアクセス。
起動が確認できたら、コンテナを停止しておきます。
docker stop コンテナ名またはコンテナIDphp用のdocker-compose.ymlを用意
最終的にはdocker-compose up -dで一発起動するようにするので、docker-compose.ymlを作っていきます。
ディレクトリ構成
まず、以下のようなディレクトリ構成にします。
作成したDockerfileはdocker/php配下に配置してください。
ないフォルダは作成してください。
その他のファイルは次で説明します。├─docker │ ├─httpd │ │ └─httpd.conf │ └─php │ ├─Dockerfile │ └─php.ini └─docker-compose.ymldocker-compose.yml
docker-compose.ymlは以下の通りです。
docker-compose.ymlversion: '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 -dhttp://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>以下の画面が表示されたら、成功です!
コンテナは止めておきましょう。
docker-compose stopここまでで、PHP5.3.3とApacheの環境ができました。
残るMySQLとphpMyAdminが動く環境を用意する。
残りのMySQLとphpMyAdminはどちらとも公式イメージを使うので、docker-compose.ymlで完結します。
MySQLのdocker-compose.yml
以下の内容を追加するだけです。
docker-compose.ymlmysql: image: mysql:5.7 volumes: - ./docker/mysql/volumes:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=test - MYSQL_USER=test - MYSQL_PASSWORD=testimageは、公式のイメージを使用しています。
volumesは、コンテナの
/var/lib/mysql
にMySQLな大事な設定ファイルが入るのでそれをホスト側で見れるにしています。また、コンテナを停止してもvolumesは削除しない限り消えないので、データが永続化されます。environmentでは、環境変数を設定しています。意味は、docker hubを見るとわかりやすいです。
これで、docker-compose up -dすると、mysqlコンテナが出来上がります。
コンテナログイン後、mysql -uroot -proot
でmysqlにログインできます。phpmyadminのdocker-compose.yml
以下の内容を追記するだけです。
docker-compose.ymlphpmyadmin: image: phpmyadmin/phpmyadmin environment: - PMA_ARBITRARY=1 - PMA_HOST=mysql - PMA_USER=root - PMA_PASSWORD=root links: - mysql ports: - 4040:80 volumes: - ./phpmyadmin/sessions:/sessionsimageは、公式のイメージを使っています。
environmentでは、環境変数を設定しています。これもdocker hubを見るとわかりやすいです。
phpmyadmin/phpmyadmin - Docker Hub
これで、docker-compose up -dして、http://localhost:4040/ にアクセスするとphpMyAdminが開きます!
最終的なdocker-compose.yml
最終的には下記のようになります。
docker-compose up -dして正常に動くか確認してみてください。
docker-compose.ymlversion: '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:/sessionsFuelPHPをインストールして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.sockdocker-compose.ymlversion: '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:/sessions2019.10.13追記その1
fuelphpのディレクトリ構成を変更したので、それに合わせてhttpd.conf修正しました。
fuelphpを含んだディレクトリ構成は下記のようになりました。
├─docker │ ├─httpd │ │ └─httpd.conf │ ├─mysql │ │ └─my.conf │ └─php │ ├─Dockerfile │ └─php.ini ├─sample(fuelphp) └─docker-compose.ymlhttpd.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触ってチュートリアルでもやろうかなーと思ったらデバッガー入れてないと思い、試行錯誤して入れました。
変更点は下記です。DockerfileFROM 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.inizend_extension=/usr/lib64/php/modules/xdebug.soホスト側のxdebug.iniを読み込むようにdocker-compose.ymlのvolumesに追加。
docker-compose.ymlversion: '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.loglaunch.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" } } ] }
- 投稿日:2019-10-11T02:46:46+09:00
主なRDMBS(Oracle, MySQL, PostgreSQL)の機能比較
全国で利用されているDBの分布は以下のようになっているらしいです。
この中でも特に、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はオープンソースソフトウェア
派生したDBの種類
- PostgreSQLとMySQLは派生したデータベースが多く存在し利用されています。
ストレージアーキテクチャの違い
- OracleやMySQLが「更新型」のアーキテクチャなのに比べて、PostgreSQLはストレージの管理方法が「追記型」のため、既存のデータの書き換えを行うことなく空いている領域を使って更新データを追記している
- 更新型 : 対象レコードをそのまま更新
- 追記型 : 既存レコードを保持したまま、新規レコードを追加して参照先を変更
- なお、データ量についてはバキューム機能(VACUUM)により解決しているそう
データベースの機能比較
- データ型や命名規制, 書式等はそれぞれ異なる形式になっているが大きな差は無い
- Oracleはチェック制約があるが、MySQLではトリガーで実装する必要がある
- OracleにはシーケンスがあるがMySQLにはなく、代わりに自動インクリメントで定義
- Oracleはシノニム(オブジェクトに対する別名を定義)があるのに対し、MySQLとPostgreSQLには無い
- OracleはNULLとあkら文字は同一判定だが、MySQLとPostgreSQLでは別枠
- Oracleはトランザクションは任意単位だが、MySQLとPostgreSQLは基本的にSQL文単位で確定
- その他、実行計画の違いやヒント句の有無など
参考資料
知ってるようで知らない!Oracle(オラクル)とは
2017年データベースの選択は
SQLの観点から「Oracle Database」「PostgreSQL」「MySQL」の特徴を整理しよう
PostgreSQLとMySQL、使うならどっち? データベース専門家が8つの視点で徹底比較!
- 投稿日:2019-10-11T02:46:46+09:00
主なRDB(Oracle, MySQL, PostgreSQL)の機能比較
全国で利用されているDBの分布は以下のようになっているらしいです。
この中でも特に、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はオープンソースソフトウェア
派生したDBの種類
- PostgreSQLとMySQLは派生したデータベースが多く存在し利用されています。
ストレージアーキテクチャの違い
- OracleやMySQLが「更新型」のアーキテクチャなのに比べて、PostgreSQLはストレージの管理方法が「追記型」のため、既存のデータの書き換えを行うことなく空いている領域を使って更新データを追記している
- 更新型 : 対象レコードをそのまま更新
- 追記型 : 既存レコードを保持したまま、新規レコードを追加して参照先を変更
- なお、データ量についてはバキューム機能(VACUUM)により解決しているそう
データベースの機能比較
- データ型や命名規制, 書式等はそれぞれ異なる形式になっているが大きな差は無い
- Oracleはチェック制約があるが、MySQLではトリガーで実装する必要がある
- OracleにはシーケンスがあるがMySQLにはなく、代わりに自動インクリメントで定義
- Oracleはシノニム(オブジェクトに対する別名を定義)があるのに対し、MySQLとPostgreSQLには無い
- OracleはNULLと空文字は同一判定だが、MySQLとPostgreSQLでは別枠
- Oracleはトランザクションは任意単位だが、MySQLとPostgreSQLは基本的にSQL文単位で確定
- その他、実行計画の違いやヒント句の有無など
参考資料
知ってるようで知らない!Oracle(オラクル)とは
2017年データベースの選択は
SQLの観点から「Oracle Database」「PostgreSQL」「MySQL」の特徴を整理しよう
PostgreSQLとMySQL、使うならどっち? データベース専門家が8つの視点で徹底比較!