2015-01-06 15 views
13

による接続リセット私は、次のDockerfileでのRailsアプリのコンテナを構築:ドッカーのRailsアプリを提供することに失敗した - カール:(56)のrecv失敗:ピア

$ cat Dockerfile 
FROM ruby:2.2 

MAINTAINER Luca G. Soave <[email protected]> 

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

RUN mkdir -p /usr/src/app 
WORKDIR /usr/src/app 

COPY . /usr/src/app/ 
RUN bundle install 

EXPOSE 3000 
CMD ["rails", "server"] 

ビルドが成功する:

$ docker build -t querier . 
Sending build context to Docker daemon 46.75 MB 
Sending build context to Docker daemon 
... 
Step 10 : CMD rails server 
---> Running in 8eb62f8a579a 
---> 65eee929d518 
Removing intermediate container 8eb62f8a579a 
Successfully built 65eee929d518 

$ docker logs -f 89ff3bb8c584 
=> Booting WEBrick 
=> Rails 4.2.0 application starting in development on http://localhost:3000 
=> Run `rails server -h` for more startup options 
=> Ctrl-C to shutdown server 
[2015-01-06 19:56:56] INFO WEBrick 1.3.1 
[2015-01-06 19:56:56] INFO ruby 2.2.0 (2014-12-25) [x86_64-linux] 
[2015-01-06 19:56:56] INFO WEBrick::HTTPServer#start: pid=1 port=3000 

をし、それが3000/TCPポートを輸出しています:

コンテナが実行されている

$ docker ps -al 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS     NAMES 
89ff3bb8c584  querier:latest  "rails server"  16 minutes ago  Up 16 minutes  0.0.0.0:3000->3000/tcp gloomy_babbage 

が、サーバーが '内部' 到達できない場合、または '外部' ドッカー:

$ curl 0.0.0.0:3000 
curl: (56) Recv failure: Connection reset by peer 
$ curl 172.17.0.24:3000 
curl: (7) Failed to connect to 172.17.0.24 port 3000: Connection refused 

が、すべてがOKらしい:

$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 89ff3bb8c584 
172.17.0.24 
$ netstat -r 
Kernel IP routing table 
Destination  Gateway   Genmask   Flags MSS Window irtt Iface 
default   10.36.32.1  0.0.0.0   UG  0 0   0 wlan0 
10.0.3.0  *    255.255.255.0 U   0 0   0 lxcbr0 
10.36.32.0  *    255.255.248.0 U   0 0   0 wlan0 
172.17.0.0  *    255.255.0.0  U   0 0   0 docker0 

$ ping 0.0.0.0 
PING 0.0.0.0 (127.0.0.1) 56(84) bytes of data. 
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.069 ms 
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.061 ms 
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.069 ms 
^C 
--- 0.0.0.0 ping statistics --- 
3 packets transmitted, 3 received, 0% packet loss, time 1998ms 
rtt min/avg/max/mdev = 0.061/0.066/0.069/0.007 ms 

$ ping 172.17.0.24 
PING 172.17.0.24 (172.17.0.24) 56(84) bytes of data. 
64 bytes from 172.17.0.24: icmp_seq=1 ttl=64 time=0.085 ms 
64 bytes from 172.17.0.24: icmp_seq=2 ttl=64 time=0.107 ms 
64 bytes from 172.17.0.24: icmp_seq=3 ttl=64 time=0.076 ms 
^C 

私はブラウザが、何にも試してみました。ホストシステムは次のとおりです。

$ docker -v 
Docker version 1.4.1, build 5bc2ff8 
$ uname -a 
Linux basenode 3.11.0-18-generiC#32-Ubuntu SMP Tue Feb 18 21:11:14 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux 

答えて

41

Rails server documentationは、デフォルトでサーバーがlocalhostにバインドされていることを示しています。これにより、通常、ドッキングされたアプリケーションが接続を受け入れることができなくなります。それを0.0.0.0に変更してみてください。

+0

、私はすでにlocalhostを試してみました:3000と同様に127.0.0.1:3000を、彼らは、私はあなたが呼んでいた道、レールが起動する方法をない変えたと思いすぎ –

+2

失敗しますそれ?あなたの例 'curl 172.17.0.24:3000'では、ドッカーのIPでアクセスすると接続もリセットされますか? 'docker exec -it curl localhost:3000'のように、コンテナ内からアプリケーションにpingすることができますか? –

+0

はい、そこから動作します、私は 'docker exec -it 89ff3bb8c584 curl localhost:3000'を実行してhtmlページを返します。 –

4

私はちょうど私の問題の右 '原因'であるため、 と私はちょうど私がその原因を回避するために実装したソリューションを追加したいと思います。

私は、デフォルトのオプションを追加することにより、設定/ boot.rbを変更:

$ cat config/boot.rb 
# Set up gems listed in the Gemfile. 
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 

require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) 

######## added lines ######## 
require 'rails/commands/server' 

module Rails 
    class Server 
    alias :default_options_alias :default_options 
    def default_options 
     default_options_alias.merge!(:Host => '0.0.0.0') 
    end 
    end 
end 
############################### 

を使用すると、設定/ boot.rbを変更したくない場合は、別の解決策として0.0.0.0ホストをバインドするDockerfileを強制することができENTRYPOINT/CMDパラメータ:コースの

$ cat Dockerfile 
FROM ruby:2.2 

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

RUN mkdir -p /usr/src/app 
WORKDIR /usr/src/app 

COPY . /usr/src/app/ 
RUN bundle install 

EXPOSE 3000 
ENTRYPOINT ["rails", "server", "-b", "0.0.0.0"] 
関連する問題