Rails6・unicorn、nginx、postgresのdockerコンテナを別々で立てる


紹介する内容

  • dockerコンテナを三つ(Rails6とunicorn一緒に、nginx、postgres)にして立てます
  • nginxのUNIX-domain socketとdocker composeのvolume活用します

結論

Rails6コンテナはunicornをforegroundで起動、nginxのUNIX-domain socketをdocker composeのvolumeマウントしたら動きます

  • Rails6コンテナはunicornをforegroundで起動させて、nginxの通信を待ちながらコンテナが落ちない(exit 0)ようにします
  • nginxのUNIX-domain socketをdocker composeのvolumeを使って、Rails6コンテナのunicornに共有させます
    • UNIX-domain socket使いますからportはnginxとpostgresだけ開けば十分です

AWS ECSなどに活用できます

  • dockerコンテナを別々に立てる予定のECSにこのコンテナ構成動くか?の事前試しができます

priでデバックしずらくなりますから、開発環境ならRailsコンテナ一つ立ててbundle exec rails sすることを推奨します

  • binding.pryはかかりますが、ユーザーが値を入力できるところがよく分かりません
    • Railsコンテナにdocker attachしてもだめでした

紹介始めます

ディレクトリ構成

全体ソースコードは https://github.com/cheekykorkind/qiita-example/tree/master/rails/6/unicorn-nginx で確認できます

  • 全体図

  • Rails6とunicorn dockerファイルデレクトリー

  • nginx dockerファイルデレクトリー

nginx confファイル説明

いろいろ書かれてますが、必要な部分だけ書きます

  • ./docker/nginx/nginx.confファイルです
    • include /etc/nginx/conf.d/*.conf; によって、./docker/nginx/web.conf が読み込めます
  • ./docker/nginx/web.confファイルです
    • 全てのrequestが location / に入ります
    • proxy_pass http://unicorn; によって upstream unicorn に行きます
    • unix:/workspace/myapp/tmp/unicorn.todo.sock に来たらUNIX-domain socketで通信します
upstream unicorn {
  server unix:/workspace/myapp/tmp/unicorn.todo.sock fail_timeout=0;
}

server {
  listen       80;

  location / {
    ...省略

    proxy_pass http://unicorn;

    ...省略
  }
  ...省略
}

unicorn設定ファイル説明

  • ./config/unicorn/development.rb ファイルです
  • listen "#{RAILS_ROOT}/tmp/unicorn.todo.sock" をnginxのconfファイルの内容と同じパスを書くことでUNIX-domain socketの通信ができます

docker周り実装説明

  • ./docker-compose.yml ファイルです
  • bundle exec unicorn -c ./config/unicorn/development.rbでunicornをforegroundで起動します
  • UNIX-domain socketの専用volumeを作ります
volumes:
  nginx_socket:
    driver: local

そして、nginx_socket:/workspace/myapp/tmpでdockerコンテナ中でマウントするパスを設定します。
unicornとnginxが同じファイルをマウントできるように各々のコンテナに同じく書きます。

試し順番です

  1. docker composeがあるデレクトリーに移動します
    • cd qitta-example/rails/6/unicorn-nginx
  2. dockerコンテナをバックグラウンドで起動します
    • DOCKER_UID=$(id -u $USER) DOCKER_GID=$(id -g $USER) docker-compose up -d