docker(apache, php, postgresql)

構成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


├── .docker
│ ├── Dockerfile
│ ├── init.sql
│ └── vhost.conf
├── docker-compose.yml
├── postgre-data
└── public
├── index.html
├── index.php
└── phpinfo.php

```



## .docker/Dockerfile

FROM php:7.1.8-apache

MAINTAINER Test User

COPY . /srv/app
COPY .docker/vhost.conf /etc/apache2/sites-available/000-default.conf

RUN chown -R www-data:www-data /srv/app

RUN apt-get update && apt-get -y install git unzip zlib1g-dev libpq-dev

RUN docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql

RUN docker-php-ext-install mbstring pdo pdo_mysql

RUN docker-php-ext-install pdo_pgsql

RUN a2enmod rewrite

RUN a2enmod headers

1
2
3


## .docker/vhost.conf


DocumentRoot /srv/app/public

<Directory "/srv/app/public">
    AllowOverride All
    Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined


1
2

## docker-compose.yml

version: ‘3’
services:
app:
build:
context: .
dockerfile: .docker/Dockerfile
image: test-docker
ports:

  - 8080:80
volumes:
  - .:/srv/app
links:
  - postgres

postgres:
image: postgres
volumes:

  - postgres-data:/var/lib/postgres
  - ./.docker/init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
  - "5432:5432"
environment:
  POSTGRES_USER: pguser
  POSTGRES_PASSWORD: pguser
  POSTGRES_DB: pgdb

volumes:
postgres-data:
driver: local

1
2
3
4
5
6
7
8
9
10
11

`- ./.docker/init.sql:/docker-entrypoint-initdb.d/init.sql` では最初に実行したいSQLを指定している。
これを実行するのは コンテナの作成時のみである。
実行し直したいのであれば、一度 コンテナを削除する必要がある。
`docker stop` ではなく `docker rm` を実行する必要がある。
`docker ps -a` で使用中のコンテナは全て出てくる。  


## 上記の例で docker を通して bashに繋ぐには

-it の引数にはコンテナ名等を指定指定

$ docker exec -it dockersample1_postgres_1 bash

1
2
3
4
5

## 上記の例でphpからPostgreSQL につなぐには

host 名が「postgres」になることに注意だ。
これは docker-compose.yml で定義したserviceになる

$dsn = ‘pgsql:dbname=pgdb host=postgres port=5432’;
$user = ‘pguser’;
$password = ‘pguser’;

try{
$dbh = new PDO($dsn, $user, $password);
}catch (PDOException $e){
print(‘Error:’.$e->getMessage());
die();
}

1
2
3
4
5


## Host OS から postgreSQL につなぐ

※ docker の場合, HostOSという言い方自体おかしいが便宜上

$ psql -h localhost -p 5432 -U pguser -d test
```

※ guest からつなぐ時 host は postgresになる

課題

  1. docker-compose up —build した時に dbの作成を実行したい
  2. https の対応をしたい
  3. guest側でcomposerのインストールを実行したい