Docker容器发送空响应

16
希望有人能告诉我缺少了什么?这是一个使用webrick的ruby应用程序,我正在尝试将其容器化。运行在Mac OSX 10.12.3 Sierra上。这是我的Dockerfile。
FROM ruby:2.4.0-alpine
RUN apk add --no-cache gcc musl-dev libstdc++ g++ make
RUN gem install jekyll bundler redcarpet
RUN mkdir -p /usr/app/jekyll
COPY . /usr/app/jekyll
WORKDIR /usr/app/jekyll
EXPOSE 4000:4000
CMD ["jekyll", "serve"]

这是图片的构建方式。
docker build -t chb0docker/cheat .

如果我直接在主机上运行服务,它可以正常运行。
Violas-MacBook-Pro:progfun-wiki cbongiorno$ jekyll serve &
[1] 49286
Violas-MacBook-Pro:progfun-wiki cbongiorno$ Configuration file: /Users/cbongiorno/development/progfun-wiki/_config.yml
Configuration file: /Users/cbongiorno/development/progfun-wiki/_config.yml
            Source: /Users/cbongiorno/development/progfun-wiki
       Destination: /Users/cbongiorno/development/progfun-wiki/_site
 Incremental build: disabled. Enable with --incremental
      Generating... 
                    done in 0.409 seconds.
 Auto-regeneration: enabled for '/Users/cbongiorno/development/progfun-wiki'
Configuration file: /Users/cbongiorno/development/progfun-wiki/_config.yml
    Server address: http://127.0.0.1:4000/
  Server running... press ctrl-c to stop.

确认服务器是否运行:

Violas-MacBook-Pro:progfun-wiki cbongiorno$ curl localhost:4000 2> /dev/null | wc -l
      40

现在在Docker中运行它:
Violas-MacBook-Pro:progfun-wiki cbongiorno$ fg
jekyll serve
^C
Violas-MacBook-Pro:progfun-wiki cbongiorno$ docker run -d --name jekyll -p 4000:4000 chb0docker/cheat 
e766e4acb007033583885b1a3c52dc3c2dc51c6929c8466f3a4ff958f76ebc5f

验证该进程

Violas-MacBook-Pro:progfun-wiki cbongiorno$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
e766e4acb007        chb0docker/cheat    "jekyll serve"      19 minutes ago      Up 32 seconds       0.0.0.0:4000->4000/tcp   jekyll
Violas-MacBook-Pro:progfun-wiki cbongiorno$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' jekyll
172.17.0.3
Violas-MacBook-Pro:progfun-wiki cbongiorno$ docker logs jekyll
Configuration file: /usr/app/jekyll/_config.yml
Configuration file: /usr/app/jekyll/_config.yml
            Source: /usr/app/jekyll
       Destination: /usr/app/jekyll/_site
 Incremental build: disabled. Enable with --incremental
      Generating... 
                    done in 0.329 seconds.
 Auto-regeneration: enabled for '/usr/app/jekyll'
Configuration file: /usr/app/jekyll/_config.yml
    Server address: http://127.0.0.1:4000/
  Server running... press ctrl-c to stop.

现在尝试获取一些数据

Violas-MacBook-Pro:progfun-wiki cbongiorno$ curl localhost:4000 2> /dev/null | wc -l
       0
Violas-MacBook-Pro:progfun-wiki cbongiorno$ curl 172.17.0.3:4000 2> /dev/null | wc -l
       0
Violas-MacBook-Pro:progfun-wiki cbongiorno$ curl 0.0.0.0:4000 2> /dev/null | wc -l
       0

但是,如果我们执行上面的GET请求(使用wget而不是curl,因为它没有安装在这个容器中),我们可以看到容器内部一切正常。

 docker exec -it jekyll /usr/bin/wget -q -O - localhost:4000 | wc -l
      40

这是一个应用程序问题吗?
1个回答

27

看起来 Jekyll 正在绑定到本地主机。要么像这样启动容器:

docker run -d --name jekyll -p 127.0.0.1:4000:4000

或者让Jekyll绑定到0.0.0.0

CMD ["jekyll", "serve", "--host", "0.0.0.0"]

1
这正是我所怀疑的!问题是“该怎么办” - 我选择了第二个选项,因为它使图像完全可移植,没有人需要知道任何额外的东西来运行它。 - Christian Bongiorno
我正在使用Laravel。使用“127.0.0.1:4000:4000”设置Docker端口并在浏览器中访问“127.0.0.1:4000”没有成功,但将Docker端口设置为“4000:4000”并运行“php artisan serve --host = 0.0.0.0” 成功了。现在我可以访问浏览器中的“localhost:4000”,“127.0.0.1:4000”或“0.0.0.0:4000”,它们都可以正常工作。谢谢! - Cameron Hudson
也曾在Docker中调试过FastAPI。localhost和0.0.0.0有什么区别? - Bananin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接