2015-01-06 2 views
13

ich eine Rails-Anwendung Behälter mit dem folgenden Dockerfile bauen:Docker Rails-Anwendung nicht bedient werden - curl: (56) Recv fehlgeschlagen: Verbindung von Peer zurückgesetzt

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

der Build erfolgreich:

$ 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 

der Behälter ausgeführt wird:

$ 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 

und es ist 3000/tCP-Port exportieren:

$ 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 

aber der Server nicht erreichbar ist 'intern' oder 'extern' 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 

aber alles scheint 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 

Ich versuchte auch im Browser aber nichts. Das Host-System ist:

$ 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 

Irgendeine Idee?

Antwort

41

Rails server documentation besagt, dass der Server standardmäßig an localhost bindet, und dies verhindert in der Regel dockerized Anwendung Verbindungen zu akzeptieren. Versuchen Sie, es in 0.0.0.0 zu ändern.

+0

natürlich, ich habe bereits versucht, localhost: 3000 sowie 127.0.0.1:3000 und sie scheitern zu –

+2

ich denke, man die Art und Weise änderten die Schienen beginnt, nicht so, wie Sie forderten es? Wird die Verbindung auch zurückgesetzt, wenn Sie auf die IP des Dockers zugreifen, in Ihrem Beispiel 'curl 172.17.0.24:3000'? Können Sie die App aus dem Container heraus anpingen? 'Docker exec -it curl localhost: 3000'? –

+0

ja, von innen funktioniert es, ich bekomme die HTML-Seite zurück, indem ich 'docker exec -it 89ff3bb8c584 curl localhost: 3000' mache –

4

Ich markierte gerade Mykola Gurov Antwort, weil die richtige Ursache meines Problems ist, Ich würde auch gerne die Lösung hinzufügen, die ich implementiert habe, um diese Ursache zu beheben, nur für die Verfolgung pourpose.

I modifizierte config/boot.rb durch Standardoption hinzu:

$ 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 
############################### 

Wenn Sie config/boot.rb nicht ändern wollen, könnte eine andere Lösung Dockerfile werden zwingt 0.0.0.0 Host als ein binden ENTRYPOINT/CMD Parameter:

$ 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"] 
Verwandte Themen