紹介する内容
- 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 で確認できます
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で通信します- UNIX-domain socketを簡単に説明すると
ファイルを持って通信できる
です。- ですから、docker composeのマウントだけでnginxとunicornが連携できます
- https://en.wikipedia.org/wiki/Unix_domain_socket
- UNIX-domain socketを簡単に説明すると
- 全てのrequestが
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が同じファイルをマウントできるように各々のコンテナに同じく書きます。
試し順番です
- docker composeがあるデレクトリーに移動します
cd qiita-example/rails/6/unicorn-nginx
- dockerコンテナをバックグラウンドで起動します
DOCKER_UID=$(id -u $USER) DOCKER_GID=$(id -g $USER) docker-compose up -d