Help us understand the problem. What is going on with this article?

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

More than 3 years have 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

cyclon2joker
ほぼ、無職。 最近のオモチャはMicro:bit。 関西でArduinoとスマフォで戯れるよーな仕事がしたい。。。
http://cyclon2joker.herokuapp.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした