Shoyan blog

docker-composeを使ってPHPコンテナとMySQLコンテナを連携させる

以前、Dockerコンテナを連携させる方法を書いたが、コンテナ間の連携が必要な際はdocker-composeを使うと便利だ。
今回は前回と同じようにPHPとMySQLのコンテナを連携させるが、その連携にdocker-composeを使った方法を紹介する。

まずは、適当なディレクトリをつくる。
今回は docker-compose-sampleとする。

docker-compose-sample/ 配下にDockerfileを作成する。

1
2
3
4
5
FROM shoyan/www-ci
ADD . /app
WORKDIR /app
ENV MYSQL_HOST mysql
ENV MYSQL_PASSWORD ''

次に docker-compose.ymlを作成する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '2'
services:
  web:
    build: .
    links:
      - mysql:mysql
  mysql:
    image: mysql:5.5
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    expose:
      - "3306"
    volumes:
      - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d

servicesにwebとmysqlという名前でコンテナを定義している。

webコンテナ

webコンテナはDockerfileをbuildして、mysqlコンテナと連携させる定義をしている。
これによりwebコンテナからはmysqlという名前でmysqlコンテナにアクセスできるようになる。

mysqlコンテナについて

MySQLは公式のイメージを使っている。
他のコンテナからアクセスできるようにexposeで3306ポートを指定している。

公式のMySQLイメージから作成したコンテナは/docker-entrypoint-initdb.d/ 配下にあるシェルスクリプトやsqlファイルを起動時に実行するようになっている。
今回はデータベースとテーブルを作成するためにこの機構を利用する。
volumesを利用してファイルを配置している。

以下のdocker-compose-sample/docker-entrypoint-initdb.d/setup.sql を作成しておく。

1
2
3
4
5
6
7
8
9
10
11
12
CREATE DATABASE IF NOT EXISTS app_test;

