Fusicきばんブログ

Fusic基盤ユニットの非公式技術ブログ

Dockerで開発環境・テスト環境を作る

こんにちは、2回目の登場になります。
基盤ユニットの櫻川です。

みなさんはDockerを利用してるでしょうか?

Fusicではまだまだ開発環境は Vagrantを複数立てる が主流ですが、 今はDockerの布教活動を行っている真っ最中です。

そもそもDockerを導入した目的

目的は 複数PHPのバージョンを同時に起動したい! です。

というのも、Fusicでは受託開発を行っていることもあり、プロジェクト毎に利用するPHPのバージョンやデータベースの種類・バージョンが異なること多いです。

そのため現在ではプロジェクト毎等でVagrantを新規で立ち上げたり、phpbrewを利用してPHPバージョンを切り替えたりして開発を行っています。

基本的にVagrantとphpbrewで複数PHPを利用することは可能だったのですが以下のような不満もありました。

  • Vagrant
    • 起動に時間がかかる
    • 複数起動すると結構重くなる
  • phpbrew
    • バージョン切り替えにApacheの設定を変える必要がある
    • 同一サーバー内で同時に複数バージョンを起動できない

そこで全てを解決してくれるDockerの出番なわけですよ!

利用している環境

Windowsです。
ただ、Docker自体はVM上のCentOS7で実行しているのでMacでも問題ないと思います。

  • Windows
  • Vagrant
  • Hyper-V
  • CentOS7(ホストOS)
    • Apache(リバースプロキシ用)
  • Docker + Docker Compose
    • Apache + PHP
    • Postgres
    • MySQL
    • samba

Dockerの構成

Dockerのコンテナをポート転送を設定して、最低でも3台のコンテナを起動しています。 ※必要なPHPのバージョン分 + データベース(Postgres or MySQL) + samba

この時点で「複数のPHPバージョンを同時に触りたい」という目的は達成しています。

ただし、このままだとDockerのポート転送を使っているので、PHPにアクセスするときのURLが http://example.com:8080/hoge/fuga というようにポート指定が必要になってきます。

ポート指定 をするのは嫌なのでDockerコンテナの前にリバースプロキシを置くことでポート指定をすることなく複数のPHPにアクセスすることを実現しています。
これで完全に目的達成!

また、ファイルの修正自体はsambaを経由して行っています。

f:id:sakutarou:20161201003230p:plain

どうやって作るの?

1. Dockerインストール

DockerをホストOS(CentOS7)にインストールします。

tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

yum install docker-engine
systemctl enable docker.service
systemctl start docker

2. sambaコンテナを立てる

samba用コンテナをCentOS6で起動します。
※dockerコンテナ内のsambaの設定は行ってください。
 yum install samba など
※ホストOS上の /var/www/html をsambaコンテナでマウントしています

docker run -itd --name samba -p 139:139 -p 445:445 -v /var/www/html:/var/www/html centos:6 /bin/bash

3. Postgresコンテナを立てる

Postgres用イメージを利用してPostgresコンテナを起動します。
MySQLでもかまいません。
{Postgresパスワード} はパスワードを設定してください

docker run --name postgres -e POSTGRES_PASSWORD={Postgresパスワード} -d -p 5432:5432 -e PGDATA=/var/lib/postgresql96/data postgres

4. Apache + PHPコンテナを起動する

Apache + PHPコンテナをCentOS6で起動します。
※dockerコンテナ内のApache + PHPの設定は行ってください。

PHPの必要なバージョン分コンテナを起動します。

docker run -itd --name PHP -p 8080:80 -p 443:443 --link postgres --volumes-from=samba centos:6 /bin/bash

5. ホストOS上でリバースプロキシを設定する。

ホストOSにApacheをインストールし、リバースプロキシを設定します。
※コンテナ上にApacheを立ててリバースプロキシを行ってもいいのですが、dockerを知らない人でも触りやすいようにホストOS上にApacheをインストールしています。

PHPを複数起動したいので、実際はVertualHostと組み合わせています。

ProxyRequests Off
ProxyPass / http://hoge.example.com:8080/
ProxyPassReverse / http://hoge.example.com:8080/

6. イメージをAmazon ECR上に保存する

実行しているDockerコンテナをイメージ化して、ECR上に保存してます。

  • ECR上にリポジトリを構築しておいてください。
  • aws cliをインストールしておいてください。
docker commit samba samba
docker commit php

aws ecr get-login --region ap-northeast-1
出力されたログインコマンドを実行

docker tag samba 発行されたECR用sambaリポジトリURL
docker tag php 発行されたECR用phpリポジトリURL

docker push 発行されたECR用sambaリポジトリURL
docker push 発行されたECR用phpリポジトリURL

最後

上記を実行することで最低限のPHP開発・テスト環境を構築することができます。
ただ、公開環境で起動する場合は公開するポート等セキュリティに注意してください。

また、このままだと起動するのが非常に手間なので、Dockerfile + Docker Composeにまとめています。

Dockerを使ったことない人は是非!