无法从主机访问Docker容器

时间:2018-07-14 20:04:56

标签: ruby-on-rails docker portforwarding

我有一个使用以下Dockerfile的Rails服务的简单映像:

FROM ruby:2.4.4
MAINTAINER sadzid.suljic@gmail.com

RUN apt-get update && apt-get install -y \
    build-essential \
    nodejs

RUN mkdir /app
WORKDIR /app

COPY Gemfile Gemfile.lock ./
RUN gem install bundler && bundle install

COPY . ./

EXPOSE 3000

CMD ["rails", "s", "-p", "3000"]

我构建了图像并使用以下命令运行了容器:

docker build -t chat/users .
docker run -P --name users_service chat/users

我在主机上有以下输出:

 $ docker ps
 CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
 23716591e656        chat/users          "rails s -p 3000"   6 minutes ago       Up 5 minutes        0.0.0.0:32774->3000/tcp   users_service

$ lsof -n -i :32774 | grep LISTEN
com.docke 32891 ssuljic   18u  IPv4 0x41c034d5d4627f5f      0t0  TCP *:filenet-re (LISTEN)
com.docke 32891 ssuljic   19u  IPv6 0x41c034d5d3beb9b7      0t0  TCP [::1]:filenet-re (LISTEN)

$ curl localhost:32774
curl: (52) Empty reply from server

当我在容器中运行curl localhost:3000时,我会从API中得到正确的响应。

有人知道为什么我无法从主机访问容器吗?

我将Docker for Mac用于此版本:

$ docker -v
Docker version 18.03.1-ce, build 9ee9f40

2 个答案:

答案 0 :(得分:2)

默认情况下,某些版本的Rails绑定到本地主机,这说明了为什么您可以从容器内而不是主机(它被视为另一台主机)进行访问。

-b 0.0.0.0指令中添加CMD应该可以解决问题。

答案 1 :(得分:0)

尝试:

docker run -p 3000:3000 --name users_service chat/users

这将映射3000到3000

http://localhost:3000

更多地考虑这一点,我认为这可能是chrome问题还是网络问题,因为我遇到的是同一问题:

这是我的解决方法:

  1. 确保您的/etc/hosts文件具有127.0.0.1 localhost(很有可能已经存在)

  2. 清除的Cookie和缓存的文件

  3. 清除主机缓存

    转到:chrome://net-internals/#dns单击清除主机缓存

  4. 重新启动Chrome

  5. 重置网络适配器 注意: 这是无意的,因此不确定是否是此修复程序的一部分,但想以防万一。

不幸的是,我不确定哪个步骤可以解决问题