DockerによるPHP、Apache、PostgreSQLの開発環境を構築した時の流れをまとめようと思います。
また、データベース管理インタフェースを使うと直感的に操作できて便利なので、PostgreSQLについてはモダンなUIであるpgwebも導入してみます。
環境
- Mac for Docker
- Apache2.4
- PHP7.1
- PostgreSQL9.6
構成
ファイル群
docker/web/Dcokerfileに以下を記述します。
FROM php:7.1-apache
COPY ./php.ini /usr/local/etc/php/
RUN set -ex apk --no-cache add postgresql-dev libpq-dev && \
apt-get update && apt-get install -y libpq-dev \
vim \
less \
&& docker-php-ext-install pdo pdo_pgsql pgsql mbstring
docker/web/Dcokerfileと同じ階層にphp.iniを作成します。
[Core]
display_errors = On
error_reporting = E_ALL
error_log = /var/log/apache2/error.log
log_errors = On
[Date]
date.timezone = 'Asia/Tokyo'
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = auto
mbstring.http_input = auto
mbstring.http_output = auto
mbsting.encoding_translation = Off
mbstring.detect_order = auto
dockerディレクトリにdocker-compose.ymlを作成します。
version: '3'
services:
web:
build: ./docker/web/
ports:
- 8110:80
volumes:
- .:/var/www/html
depends_on:
- db
db:
image: postgres:9.3
container_name: postgres
ports:
- 5433:5432
volumes:
- ./docker/db:/docker-entrypoint-initdb.d
environment:
POSTGRES_DB: test
POSTGRES_USER: test
db-gui:
image: sosedoff/pgweb
container_name: "pgweb"
ports:
- "8081:8081"
depends_on:
- db
表示確認用ファイル作成
dockerディレクトリにindex.phpを作成します。
とりま、phpinfo()のみでOKです。
<?php
phpinfo();
コンテナ立ち上げる
以下コマンドで実行します。
docker-compose up -d
コンテナ確認してみます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a25edb35c693 sosedoff/pgweb "/usr/bin/pgweb --bi…" 10 seconds ago Up 9 seconds 0.0.0.0:8081->8081/tcp pgweb
e5f1ce8c159f php_job_web "docker-php-entrypoi…" 10 seconds ago Up 9 seconds 0.0.0.0:8110->80/tcp web
c2ae9b7b2ab6 postgres:9.3 "docker-entrypoint.s…" 11 seconds ago Up 10 seconds 0.0.0.0:5433->5432/tcp postgres
ブラウザ確認
localhost:8110にアクセスします。
以下のように表示されればOKです。
pgwebの設定
localhost:8081にアクセスします。
以下のように入力すれば接続できるはずです。
項目 | 値 |
---|---|
Host | データベースのコンテナ名 |
Username | environmentのPOSTGRES_USER |
Password | 空欄でOK(セキュリティ的にアウトなので注意) |
Database | environmentのPOSTGRES_DB |
SSL Mode | disable |
データベース管理ツールのpgwebからデータベースのアクセスするには、DBコンテナのIPが必要なのですが、docker-compose.yml に記載したデータベースコンテナ名でアクセス出来ます。
よって、Host名はデータベースのコンテナ名を指定しています。
pgwebでテーブルを作ってみる
create table users (
id integer,
name varchar(10)
);
をRunQueryしたらUsersテーブルの出来上がりです。
まとめ
ご紹介したものは、あくまでローカルでの開発時を想定しており、本番利用には適さないです。
また、ローカルとはいえ、データベース認証をしっかり行うこと(ユーザー名・パスワードを分かりにくい文字列にするなど)を推奨します。
間違いがありましたらご指摘いただけますと幸いです。