docker-machine をつかってリモートサーバにデプロイしてみる。Docker + Nginx + PHP-FPM -> EC2

docker。ローカルで何かするには、本当に気持ちいい操作感だと感じています。

そうなるとやっぱり、本番環境も docker にしてみたいという気持ちが、すごい勢いで芽生えてきます。

まだまだ勉強中ですので、大層なことはできませんが、**試しに、一台の Amazon EC2 にデプロイ**してみたいと思います。:robot:


リモートにデプロイするときに、**アプリケーションソースコードをどうやって本番反映させるのか？**ということは、しばしば議論されることかもしれません。`git clone` でやるのか？コンテナに含めるのか？など。

今回は、アプリケーションコードと言っても、`index.php` と `piyo.php` だけですので、**Dockerfile の `COPY`** を使う方針でやります。構成は、掲題の通りです。


作業的には、

- その1. 準備
- その2. デプロイ

ですぐにおわります。



# その1. 準備 : まずは docker-machine を用意

[Amazon Web Services (AWS) EC2 example](https://docs.docker.com/machine/examples/aws/)

上に、やり方は書いてありますので、これにそってつくります。

```zsh
# マシンをつくる。（これは少し時間かかります。）
$ 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
```

![スクリーンショット 2017-02-08 20.49.27.png](https://qiita-image-store.s3.amazonaws.com/0/45822/fdbe4b1a-425b-a1cc-2f4b-1a3789856646.png)

そして、**いまのところ手動なのですが、セキュリティグループの設定で、ポートの 8080 を開けておいてください。** 

TODO:
セキュリティグループの設定方法を調べる。

これで、docker-machine の準備はできましたので、とくに問題ないかとおもいます。:neutral_face:

インスタンスが立ち上がってますので、**お金かかると思います。**（後片付けをしたいときは `docker-machine rm aws-sample` で出来るとと思います。後ほどやります。）

# その2. デプロイ : docker-compose をして、リモートに反映させる。

**いきなりコマンドを紹介したいと思います。これだけで、リモートサーバに反映されます。**

```zsh
$ git clone git@github.com:mochizukikotaro/docker-nginx-phpfpm.git workspace
$ cd workspace
$ docker-compose up
```

![スクリーンショット 2017-02-08 22.09.02.png](https://qiita-image-store.s3.amazonaws.com/0/45822/2c44c7f3-1d2c-82e1-0e76-4483765eaff2.png)


以上、終了でございます。:grinning:


# その3. あとかづけコマンド

```zsh
# アプリケーションコードを変更したときに、更新したいとき
docker-compose up --build

# 終了する
docker-compose down 

# マシンを削除（これで、EC2インスタンも消せます）
docker-machine rm aws-sample
```



# その4. ソースコードと解説


こちらの master ブランチに全ソースをあげてありますので、ソース知りたいかたはこちらからどうぞ。:pray:

[mochizukikotaro/docker-nginx-phpfpm](https://github.com/mochizukikotaro/docker-nginx-phpfpm/) <= 全ソースはこちら :writing_hand:


```zsh
$ tree
.
├── README.md
├── code
│   ├── index.php
│   └── piyo.php
├── containers
│   ├── nginx
│   │   └── Dockerfile
│   └── php
│       └── Dockerfile
├── default.conf
├── docker-compose.yml
└── nginx.conf
```

- ポイントとなる、docker-compose.yml および Dockerfile たちはこんな感じです。:point_down:

```yaml:docker-compose.yml
version: '3'
services:
  web:
      build:
        context: .
        dockerfile: ./containers/nginx/Dockerfile
      ports:
          - "8080:80"
      depends_on:
          - php
  php:
      build:
        context: .
        dockerfile: ./containers/php/Dockerfile
```

```vim:containers/nginx/Dockerfile
FROM nginx:latest

COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./default.conf /etc/nginx/conf.d/default.conf
```

```vim:containers/php/Dockerfile
FROM php:7-fpm

COPY ./code /var/www/html
```

↑で、 php 側のコンテナに、**アプリケーションコードの `/code` をコピー**しています。


- アプリケーションコードは、ただただミニマムなサンプルで、PHP が動いていることを確認できるだけのものです。:point_down:

```php:index.php
<?php
echo phpinfo();
```

```php:piyo.php
<!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 の設定ファイルは２つあるのですが、`default.conf` の方はこちらです。 :point_down: 

```vim: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: .` を知るまで、ずっとエラーで泣きそうでした。



以上となります。ありがとうございました。:dancer_tone4: