質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

522閲覧

RailsとNginxのUNIX DOMAIN SOCKETについて

ishiatama

総合スコア11

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

3クリップ

投稿2019/06/11 08:15

編集2019/06/11 15:14

実現したいこと

ホスト上のRailsとコンテナ上のNginxをUNIX DOMAIN SOCKETで連携させたい

現状

Docker(docker-compose)でRailsコンテナとNginxコンテナを作成し、コンテナ間のsocket通信することは出来たのですが
Railsをコンテナではなく、ホスト(Mac)側に環境を作った際に、Nginxでconnect() to unix:///var/www/myapp/tmp/sockets/puma.sock failed (111: Connection refused) while connecting to upstream, client: 172.19.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://unix:///var/www/myapp/tmp/sockets/puma.sock:/", host: "localhost"のエラーが発生し通信できません。
そもそもホストとコンテナ間でsocket通信は可能なのでしょうか?


追記

  • localhost:3000で通信できましたが、localhostだと上記のエラーになります。
  • Macにbrewでnginxをインストールし、同じconf設定にするとlocalhostでWebページが表示されることを確認しました。

Nginxの設定は以下のとおりです。

# docker-compose.yml version: '2' services: postgres: image: postgres ports: - 5432:5432 environment: POSTGRES_USER: devuser POSTGRES_PASSWORD: password POSTGRES_DB: dev volumes: - ./containers/postgresql/init.sh:/docker-entrypoint-initdb.d/init.sh - ./data/pg-data:/var/lib/postgresql/data nginx: build: ./containers/nginx ports: - 80:80 volumes: - ./public:/var/www/myapp/public - ./tmp:/var/www/myapp/tmp - ./log:/var/www/myapp/log environment: TZ: Asia/Tokyo depends_on: - postgres

Dockerfile

1FROM nginx 2 3RUN apt-get update -qq && apt-get -y install apache2-utils 4ENV RAILS_ROOT /var/www/myapp 5WORKDIR $RAILS_ROOT 6 7ADD default.conf /tmp/default.nginx 8ADD nginx.conf /tmp/nginx.nginx 9 10RUN envsubst '$RAILS_ROOT' < /tmp/default.nginx > /etc/nginx/conf.d/default.conf 11RUN envsubst '$RAILS_ROOT' < /tmp/nginx.nginx > /etc/nginx/nginx.conf 12 13EXPOSE 80 14CMD ["nginx", "-g", "daemon off;"] 15
# 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 75; gzip on; include /etc/nginx/conf.d/*.conf; }
# /etc/nginx/conf.d/default.conf upstream puma { server unix://$RAILS_ROOT/tmp/sockets/puma.sock; } server { listen 80; server_name localhost; root $RAILS_ROOT/public; index index.html; access_log $RAILS_ROOT/log/nginx.access.log; error_log $RAILS_ROOT/log/nginx.error.log; # deny requests for files that should never be accessed location ~ /. { deny all; } location ~* ^.+.(rb|log)$ { deny all; } # serve static (compiled) assets directly if they exist (for rails production) location ~ ^/(assets|images|javascripts|stylesheets|swfs|system)/ { try_files $uri @rails; access_log off; gzip_static on; # to serve pre-gzipped version expires max; add_header Cache-Control public; # Some browsers still send conditional-GET requests if there's a # Last-Modified header or an ETag header even if they haven't # reached the expiry date sent in the Expires header. add_header Last-Modified ""; add_header ETag ""; break; } location / { try_files $uri @rails; } location @rails { proxy_pass http://puma; 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 $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } error_page 404 /404.html; error_page 500 502 503 504 /500.html; location = /500.html { root $RAILS_ROOT/public; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ホスト側で起動したアプリケーションのソケットのあるディレクトリを、コンテナ側にVolumeでマウントさせる、というのはどうでしょうか?

20190612 追記
ホスト側のdocker.sockをコンテナ側にマウントさせてDockerのAPIを叩く...というのは試したりするので、気になってrailsをソケットであげて、コンテナ側にソケットファイルをマウントさせて、コンテナ内部からsocatでリクエストを出す、ということをやってみました。

Docker for Macに限ってですが、この場合、コンテナ側からは socat[16] E connect(5, AF=1 "/tmp/sockets/puma.sock", 24): Connection refused のメッセージが出たので、エラーメッセージとしては同様かと思います。
もし環境が違っていても再現するようでしたら、とりあえずはホスト側のアプリケーションもTCPで上げておくのが良いのかな...とは思っています。なにか参考になれば幸いです。

関連:
https://forums.docker.com/t/cant-connect-to-host-listening-unix-socket-from-container-vm/15526/2

投稿2019/06/11 09:16

編集2019/06/12 10:19
suama

総合スコア1997

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ishiatama

2019/06/11 09:29

ご回答ありがとうございます。マウントはdocker-compose.ymlで設定しております。こちら掲載しておらず申し訳ございません。
suama

2019/06/11 11:39

失礼しました。docker-compose.yml も上記に添えていただくのは可能でしょうか?
ishiatama

2019/06/11 15:31 編集

docker-compose.ymlを記載しました。また、こちらで試したことについては追記として記述しています。ご確認お願いいたします。
suama

2019/06/12 01:46

こんにちは、追記ありがとうございます! もしかして実施している環境はMacOSでしょうか?(Docker hostがMacOS / Docker for Mac) わたしも実験してみたのですが、Docker for MacだとVolume optionを使ってソケットファイルをマウントさせても、うまく通信できないようです。回答の方に追記しておきますね。 Unix(たとえばホストがUbuntu)だとできるのかな?(個人的な興味で確認するかもしれません)
ishiatama

2019/06/12 09:32 編集

実行環境は仰るとおりMacです。私の方でも色々と試してみましたが上手くできないようです。ネットワークの知識があまりなく、どういう仕組みで出来ないのかはわかりませんが・・・。 Dockerのドキュメントを確認すると`host.docker.internal`で通信できると書いていたので、これをNginxのupstreamに設定したところ正常に動作することを確認できました。 https://docs.docker.com/docker-for-mac/networking/ 一旦はこれで完了と致しますが、ご確認したことを更に追記された際にはぜひ参考にさせていただきます。ご対応誠にありがとうございました。
suama

2019/06/12 10:17

こちらこそ、ちょうど色々な組み合わせで試すことがあったので、制約などが分かって良い経験でした。 host.docker.internalは、Docker for Macの場合利用できる指定方法で、コンテナ内からDocker for Mac (ホストになっているMac側)を参照したい場合、IPでなく名前で指定できるものだったかと思います。 結果的には、ホスト(Mac側)のアプリケーションはTCPで上げた形でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問