この記事はDockerのAdventCalandar2016の20日目の記事です。
すでにさんざんありますがDockerでのFuelPHP開発環境の構築方法は紹介します。

今回のPHP開発環境は以下で実装します。
Webサーバ: Nginx
APP: FuelPHP, PHP-FPM
DB: MySQL
KVS: memcached, Redis

構築環境はMacのDocker-machine上にDocker-composeで上記の区切りでコンテナを別に立てます
あとDBとKVSについてはデータを永続化させるよう対応します。

コンテナ構成

NginxのコンテナにAppコンテナをマウントし、静的コンテンツへのアクセスはNginxで返します。
また、APPコンテナで生成されたPHP-FPMのUnixSocketもマウントしており動的コンテンツは
UnixSocketを通してPHP-FPMにリクエストする流れになります。
MySQLコンテナ、Redisコンテナ, MemcachedコンテナはAPPコンテナにlinkさせコンテナ同士で通信する形になり、
Storageコンテナは、MySQL、Redis, Memcachedのデータを持ちます

ファイル構成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fuel_php_with_docker

├── README.md
├── app
│   ├── Dockerfile
│   ├── env
│   └── php-fpm.d
│   ├── docker.conf
│   ├── www.conf
│   └── zz-docker.conf
├── docker-compose.yml
├── fuel_project
│   └── ...
├── mysql
│   ├── Dockerfile
│   └── charset.cnf
├── nginx
│   ├── Dockerfile
│   ├── application.conf
│   └── nginx.conf
└── storage
└── Dockerfile

各コンテナ別にディレクトリを作っていて、Dockerfileを準備してます。
fuel_projectディレクトリは、Appコンテナへマウントされます。

上記の全ファイルはgithubに置いてます
https://github.com/fujimisakari/fuel-php-docker.git

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
fuel_app:
container_name: "fuel_app"
build: ./app
restart: always
env_file: ./app/env
links:
- fuel_mysql:db
- fuel_redis:redis
- fuel_memcached:memcached
volumes:
- /var/run
- ./fuel_project:/usr/src/app
- ./app/php-fpm.d:/usr/local/etc/php-fpm.d

fuel_nginx:
container_name: "fuel_nginx"
build: ./nginx
restart: always
ports:
- "80:80"
links:
- fuel_app:app
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/application.conf:/etc/nginx/conf.d/application.conf
volumes_from:
- fuel_app

fuel_mysql:
container_name: "fuel_mysql"
build: ./mysql
restart: always
ports:
- "3306:3306"
volumes_from:
- fuel_storage

fuel_redis:
container_name: "fuel_redis"
image: redis:latest
restart: always
ports:
- "6379:6379"
volumes_from:
- fuel_storage
command: redis-server --appendonly yes

fuel_memcached:
container_name: "fuel_memcached"
image: memcached:latest
restart: always
ports:
- '11211:11211'
volumes_from:
- fuel_storage

fuel_storage:
build: ./storage

PHP-FPMの設定ファイル郡はローカルで用意したものマウントさせました。
DockerでPHP-FPMをコンテナに分けて実行しようとすると以下のエラーが発生しました

  • PHP-FMPプロセスがfuel/app/logs以下へログを書き込もうとするときに権限を持っておらずPermission deniedになる
  • NginxとPHP-FMPをUnixSocketでストリームさせるとき、Nginxコンテナ側でUnixSocketファイルに対してアクセス権限なくてエラーになる

これらを踏まえてphp-fpm.dファイルを編集しました

www.confは以下となるよう編集。

1
2
3
4
5
6
7
8
# Dockerでは、MacからマウントされたファイルディレクトリはUID:1000 GID:staff(50)になりますが
# PHP-fmpプロセスは、デフォルトUID:www-data GID:www-dataになってるので権限エラーではじかれるため
user = 1000
group = staff

# UnixSocketを利用するため
listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0777

zz-docker.confは、UnixSocketを利用するのでlistenをコメントアウト

1
#listen = [::]:9000

Appを起動させる

1. hostsファイルの更新

docker-machineのIPアドレスを毎回URLに直打ちしたくないので以下を追記

1
2
$ sudo vim /etc/hosts
192.168.99.100 docker-machine

2. Dockerのファイル郡を準備

1
git clone https://github.com/fujimisakari/fuel-php-docker.git

3. FuelPHPプロジェクトのセットアップ

FuelPHPはoilコマンド(管理コマンド)を利用して、FuelPHPのAPPを作成するので
oilコマンドのバイナリをインストールして、FuelPHPのAPPを作成します。

1
2
$ curl get.fuelphp.com/oil | sh
$ oil create fuel_project

このままでは、起動時にtimezoneの設定が参照できずエラーになるのでAsia/Tokyoを追記します。

1
2
3
4
5
6
7
8
--- a/fuel_project/app/config/config.php
+++ b/fuel_project/app/config/config.php
@@ -93,7 +93,7 @@ return array(
* default_timezone optional, if you want to change the server's default timezone
*/
// 'server_gmt_offset' => 0,
- // 'default_timezone' => null,
+ 'default_timezone' => 'Asia/Tokyo',

4. 各コンテナの起動

すべてのコンテナをビルド付きで起動させます。(通常時は–buildは不要)

1
$ docker-compose up --build

http://docker-machine/index.php でアクセスできるようになる

参考


X