DROP TABLE IF EXISTS `app_test`.`user`;
CREATE TABLE `app_test`.`user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(8) DEFAULT NULL,
  `status` tinyint(1) DEFAULT NULL,
  `email` varchar(64) DEFAULT NULL,
  `postal_code` char(7) DEFAULT '',
  `character_text` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

確認用スクリプト

DBにアクセスできているかを確認するためのスクリプト connect.php を用意しておく。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$dsn = sprintf('mysql:host=%s:3306;dbname=%s',  $_ENV['MYSQL_HOST'], 'app_test');
$user = 'root';
$password = $_ENV['MYSQL_PASSWORD'];
$dbh = new PDO($dsn, $user, $password);
$sql = "SELECT version();";
foreach ($dbh->query($sql, PDO::FETCH_ASSOC) as $row) {
    print_r($row);
}
$sql = "show tables;";
foreach ($dbh->query($sql, PDO::FETCH_ASSOC) as $row) {
    print_r($row);
}

docker-composeでコンテナを起動する

準備ができたのでdocker-composeコマンドでコンテナを起動する。
以下のようにネットワークとコンテナが作成される。
-d オプションはバックグラウンドでコンテナを起動するために指定している。

1
2
3
4
$ docker-compose up -d
Creating network "dockercomposesample_default" with the default driver
Creating dockercomposesample_mysql_1
Creating dockercomposesample_web_1

コンテナにログインしてみる。

1
$ docker run --rm -it -v `pwd`:/app --net=dockercomposesample_default dockercomposesample_web bash

確認用スクリプトで疎通を確認する。
バージョンとtableが表示されたら成功だ。

1
2
3
4
5
6
7
8
9
root@6237502e4401:/app# php connect.php
Array
(
    [version()] => 5.5.51
)
Array
(
    [Tables_in_app_test] => user
)

コンテナを削除するには docker-compose down コマンドを使う。

1
2
3
4
5
⇒  docker-compose down
Stopping dockercomposesample_mysql_1 ... done
Removing dockercomposesample_web_1 ... done
Removing dockercomposesample_mysql_1 ... done
Removing network dockercomposesample_default

サンプルコードをgithubで公開しているので参考にしてほしい。

SIMについて

SIMといえば携帯電話やスマートフォンに入っているカードという認識はありましたが、そのSIMについて調べてみました。

SIMの概要

SIMとは Subscriber Identity Module = 加入者IDモジュール の頭文字をとったものです。
それをカード状にしたものが「SIMカード」と呼ばれています。
つまり一種のIDカードです。
また、簡単に情報が盗まれないような仕組みも入っています。

SIMの中に入っている情報

電話番号

SIMが内部に保持している情報の代表的なものが電話番号です。
電話番号は国際的に一意になるよう定められており、国番号と加入者電話番号の組み合わせにより世界中で唯一無二の存在になります。
例えば、090-1234-5678のSIMカードを持っている人は、日本からはその番号が、海外からは国番号を表す「+」記号と日本の国番号「81」を先頭につけて「+81-90-1234-5678」がそのSIMへの電話番号となります。
090ではなく90となっているのは理由があります。
実はこの省略された0は電話番号の一部ではなく、「国内プリフィックス」と呼ばれる、国内への電話番号だよということを電話に識別させるための識別番号なのです。
ですので、日本から電話をかけるときは 「0」、海外から電話をかけるときは「81」に変わるわけです。

ICCID(ICカードID)

国際電気通信連合で定められた、すべてのICカードを一意に識別するためのIDです。
クレジットカードにも使われています。
構成は以下です([]の中の数字は桁数です)。

[2]産業識別(電気通信=89) [2]国番号(日本81) [3]事業者番号(ドコモ=100, SB=200, KDDI=300) [11]カード番号 [1]チェックデジット

IMSI(International Mobile Subscriber ID = 国際的な端末加入者識別番号)

SIMカードで最も重要な情報です。
SIMカードの通信上の根本となるもので、1枚のSIMカードに固有の一意な番号が与えられおり、世界で一意に識別できる番号です。
構成は以下です。

[3]MCC(国番号 日本=440) [2]MNC(事業者番号 ドコモ=10, SB=20, KDDI=50/54) [最大10]MSIN

MSISDN(Mobile Subscriber ISDN Number = 電話番号)

キャリアと契約するとキャリアから与えられる番号で、いわゆる電話番号です。
これはSIMカード固有ではなく、キャリアがどのSIMカードにこの番号を書くかを決定します。

構成は以下です。

[3]CC(国番号 日本=81) [2]NDC(国内宛先番号 90など) [最大10]加入者番号(電話番号)

例えば、090-1234-5678の番号の場合は |81|90|12345678| となります。

SIMの利点

SIMカードを使う利点は、端末と電話番号の切り離しができることです。
つまり、端末からSIMカードを抜いてしまえば電話番号はまったく残らないことになります。
これにより以下のメリットがあります。

  • ユーザーはSIMを抜いて別の端末に挿せば様々な端末を同じ電話番号で使えるようになります。これにより、新しい端末が出た際にSIMカードを挿せば同じ電話番号ですぐ使うといったことができ、機種を変えることが容易になります。

  • 端末と電話番号が結合していると、必然的にキャリアの力が上になります(というのもメーカーは端末を作ったらキャリアに電話番号をつけてもらわないといけなくなるため)。SIMカードによって端末と電話番号が分離することで、メーカーはキャリアの意向に関係なく自由に端末を作ってマーケティングすることが可能となります。

Dockerのコンテナ間を繋ぐLinksを使ってPHPとMySQLコンテナを連携させる

DockerはLinksというコンテナ間のネットワークを繋ぐ仕組みを持つ。
例えば、アプリケーションコンテナとデータベースコンテナを連携して使いたいときに有用だ。
今回はMySQLとPHPのコンテナを連携させる方法を紹介する。

MySQLコンテナの作成

まずは、mysqlコンテナを作成する。
バックグラウンドで起動させるための --detachオプションと3306ポートを解放するための exposeオプションを指定している。

1
$ docker run --detach --expose=3306 --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" mysql

以下のようにコンテナが起動していることを確認できるはずだ。

1
2
3
⇒  docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b18a5159fe7c        mysql               "docker-entrypoint.sh"   1 minutes ago      Up 1 minutes       3306/tcp            test-mysql

PHPコンテナの作成

次にPHPコンテナを作成する。
以下のDockerfileと確認用のconnect.phpを用意しておく。

Dockerfile

1
2
3
4
FROM php:7.1
RUN apt-get update
RUN docker-php-ext-install pdo_mysql mbstring
ADD . /app

connect.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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);
}

ビルドする。

1
$ docker build -t mysql-php .

以下のように --link 連携したいコンテナ名:エイリアス名 でPHPコンテナを起動すると、起動したコンテナの環境変数に連携したいコンテナに関する情報が登録される。

1
2
3
4
5
6
7
8
9
10
11
$ docker run -it --link test-mysql:mysql mysql-php bash
# root@9ec43f759596:/#
# env
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.3:3306
MYSQL_ENV_MYSQL_VERSION=5.7.15-1debian8
MYSQL_NAME=/big_shirley/mysql
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_PORT_3306_TCP_ADDR=172.17.0.3
MYSQL_ENV_MYSQL_MAJOR=5.7
MYSQL_PORT=tcp://172.17.0.3:3306

最後にPHPのコンテナでconnect.phpを実行して接続できることを確認してみる。
version名が表示されれば成功だ。

1
2
3
4
5
6
# php /app/connect.php
=>
Array
(
    [version()] => 5.7.15
)

ポモドーロ・テクニックを使ってみた感想

最近、仕事中はポモドーロ・テクニックを使っている。
ポモドーロ・テクニックは25分集中して5分休憩するサイクルを繰り返すことでメリハリをつけて集中力を高める手法だ。

どのようにやるのか

タイマーさえあれば簡単にできる。
私はPomodoro Timeというアプリを使っている。

image

やってみた感想

やってみた感想としては、たしかに一定の時間を集中することで集中力が高まることを感じた。
気分的にのれなくても25分集中するんだと気合をいれてやれば、けっこう集中できるものだ。
効率よく仕事をこなす方法としてポモドーロ・テクニックはよい手法だと思う。

しかし、走ると歩くを繰り返すと疲れるようにポモドーロ・テクニックを使うと神経を消耗する。
実際、途中に長めの休憩をとるようにと解説もしてある。

ただし、これは慣れもあるのではと思う。
走ると歩くことを繰り返すのはたしかにしんどいがそれが習慣化してしまえば、最初に感じた負荷よりもぐっと負担は減るはずだ。
もうしばらくポモドーロ・テクニックを使っていくつもりだ。

英語の勉強をはじめて4ヶ月の記録

英語の勉強時間をStudyPlusに記録しはじめて4ヶ月がたった。
StudePlusに関しては以下の記事を参照してほしい。
勉強が楽しく続くようになるStudyplus

勉強時間は合計91時間。
最近は英語の勉強のルーティンが生活の中に確立して自然にできるようになった。
いまやっていることは以下のような感じ。

家から駅まで

NHKのラジオ英会話(アプリ版)を聞きながら15分歩く。
アプリ版は好きな時間に聞けるので重宝している。

会社

休み時間にマジタンという英単語アプリで英単語を覚える。

駅から家まで

超右脳つぶやき英語トレーニングを聞きながら15分歩く。
(現在は廃盤になっており、現行は超速つぶやき英語トレーニングという名前で出版されている)

寝る前

データベース3000基本英単語・熟語を30分。
発音とリスニングをする。

以上でだいたい1時間くらいだ。

語彙数を増やすこととリスニング力の向上を目指している。
理由は以下の通り。

  • 英語の勉強に関する著書を読むと語彙数が必要と書いてあることが多い
  • 英会話をやってみて、そもそもリスニングができないと会話が成り立たないことを痛感した

英単語学習についての考え方は以下の記事が大変参考になった。

4ヶ月前と比べて

4ヶ月前と比べ、以下のような変化があった。

覚えた英単語は3500。
4ヶ月前はネイティブが話す速度の英語はほとんど聞き取れなかったが、いまは単語として聞き取れる割合が増えた。
超右脳つぶやき英語トレーニングに付属しているCDはネイティブが普通に話すスピードなのでさっぱり聞き取れなくて愕然としたが、いまは6割くらい聞き取れてていると思う。何度も聞いて内容を覚えてしまっているからでもある。
しかし、聞き取れる単語は増えてきたが、意味がわからないことが多い。

リーディング、ライティングはほとんどやっていないが、語彙数が向上したことでリーディングもあがっていると思う。
しかし、語彙数3500程度だとわからない単語が多く理解できない部分が多い。
当然、日本語のように英語を読むことは不可能である。
ライティングはほとんど向上していない。

今後は語彙数をもっと増やして10000語を目指すつもりだ。