Docker for Mac + Rails + nginx + unicorn


Docker for MacでRails + nginx + unicorn環境を作った時のメモ
なお、MacのOSは`Sierra ver 10.12.2`で行いました。

下記の記事を参考に、ほぼそのまま進めました。
[Docker for Macを使ってRuby on Rails開発環境を構築する](http://ceblog.mediba.jp/post/148975191192/docker-for-mac%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6ruby-on-rails%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B)

## Docker for Macをインストール
[こちらから](https://docs.docker.com/docker-for-mac/#/download-docker-for-mac)インストール

## 各種設定

### Docker Composeの設定
コンテナ群を定義するdocker-compose.ymlを作成する

```
$ mkdir test
$ cd test
$ vi docker-compose.yml
```

```test/docker-compose.yml
version: '2'
services:
  rails:
    container_name: rails
    build: .
    command: bundle exec unicorn -p 3000 -c config/unicorn.conf.rb
    ports:
      - '3000:3000'
    environment:
      RAILS_ENV: development
      MYSQL_ROOT_PASSWORD: 'root'
      DATABASE_URL: 'mysql2://root:root@mysql:3306'
    depends_on:
      - mysql
    volumes:
      - ./:/myapp
    links:
      - db
  nginx:
    container_name: nginx
    build: containers/nginx
    ports:
      - '80:80'
    depends_on:
      - rails
    volumes:
      - ./containers_data/nginx:/var/log/nginx
    links:
      - rails
  db:
    container_name: mysql
    image: mysql:5.6.32
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
    ports:
      - '3306:3306'
    volumes:
      - ./containers_data/mysql:/var/lib/mysql
```

### Dockerfileの設定
コンテナのビルド時に実行される処理を記載したDockerfileを作成する

* まずはメインのDockerfile（railsとmysql用）

```
$ vi Dockerfile
```

```test/Dockerfile
FROM ruby:2.3.1

RUN apt-get update && apt-get install -y mysql-client --no-install-recommends && rm -rf /var/lib/apt/lists/*

RUN mkdir /var/lib/mysql && touch /var/lib/mysql/mysql.sock
ADD ./containers/mysql/my.cnf /etc/

RUN mkdir /myapp
WORKDIR /myapp

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

RUN bundle install

COPY . /myapp

EXPOSE 3000
```

* 次にnginx用のDockerfile

```
$ mkdir container
$ mkdir container/nginx
$ vi container/nginx/Dockerfile
```

```test/container/nginx/Dockerfile
FROM nginx:1.10.1

ADD nginx.conf /etc/nginx/nginx.conf
```

* コンテナにマウントされるnginx.confを設置（railsコンテナを3000番ポートでproxyするunicornのappサーバーを参照する設定）

```
$ vi test/container/nginx/nginx.conf
```

```test/container/nginx/nginx.conf
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;

    server {
        listen       80;
        server_name  myapp;

        root /myapp/public;

        location / {
            proxy_pass http://app_server;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Client-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

        error_page  404              /404.html;
        error_page  500 502 503 504  /500.html;
        location = /500.html {
            root   /myapp/public;
        }
    }

    upstream app_server {
        server rails:3000;
    }

    include /etc/nginx/conf.d/*.conf;
}
```


## コンテナ作成、起動
ここで、[参考記事](http://ceblog.mediba.jp/post/148975191192/docker-for-mac%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6ruby-on-rails%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B)から拝借したrailsプロジェクトの雛形をcloneしています。
主に下記の作業が行われていると思われます。
- unicornの設定
- mysqlデータベースの設定
- コンテナ内のデータ永続化用ディレクトリ`container_data`の設置

```
$ git clone git@github.com:mediba-moritake/docker-rails5.git
$ cd docker-rails5
$ docker-compose build
$ docker-compose run rails rails db:create
$ docker-compose up -d
```

## 確認

```
$ open http://127.0.0.1
```