ここ1,2年で注目を集めている仮想化技術の1つ「Docker」について、今更感がありますが試していきたいと思います。
他の仮想化技術との違いや特徴、開発環境として使っていくにはどうすればいいかなどを紹介していきたいと考えています。
これまでの連載
- Dockerであそぶ(1)DockerToolboxのインストール
- Dockerであそぶ(2)Centos7を実行する
- Dockerであそぶ(3)Apacheを使う
- Dockerであそぶ(4)Apacheの設定を変える
- Dockerであそぶ(5)Apache-PHP連携
- Dockerであそぶ(6)Apache-PHP-Mariadb連携 ← 本記事!
- Dockerであそぶ(7)PhpMyAdminのインストール
- Dockerであそぶ(8)docker-composeでコンテナをまとめて管理
- Dockerであそぶ(9)AWS EC2でdocker-composeを使う
- Dockerであそぶ(10)docker-machineを使ってAWS(EC2)に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
うまくいきました。
今回はここまでにしておきます。