web-dev-qa-db-ja.com

Docker Railsアプリの提供に失敗しました-curl:(56)Recv failure:接続がピアによってリセットされました

次のDockerfileを使用してRailsアプリコンテナーを作成します。

$ 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   

しかし、サーバーは「内部」または「外部」のDockerに到達できません。

$ 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

しかし、すべてが大丈夫のようです:

$ 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

何か案が?

20
BBJ3

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

56
Mykola Gurov

私の問題の正しい「原因」であるため、Mykola Gurovの回答にフラグを立てました。とにかく、目的を追跡するために、その原因を回避するために実装したソリューションを追加したいと思います。

デフォルトオプションを追加してconfig/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
###############################

Config/boot.rbを変更したくない場合、別の解決策は、DockerfileにENTRYPOINT/CMDパラメーターとして0.0.0.0ホストをバインドさせることです。

$ 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"]
4
BBJ3