49
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Docker公式のPHPイメージとMySQLイメージを使ってコンテナ間通信させる方法

Last updated at Posted at 2015-10-12

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

SS 2015-10-13 2.02.47.png

dockerホストのIPがわからない場合は下記コマンドで調べられます。

docker-machine ip <マシン名>

自分用のカスタマイズイメージを作る

公式PHPイメージはPHP Extensionが貧弱でPDOすら入っていないので不便です。
公式イメージを継承して自分用イメージを作っておきましょう。

下記のようなDockerfileを用意して、~/tmp/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スクリプトを用意しておきます。

~/use-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サーバのバージョンが表示されれば成功です。

49
48
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
49
48

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?