20
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-21

すぐ忘れるのでメモ

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

20
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?