docker。ローカルで何かするには、本当に気持ちいい操作感だと感じています。
そうなるとやっぱり、本番環境も docker にしてみたいという気持ちが、すごい勢いで芽生えてきます。
まだまだ勉強中ですので、大層なことはできませんが、試しに、一台の Amazon EC2 にデプロイしてみたいと思います。
リモートにデプロイするときに、**アプリケーションソースコードをどうやって本番反映させるのか?**ということは、しばしば議論されることかもしれません。git clone
でやるのか?コンテナに含めるのか?など。
今回は、アプリケーションコードと言っても、index.php
と piyo.php
だけですので、Dockerfile の COPY
を使う方針でやります。構成は、掲題の通りです。
作業的には、
- その1. 準備
- その2. デプロイ
ですぐにおわります。
その1. 準備 : まずは docker-machine を用意
Amazon Web Services (AWS) EC2 example
上に、やり方は書いてありますので、これにそってつくります。
# マシンをつくる。(これは少し時間かかります。)
$ docker-machine create --driver amazonec2 --amazonec2-region ap-northeast-1 aws-sample
# 中略..
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env aws-sample
# ステータスを確認する。
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
aws-sample - amazonec2 Running tcp://13.113.8.191:2376 v1.13.0
# アクティブにします。
$ eval $(docker-machine env aws-sample)
# 確認
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
aws-sample * amazonec2 Running tcp://13.113.8.191:2376 v1.13.0
そして、いまのところ手動なのですが、セキュリティグループの設定で、ポートの 8080 を開けておいてください。
TODO:
セキュリティグループの設定方法を調べる。
これで、docker-machine の準備はできましたので、とくに問題ないかとおもいます。
インスタンスが立ち上がってますので、お金かかると思います。(後片付けをしたいときは docker-machine rm aws-sample
で出来るとと思います。後ほどやります。)
その2. デプロイ : docker-compose をして、リモートに反映させる。
いきなりコマンドを紹介したいと思います。これだけで、リモートサーバに反映されます。
$ git clone git@github.com:mochizukikotaro/docker-nginx-phpfpm.git workspace
$ cd workspace
$ docker-compose up
以上、終了でございます。
その3. あとかづけコマンド
# アプリケーションコードを変更したときに、更新したいとき
docker-compose up --build
# 終了する
docker-compose down
# マシンを削除(これで、EC2インスタンも消せます)
docker-machine rm aws-sample
その4. ソースコードと解説
こちらの master ブランチに全ソースをあげてありますので、ソース知りたいかたはこちらからどうぞ。
mochizukikotaro/docker-nginx-phpfpm <= 全ソースはこちら
$ tree
.
├── README.md
├── code
│ ├── index.php
│ └── piyo.php
├── containers
│ ├── nginx
│ │ └── Dockerfile
│ └── php
│ └── Dockerfile
├── default.conf
├── docker-compose.yml
└── nginx.conf
- ポイントとなる、docker-compose.yml および Dockerfile たちはこんな感じです。
version: '3'
services:
web:
build:
context: .
dockerfile: ./containers/nginx/Dockerfile
ports:
- "8080:80"
depends_on:
- php
php:
build:
context: .
dockerfile: ./containers/php/Dockerfile
FROM nginx:latest
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./default.conf /etc/nginx/conf.d/default.conf
FROM php:7-fpm
COPY ./code /var/www/html
↑で、 php 側のコンテナに、アプリケーションコードの /code
をコピーしています。
- アプリケーションコードは、ただただミニマムなサンプルで、PHP が動いていることを確認できるだけのものです。
<?php
echo phpinfo();
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Piyo</title>
</head>
<body>
<?php echo '<h1>This is Piyo</h1>'; ?>
<p>Thank you for comming !!</p>
</body>
</html>
nginx の設定ファイルは2つあるのですが、default.conf
の方はこちらです。
server {
index index.php index.html;
server_name localhost;
root /var/www/html;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
fastcgi_pass php:9000;
がポイントになっています。
あとがき
- ダウンタイムを無くす方法を探してみたいです。
- docker-compose.yml の
context: .
を知るまで、ずっとエラーで泣きそうでした。
以上となります。ありがとうございました。