DockerでapacheとMemcachedを起動してPHP7から接続してみる
DBに接続する前の肩慣らしとしてmemcachedに接続してみます。
当然PHP(apache)とMemcachedは別のコンテナとして起動します。1コンテナ=1プロセスの原則です。
memcachedのイメージは公式があるのでDocker hubからもってきます。これはそのまま使えそうなのでDockerfileは作成しません。
Composeを使ってみる
複数のコンテナをそれぞれいちいち起動したり停止したりするのはダルすぎるので、その辺をうまいことやってくれるらしいComposeを使ってみます。
ちなみにdocker-compose.ymlの書式はこちら
Compose ファイル・リファレンス
http://docs.docker.jp/compose/compose-file.html
マニュアルが充実していていいですね〜
docker-compose
まずはCompseの設定
apache-php:
build: ./apache-php
ports:
- "80:80"
links:
- memcached
memcached:
image: memcached:1.4
ディレクトリ構成
公式のベストプラクティスを見る限り、コンテナごとにディレクトリを作成してDockerfileやコンテナ固有の設定ファイルを格納するのがいいらしいです。
http://docs.docker.jp/engine/articles/dockerfile_best-practice.html#dockerignore
ほとんどの場合、空のディレクトリに個々の Dockerfile を置くのがベストです。そうしておけば、そのディレクトリには Dockerfile が構築に必要なファイルだけ追加します。
ふむふむ..というわけで。
project_dir
+- docker-compose.yml
+-apache-php
+-Dockerfile
+-index.php
前回に引き続きPHP7を使用しています。PHP7ではmemcacheを使用するのは一筋縄ではいかないようです。
一番参考にした記事。
Docker Compose で PHP 7.0 の開発環境を構築する
http://qiita.com/masakielastic/items/9fdc52b47cc7e3850b9f#memcached
でもそのままではダメで、少しDockerfileを修正しました。
FROM php:7.0.8-apache
ENV DEBIAN_FRONTEND noninteractive
ENV PHP_MEMCACHED_VERSION php7
RUN apt-get update && apt-get install -y libmemcached-dev zlib1g-dev
RUN curl -L -o /tmp/memcached.tar.gz https://github.com/php-memcached-dev/php-memcached/archive/$PHP_MEMCACHED_VERSION.tar.gz \
&& tar xfz /tmp/memcached.tar.gz \
&& rm -r /tmp/memcached.tar.gz \
&& mkdir -p /usr/src/php/ext \
&& mv php-memcached-$PHP_MEMCACHED_VERSION /usr/src/php/ext/memcached \
&& echo memcached >> /usr/src/php-available-exts \
&& docker-php-ext-install memcached
RUN { \
echo 'session.save_handler = memcached'; \
echo 'session.save_path = memcached:11211'; \
} >> /usr/local/etc/php/conf.d/docker-php-ext-memcached.ini
セッションハンドラーの件はまだ不要だけど将来を見越して記述
ちゃんとmemcachedと通信できているか確認するためのPHP。
めんどいのでPHP公式からコピー
<?php
$m = new Memcached();
$m->addServer('memcached', 11211);
$m->set('int', 99);
$m->set('string', 'a simple string');
$m->set('array', array(11, 12));
/* expire 'object' key in 5 minutes */
$m->set('object', new stdclass, time() + 300);
var_dump($m->get('int'));
echo "<br>";
var_dump($m->get('string'));
echo "<br>";
var_dump($m->get('array'));
echo "<br>";
var_dump($m->get('object'));
echo "<br>";
?>
実行
docker-compose up -d
ブラウザでアクセス
つながったーーーー!
後始末
docker-compose stop # 全てのコンテナ停止
docker-compose rm # 全てのコンテナ削除
docker-compose楽でいいですね〜〜