Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

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

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

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

今回は、アプリケーションコードと言っても、index.phppiyo.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

スクリーンショット 2017-02-08 20.49.27.png

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

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

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

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

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

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

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

スクリーンショット 2017-02-08 22.09.02.png

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

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

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

# 終了する
docker-compose down 

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

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

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

mochizukikotaro/docker-nginx-phpfpm <= 全ソースはこちら :writing_hand:

$ 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:
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
containers/nginx/Dockerfile
FROM nginx:latest

COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./default.conf /etc/nginx/conf.d/default.conf
containers/php/Dockerfile
FROM php:7-fpm

COPY ./code /var/www/html

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

  • アプリケーションコードは、ただただミニマムなサンプルで、PHP が動いていることを確認できるだけのものです。:point_down:
index.php
<?php
echo phpinfo();
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 の設定ファイルは2つあるのですが、default.conf の方はこちらです。 :point_down:

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:

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした