[备忘录]使用Docker构建apache+php+postgresql环境

因为我很快就会忘记,所以需要做个笔记。

首先,从官方网站下载 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のコンテナ名)

创建一个可以访问Postgres的php-apache镜像文件的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,会报错说缺少头文件。

使用Docker镜像构建PHP代码。

docker build -t php:5.06apache_postgres ./

假设Docker文件位于执行文件夹中,将镜像命名为“php:5.06apache_postgres”。

[3] 完成后,初步确认构建结果。

docker images

If the tag “5.06apache_postgres” is present in the list, then it’s okay.

4. 创建PG环境
[1] 创造基于Ubuntu镜像的Dockerfile
* 参考善良人的网页并直接使用…

Dockerでつくる開発環境【PostgreSQLコンテナ編】

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。端口是默认。

[2] 使用Docker镜像构建Postgres。

docker build -t ubuntu:14.04postgres ./

假设镜像名称为”ubuntu:14.04postgres”。
假设Docker文件位于当前目录下(与第2个文件夹不同)。

[3] 运行正常并确认了一下构建结果。

docker images

如果标签列表中有”14.04postgres”标签,那就可以了。

5. 启动PostgreSQL

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」

准备好「~/work/hoge/html/index.php」。

<?php phpinfo();
pg_conn_php1.png

PostgreSQL的设置已经生效。

一旦删除容器,通过环境变量传递数据库连接信息,重新创建并启动。

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

将连接信息通过环境变量传递(用户、密码、端口、数据库名、主机名(容器名))
※指定容器名作为主机名是因为它们进行了链接(我想是这样的。。。)

启动后,打开index.php,确认是否显示出phpinfo。

为了确认与数据库的连接,创建一个名为「~/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>

由于制作表格很麻烦,我会从数据库中获取sysdate并进行显示的源代码。

在容器中传递连接信息,然后从那里获取。

用浏览器确认。

pg_conn_php2.png

好的样子 w