Edited at

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

More than 1 year has passed since last update.

すぐ忘れるのでメモ

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

pg_conn_setup2.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

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

OKの模様w