Dockerであそぶ(6)Apache-PHP-Mariadb連携


ここ1,2年で注目を集めている仮想化技術の1つ「Docker」について、今更感がありますが試していきたいと思います。
他の仮想化技術との違いや特徴、開発環境として使っていくにはどうすればいいかなどを紹介していきたいと考えています。

これまでの連載

Mariadbコンテナを作成する

今回は前回作成したmy-phpコンテナとデータベースの連携を行ってみたいと思います。
dockerでは基本的に1つのコンテナで1つのサービスのみ起動することを推奨しています。
(推奨しているだけで禁止しているわけではありません。)
そのため、今回行おうとしているPHP-Mariadb間の連携を行うためにはPHP(Apache)を実行しているコンテナとMariadbを実行しているコンテナを2つ用意する必要があります。

Mariadbを実行するコンテナはpublishイメージが用意されているためこちらを使っていきたいと思います。
基本的には第3回で行った方法と同じです。
DockerHubのURLはこちら↓
https://hub.docker.com/_/mariadb/

$ docker pull mariadb:latest
$ docker run -it -d --rm -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=docker \
    -e MYSQL_USER=docker -e MYSQL_PASSWORD=docker \
    --name my-mariadb1 mariadb:latest

新しく出てきたオプションがありますので、紹介しておきます。

オプション 概要
-e (–env) 環境変数を設定する
–name コンテナに名前をつける

非常に長いコマンドでしたが、「docker run」する際(mariadbコンテナを起動する際)に、4つの環境変数とコンテナ名の設定を行っています。
環境変数はそれぞれ以下の様な役割があるようです。

環境変数名 設定値 概要
MYSQL_ROOT_PASSWORD root Mariadbのrootパスワード
MYSQL_DATABASE docker 新しく作られるデータベース名
MYSQL_USER docker 上記のデータベースへフルアクセス可能なユーザー名
MYSQL_PASSWORD docker MYSQL_USERのパスワード

docker独特な考え方なのですが、「docker run」するたびにイメージから新たなコンテナが作成されるため、その都度データベースが初期化されています。
実際にコマンドを実行するとたくさんのログがコンソール上に出力され、よく見てみるとデータファイルの作成やrootパスワードの設定などMariadbの初回起動時に出力される内容であることがわかります。
コンテナ名をつけているのは、PHPコンテナとの連携時にあったほうが便利になるためです。
Mariadbコンテナ側はひとまずこれで完成です。簡単!!
起動したコンテナは一旦停止しておいてください。(CTRL+C)

Mariadbコンテナが停止しない!?

筆者の環境では、上記の「docker run」コマンドでMariadbコンテナを起動すると「CTRL+C」で停止しなくなるという現象が発生しています。
もし同様の現象が発生する場合には、新しく「Docker Quickstart Terminal」を起動し以下のコマンドを実行してみてください。

$ docker stop my-mariadb1

PHPコンテナ側で接続準備を行う

Mariadb側の受け入れ準備ができたので、PHPコンテナ側でMariadb接続のための準備を行います。
新しく「php-mysql」パッケージをインストールする必要がありますので、phpコンテナのDockerfileを修正します。

FROM centos:latest
RUN yum -y update && \
    yum -y install httpd php
RUN yum -y install php-mysql
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

修正したのは4行目のみです。イメージファイルのサイズを小さくするためには3行目の「yum -y install」の後ろにphp-mysqlを追加すればよいのですが、あえて4行目に追加してみました。

ではイメージをビルドしましょう。Mariadbコンテナにも名前を付けましたので、今回はPHPコンテナ側にも設定してみました。(必須ではありません。)

$ docker run -it --rm -p 80:80 \
    -v //c/Users/sudoy/Documents/docker/php/public-html/:/var/www/html/ \
    --name my-php1 --link my-mariadb1 my-php

また新しいオプションが出てきましたので紹介しておきます。

オプション 概要
–link 他のコンテナへのリンクを作成する

これで接続準備完了です。
起動したコンテナは一旦停止しておいてください。(CTRL+C)

コンテナを起動し接続確認を行う

上記の方法ではどちらのコンテナもフォアグラウンドで起動していたため、2つのコンテナを同時起動することができません。
そこで、コンテナはフォアグラウンドではなくバックグラウンドで起動する必要があります。
起動する順番はMariadbコンテナからです。

$ docker run -it -d -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=docker \
    -e MYSQL_USER=docker -e MYSQL_PASSWORD=docker \
    --name my-mariadb1 mariadb:latest
$ docker run -it -d -p 80:80 \
    -v //c/Users/sudoy/Documents/docker/php/public-html/:/var/www/html/ \
    --name my-php1 --link my-mariadb1 my-php

変わっているのはどちらも同じで、「–rm」オプションが「-d」オプションに変わっただけです。

オプション 概要
-d (–detach) コンテナをバックグラウンドで起動し、コンテナIDを表示する

コンテナ間でリンクを作成すると、リンク元のコンテナにリンク先のコンテナに関する情報が環境変数として設定されます。(IPアドレスなど)
どのような環境変数が設定されているか確認するには、リンク元のコンテナ(PHPコンテナ)にbashで接続し、envコマンドを実行すればOKです。
bash接続するには「docker exec」コマンドで行いましたが、今回はコンテナ起動時にコンテナ名を指定したため接続する際にコンテナ名を使う事が可能になります。

$ docker exec -it my-php1 bash
# env
HOSTNAME=e0d68dc1e6ca
TERM=xterm
... 省略 ...
MY_MARIADB1_ENV_MYSQL_PASSWORD=docker
MY_MARIADB1_PORT_3306_TCP=tcp://172.17.0.2:3306
MY_MARIADB1_ENV_MYSQL_USER=docker
MY_MARIADB1_PORT_3306_TCP_PORT=3306
MY_MARIADB1_ENV_MYSQL_ROOT_PASSWORD=root
MY_MARIADB1_NAME=/my-php1/my-mariadb1
MY_MARIADB1_PORT_3306_TCP_PROTO=tcp
MY_MARIADB1_ENV_MARIADB_VERSION=10.1.10+maria-1~jessie
MY_MARIADB1_ENV_MYSQL_DATABASE=docker
MY_MARIADB1_ENV_MARIADB_MAJOR=10.1
... 省略 ...
_=/usr/bin/env

このように設定したコンテナ名「MY_MARIADB1」がヘッダーに付いている環境変数がたくさん作られています。これらの情報を使ってデータベース接続を行えばOKです。

では、接続確認用のPHPプログラムを作成しましょう。
php/public-html以下にdb.phpファイルを作成します。

<?php
// 環境変数の取得
$host = getenv("MY_MARIADB1_PORT_3306_TCP_ADDR");
$db   = getenv("MY_MARIADB1_ENV_MYSQL_DATABASE");
$user = getenv("MY_MARIADB1_ENV_MYSQL_USER");
$pass = getenv("MY_MARIADB1_ENV_MYSQL_PASSWORD");

// Mariadbへの接続
$link = mysql_connect($host, $user, $pass);
if (!$link) {
    die('接続失敗しました。。。'.mysql_error());
}

// データベースの選択
$con = mysql_select_db($db, $link);
if(!$con){
	die('データベース選択失敗です。'.mysql_error());
}

echo "接続成功しました!";
mysql_close($link);

以下のURLへアクセスしてみましょう。

http://192.168.99.100/db.php

スクリーンショット 2016-01-04 15.34.58

うまくいきました。
今回はここまでにしておきます。

  • このエントリーをはてなブックマークに追加

PAGE TOP