Docker公式のPHPイメージとMySQLイメージを使って通信させる方法を紹介します。(あくまで入門用です。)
MySQLイメージ
https://hub.docker.com/_/mysql/
PHPイメージ
https://hub.docker.com/_/php/
docker-toolboxを使ってDocker実行環境を構築する
OSXでDockerを使うには、docker toolbooxというものを使います。
Docker Toolboxの説明は割愛します。
(かつてデファクトスタンダートだったboot2dockerは2015年8月より非推奨扱いのようです)
MySQLイメージの使い方
MySQLイメージを取得する
docker pull mysql
タグ名を省略した場合、現時点(2016.3)ではMySQL 5.7が使われます。
最新版を使いたい場合は明示的にバージョンを指定するとよいでしょう。
docker pull mysql:5.7
以下、mysql:5.7を使う前提で解説を進めます。
MySQLサーバコンテナを起動する
まず一番シンプルな起動方法を紹介します。
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7
この場合、次のフェーズでMySQLクライアントからrootでログインすることになります。
起動したMySQLサーバコンテナに、MySQLクライアントコンテナを作って接続する
接続確認のために、「MySQLクライアントコンテナ」を起動してコンテナ間通信がうまく行くかを見てみます。
下記に出てくる環境変数はDockerの--link機能が提供してくれるもので、コンテナ内からのみ見える変数です。
docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
これでMySQL接続ができたらコンテナ間通信成功です。
PHPイメージからコンテナを作る
PHPイメージを取得する
PHP7のイメージが公開されているのでこれを使います。
docker pull php:7-apache
(fpm版でもいいのですが、Apache版の方がブラウザから動作確認するときに楽なので)
PHPコンテナを単体で起動してみる
まず、MySQLとは関係なしにPHPコンテナ単体で起動して動作確認します。
echo '<?php phpinfo();' > $HOME/info.php
docker run -it --rm -v $HOME:/var/www/html -p 8000:80 php:7-apache
これでPHPコンテナ(正確にはApacheコンテナというべきか)が起動するので、docker machineのIPアドレスにアクセスして、phpinfo画面が表示されることを確認します。
http://(dockerホストのIPアドレス):8000/info.php
dockerホストのIPがわからない場合は下記コマンドで調べられます。
docker-machine ip <マシン名>
自分用のカスタマイズイメージを作る
公式PHPイメージはPHP Extensionが貧弱でPDOすら入っていないので不便です。
公式イメージを継承して自分用イメージを作っておきましょう。
下記のようなDockerfileを用意して、~/tmp/Dockerfileとして保存します。
FROM php:7-apache
RUN apt-get update
RUN docker-php-ext-install pdo_mysql mbstring
RUN echo 'error_reporting = E_ALL' >> /usr/local/etc/php/conf.d/99_myconf.ini
RUN echo 'date.timezone = Asia/Tokyo' >> /usr/local/etc/php/conf.d/99_myconf.ini
ビルドします。
cd ~/tmp/ ; docker build -t myphp7 .
これで、自分用のカスタマイズPHPイメージができました。
カスタマイズイメージからPHPコンテナを起動してMySQLサーバコンテナに接続する
接続テスト用にこんなPHPスクリプトを用意しておきます。
<?php
$dsn = 'mysql:host=' . $_ENV['MYSQL_PORT_3306_TCP_ADDR'];
$user = 'root';
$password = $_ENV['MYSQL_ENV_MYSQL_ROOT_PASSWORD'];
$dbh = new PDO($dsn, $user, $password);
$sql = "SELECT version();";
foreach ($dbh->query($sql, PDO::FETCH_ASSOC) as $row) {
print_r($row);
}
コンテナを起動します。
docker run -it --rm --link some-mysql:mysql -v $HOME:/var/www/html -p 8000:80 myphp7
下記URLにアクセスします。
http://(dockerホストのIPアドレス):8000/use-mysql.php
これで、Array ( [version()] => 5.7.8-rc )
のようにMySQLサーバのバージョンが表示されれば成功です。