このエントリの Goal

  • nginx の Official Image を使って Container を起動する.
  • nginx の設定を Docker の Image にする.
  • nginx の Container を Reverse Proxy として、Ghost を動かす.

nginx Container を起動する

$ docker run -p 8080:80 -d nginx

このコマンドだけで nginx が起動し、 8080ポートにアクセスすれば nginx のデフォルトページが表示される.


nginx 設定を Docker の Image にする

$ tree ./nginx
nginx
├── Dockerfile
└── etc
    └── nginx
        └── ghost.conf

Dockerfile

$ cat nginx/Dockerfile
FROM nginx
MAINTAINER itomoyasu <itomoyasu@gmail.com>

# set nginx config
COPY etc/nginx/* /etc/nginx/conf.d/

nginx/default.conf

$ cat etc/nginx/default.conf
# リダイレクト用
server {
    listen       80;
    server_name  default;
    return 301 $scheme://itomoyasu.com$request_uri;
}

nginx/ghost.conf

$ cat etc/nginx/ghost.conf
upstream ghost-app {
    least_conn;
    server ghost1:2368 weight=5 max_fails=3 fail_timeout=30s;
    server ghost2:2368 weight=5 max_fails=3 fail_timeout=30s;
}

server {
    listen      80;
    server_name .itomoyasu.com;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host      $http_host;
        proxy_pass                 http://ghost-app;
    }
}
build する
$ docker build -t itomoyasu/nginx .

# 確認
$ docker images
REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
itomoyasu/nginx                               latest              28c79bdae42c        3 seconds ago       182.7 MB

nginx を Reverse Proxy として Ghost を動かす

まずは構成をイメージしておく

コンポーネント図

  • Container1: Data Volume用
  • Container2: nginx
  • Container3: ghost application
  • Container4: ghost application(控え)

の計4つの Container を立ち上げる。

Container を連携させて立ち上げる

Container を連携させる場合は、参照先の Container から順次立ち上げる。今回の場合は、container1 => container3, container4 => container2 の順に立ち上げる。

container1(Data Volume Container) を立ち上げる

$ docker run -v /var/lib/ghost --name ghost_data itomoyasu/ghost-prepare
95e6566d07b7

container3, 4(ghost application) を立ち上げる

どちらの ContainerもData Volume を参照したいので --volumes-from option を使う.

$ docker run --name ghost1 -p 2368 --volumes-from ghost_data -d ghost:latest npm start --production
470d46ded4204b4f927e945fe75a4a1a4b06a3f4b64c5d6bd9e264f19beaf127

$ docker run --name ghost2 -p 2368 --volumes-from ghost_data -d ghost:latest npm start --production
bfa55d54353c255b593a5285cb722a598f07c0d3c632bc7ca31b19345da0116d

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
bfa55d54353c        ghost:latest        "/entrypoint.sh npm s"   3 seconds ago       Up 2 seconds        0.0.0.0:32773->2368/tcp   ghost2
470d46ded420        ghost:latest        "/entrypoint.sh npm s"   11 seconds ago      Up 10 seconds       0.0.0.0:32772->2368/tcp   ghost1

container2(nginx) を立ち上げる

container 間の network 情報を共有する必要があるので --links option を使う。 --links option については、公式のLegacy container linksDocker の基本学習 ~ コンテナ間のリンク が参考になった。

$ docker run --name nginx --link ghost1:ghost1 --link ghost2:ghost2 -p 80:80 -d itomoyasu/nginx
a888fe41e3bbf04b79b101fe113cab784aac06155ddc4368acab1db9321c9c35

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
a888fe41e3bb        itomoyasu/nginx     "nginx -g 'daemon off"   4 seconds ago       Up 3 seconds        0.0.0.0:80->80/tcp, 443/tcp   nginx
bfa55d54353c        ghost:latest        "/entrypoint.sh npm s"   3 minutes ago       Up 3 minutes       0.0.0.0:32773->2368/tcp   ghost2
470d46ded420        ghost:latest        "/entrypoint.sh npm s"   3 minutes ago       Up 3 minutes       0.0.0.0:32772->2368/tcp   ghost1

以上で、nginx を Reverse Proxy として Ghost を立ち上げること出来た。

docker-compose を使うと複数 Container の定義をまとめられるらしいが、長くなりそうなのでまた今度の機会に試してみたい。