Docker Rails app fails to be served – curl: (56) Recv failure: Connection reset by peer

I build a Rails app container with the following Dockerfile:

$ cat Dockerfile
FROM ruby:2.2

MAINTAINER Luca G. Soave <luca.soave@gmail.com>

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

the build succeed:

  • Connecting IBM Containers (Dockers) to Watson IoT service instance
  • Docker port not visible
  • Cleaning docker containers via jenkins shell on slave
  • Dockerfile for open-source project [duplicate]
  • should I create a VM and then use docker machine inside the VM for development
  • Running 2 sites on docker-nginx-php 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
    

    the container is running:

    $ 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
    

    and it’s exporting 3000/tcp port:

    $ 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   
    

    but the server is not reachable ‘internally’ or ‘externally’ 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
    

    but everything seems 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
    

    I tried also in the browser but nothing. The host sistem is:

    $ 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
    

    Any idea?

  • Docker container that depends on file in other container
  • difference between checkpoint and docker export
  • Docker worklfow of testing images
  • Accessing localhost of a docker container from the host
  • Remote `docker-compose build`: workaround slow connections
  • How can I make a local docker container?
  • 2 Solutions collect form web for “Docker Rails app fails to be served – curl: (56) Recv failure: Connection reset by peer”

    Rails server documentation states that the server by default binds to localhost, and this usually prevents dockerized application to accept connections. Try changing it to 0.0.0.0.

    I just flagged Mykola Gurov answer because is the right ’cause’ of my issue,
    anyway I’d also like to add the solution I implemented to work around that cause, just for tracking pourpose.

    I modified config/boot.rb by adding default option:

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

    If you don’t want modify config/boot.rb, another solution could be forcing Dockerfile to bind 0.0.0.0 host as an 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"]
    
    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.