前回できなかったMySQLとの疎通を行っていきます。
$ docker --version
Docker version 1.11.2, build b9f10c9
$ docker-compose --version
docker-compose version 1.7.1, build 0a9ab35
ライブラリのインストール
まずサーバーにPDOなりmysqliなりが入っているか確認してみます。
$ touch ./html/phpinfo.php
<?php phpinfo();
pdoはsqliteしか入っていませんし、当然ですがmysqliは見当たりません。公式のイメージには入っていないということです。
ではコンテナ内でインストールを……、といっても、また再起動したら消えてしまいます。
インストールディレクトリをホストと共有する? いやいくらなんでもそれはおかしい。
ここでDockerfileを使います。む、順番が逆な気がするけどきっと気のせいです。
Dockerfileには、イメージをコンテナ化する際に走らせる命令を記述します。立ち上げるたびにインストールされるので、再起動後もわざわざコンテナに入って作業する必要がなくなります。
コンテナをDockerfileから起動するには、docker-compose.ymlの記述を変更します。
version: "2"
services:
web:
build: ./web
ports:
- "80:80"
volumes:
- ./html/:/var/www/html
db:
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
volumes_from:
- data
data:
image: busybox:1
volumes:
- /var/lib/mysql:/var/lib/mysql
webの起動元を./webディレクトリ内のDockerfileに指定しました。
続けてDockerfileを書きます。
$ mkdir web
$ touch web/Dockerfile
FROM php:5.6-apache
RUN docker-php-ext-install pdo_mysql
EXPOSE 80
(´-`).oO(ファイル名が表示されない……)
RUNの後に走らせるコマンドを書きます。例えばapt-getやcurl等々。
docker-php-ext-installは、公式のイメージで用意されているコマンドです。PHPのライブラリのインストールに使います。
ここではPDOを使っていますが、mysqliでも問題ありません。たぶん。
早速起動。
$ docker-compose down
$ docker-compose up -d
起動時の画面が少し変わったはず。
phpinfoを見てみると、PDO Driversにmysqlが加わっている、はず!
疎通テスト
テスト用のファイルを用意します。
$ touch html/connection.php
<?php
$dns = 'mysql:host=db;port=3306;dbname=sandbox';
$user = 'root';
$password = 'root';
try {
$pdo = new PDO($dns, $user, $password);
echo 'Connection success';
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
Σo(*゚д゚)ノ 待った! そのホスト名なんだ!?
docker-compose.ymlに記述されたサービス名は、それぞれのコンテナ内のネットワークにその名前で追加されます。
追加ってなんだ? でもそう書いてあるんだからそうなのでしょう。
とにもかくにも、connection.phpにつないでみると……。
Connection success
٩( 'ω' )و
くぅ疲
とはいえまだ最低限の環境ができたにすぎません。
mysqlの文字コードがlatinのままだったりするし、フレームワークを入れてDocumentRootを変更する必要が出てきたりします。
そういった初期設定はDockerfileに書いていくことになります。あとはまぁ、適当にググってやれば何とかなります(適当)。
成果: https://github.com/kamonamban/study_lamp
この記事を書くにあたっては、Laradockの構成を大いに参考にしました。