[备忘录]使用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
* 参考善良人的网页并直接使用…
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_setup1.png](https://cdn.silicloud.com/blog-img/blog/img/657d4ab337434c4406cb42b2/31-0.png)
![pg_conn_setup2.png pg_conn_setup2.png](https://cdn.silicloud.com/blog-img/blog/img/657d4ab337434c4406cb42b2/32-0.png)
![pg_conn_setup3.png pg_conn_setup3.png](https://cdn.silicloud.com/blog-img/blog/img/657d4ab337434c4406cb42b2/33-0.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 pg_conn_php1.png](https://cdn.silicloud.com/blog-img/blog/img/657d4ab337434c4406cb42b2/41-0.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 pg_conn_php2.png](https://cdn.silicloud.com/blog-img/blog/img/657d4ab337434c4406cb42b2/54-0.png)
好的样子 w