[備忘録]Dockerでapache+php+postgresql環境


すぐ忘れるのでメモ

1.とりあえず、php+apacheのイメージを公式から落とす

```
docker run -d php:5.6-apache
```

※あれば、する必要なし。
起動したら、コンテナ名を調べ、コンテナを消す

```
docker ps
docker rm -f XXXXX（起動したapache-phpのコンテナ名）
```

2.とりあえず、ubuntuのイメージを公式から落とす

```
docker run -it ubuntu:14.04 /bin/bash
```

※あれば、する必要なし。
起動したら、ubuntuからログアウトして、コンテナ名を調べ、コンテナを消す

```
docker ps -a
docker rm -f XXXXX（起動したubuntuのコンテナ名）
```

3.postgresにアクセス出来るphp-apacheのイメージファイルを作成
[1]1.のイメージを元にする、Dockerfileを作成

```
ROM php:5.6-apache
RUN set -ex apk --no-cache add postgresql-dev libpq-dev
RUN apt-get update && apt-get install -y libpq-dev && docker-php-ext-install pdo pdo_pgsql mbstring

```

※Debian系なので、apt-get
※pdoでアクセスするので「pdo_pgsql」
※libpq-devがないと、ヘッダが無いと言われてエラーとなる

[2]php用Dockerイメージのビルド

```
docker build -t php:5.06apache_postgres ./
```

※イメージ名を「php:5.06apache_postgres」とした。
※実行フォルダにDockerファイルがあるものとする。

[3]正常に終って、ビルド結果を一応確認。

```
docker images
```

一覧のタグに、「5.06apache_postgres」があれば、ok


4.postgres環境の作成
[1]2.ubuntuイメージを元にするDockerfileを作成
※親切な人のページを参照してそのまま使用。。。
http://blog.flup.jp/2016/02/14/devenv_postgresql_with_docker/


```
FROM ubuntu:14.04

RUN apt-get update && \
    apt-get install -y -q postgresql-9.3 libpq-dev postgresql-client-9.3 postgresql-contrib-9.3 && \
	rm -rf /var/lib/apt/lists/*

USER postgres
RUN /etc/init.d/postgresql start &&\
    psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&\
    psql --command "CREATE DATABASE docker WITH OWNER docker TEMPLATE template0 ENCODING 'UTF8';" &&\
    echo "host all  all    0.0.0.0/0  md5" >> /etc/postgresql/9.3/main/pg_hba.conf &&\
    echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf

EXPOSE 5432
VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]

CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]

```

※ dbuser/passはdocker/docker。portはデフォルト。

[2]postgres用Dockerイメージのビルド

```
docker build -t ubuntu:14.04postgres ./
```

※イメージ名を「ubuntu:14.04postgres」とした。
※実行フォルダにDockerファイルがあるものとする。
(ただし、2、とは違うフォルダ。)


[3]正常に終って、ビルド結果を一応確認。

```
docker images
```

一覧のタグに、「14.04postgres」があれば、ok


5.postgresの起動

```
docker run -d -p 5432:5432 --name postgresql ubuntu:14.04postgresfg
```

※コンテナ名を「postgresql」にした。
※ロカールでも5432で繋げるようにした。

起動したら、pgadminでつないでみる。

![pg_conn_setup1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/6d2893d4-1527-3149-0bf7-25acf03065eb.png "pg_conn_setup1.png")

![pg_conn_setup2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/700ad9ad-f2eb-dc75-163e-6fe841f15310.png "pg_conn_setup2.png")


![pg_conn_setup3.png](https://qiita-image-store.s3.amazonaws.com/0/38889/d24f135b-5325-7549-41ce-72786325c5f6.png "pg_conn_setup3.png")

つながった。

6.apache-phpの起動

[1]
コンテナにソースを作らず、ローカルのソースを参照するようにして
コンテナを起動する

```
docker run -p 80:80 -v ~/work/hoge/html:/var/www/html --link postgresql --name php_tktk -d php:5.06apache_postgres
```

・コンテナ名は、「php_tktk」
・ローカルに、~/work/hoge/htmlフォルダを準備
・postgresのコンテナにリンクするので、「--link postgresql」を指定

[2]
「~/work/hoge/html/index.php」を準備。

```
<?php phpinfo();
```

ブラウザで見てみる。
![pg_conn_php1.png](https://qiita-image-store.s3.amazonaws.com/0/38889/c63a46a4-effd-e10c-7deb-f32832880ea3.png "pg_conn_php1.png")

posgreの設定が反映されている。

[3]
一旦、コンテナを削除して、DBへの接続情報を環境変数で渡すようにして、
再作成・起動する。

```
docker rm -f php_tktk
```

削除後、環境変数を渡すようにして、再起動。

```
docker run -p 80:80 -v ~/work/hoge/html:/var/www/html \
-e DBUSER=docker -e DBPASS=docker -e DBPORT=5432 -e DBNAME=docker -e DBHOST=postgresql \
--link postgresql --name php_tktk -d php:5.06apache_postgres

```

接続情報を環境変数で渡す（ユーザー、パス、ポート、DB名、ホスト名（コンテナ名））
※ホスト名にコンテナ名を指定するのは、linkしてるから(と思う。。。)


起動後、index.phpを開いて、phpinfoが出てるか確認する。

[4]
DBとの接続を確認するため、「~/work/hoge/html/tktk.php」を作成

```
<?php
# とりあえず、環境変数から接続情報を取得
$dbuser=getenv('DBUSER');
$dbpass=getenv('DBPASS');
$dbport=getenv('DBPORT');
$dbname=getenv('DBNAME');
$dbhost=getenv('DBHOST');
$dsn = 'pgsql:dbname='. $dbname . ' host=' . $dbhost. ' port=' . $dbport;
$user = $dbuser;
$password = $dbpass;

# 接続
$dbh = new PDO($dsn, $user, $password);
$now_tm = "___";
$dbh = new PDO($dsn, $user, $password);
$st = $dbh->query("select current_timestamp as now_tm");
while($row = $st->fetch()){
  $now_tm = $row["now_tm"];
  break;
}
$st = null;
$dbh = null;
?>
<html lang="ja">
<meta charset="UTF-8">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<title>tktk</title>
<body>
<h1>now_tm:[<?php echo $now_tm;?>]</h1>
</body>
</html>
```

テーブル作るのはめんどいので、
DBからsysdateを取得して表示する感じのソース。。。

コンテナに、接続情報を渡しているので、そこから取るように記述。


[5]
ブラウザで確認。

![pg_conn_php2.png](https://qiita-image-store.s3.amazonaws.com/0/38889/832bbf99-7ddf-7f83-f754-2ce07a512e37.png "pg_conn_php2.png")

OKの模様w