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を経由して行っています。
どうやって作るの?
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を使ったことない人は是非!