无法从主机访问 docker 个容器
Can't access docker containers from host
我有一个 Rails 服务的简单图像,包含以下 Docker 文件:
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 用于此版本的 Mac:
$ docker -v
Docker version 18.03.1-ce, build 9ee9f40
尝试:
docker run -p 3000:3000 --name users_service chat/users
这会将 3000 映射到 3000
http://localhost:3000
进一步调查,我认为这是 chrome 问题或网络问题,因为我遇到了同样的问题:
我是这样解决的:
确保您的 /etc/hosts
文件有 127.0.0.1 localhost
(很可能它已经存在)
已清除 Cookie 和缓存文件
已清除主机缓存
转到:chrome://net-internals/#dns
单击清除主机缓存
重新启动chrome
重置网络适配器
注意: 这是无意的,所以不确定它是否是修复的一部分,但想包括它以防万一。
很遗憾,我不确定哪一步解决了问题
某些版本的 Rails 默认绑定到本地主机,这解释了为什么您可以从容器内访问但不能从主机访问(它被视为不同的主机)。
在 CMD
指令中添加 -b 0.0.0.0
应该可以解决问题。
我有一个 Rails 服务的简单图像,包含以下 Docker 文件:
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 用于此版本的 Mac:
$ docker -v
Docker version 18.03.1-ce, build 9ee9f40
尝试:
docker run -p 3000:3000 --name users_service chat/users
这会将 3000 映射到 3000
http://localhost:3000
进一步调查,我认为这是 chrome 问题或网络问题,因为我遇到了同样的问题:
我是这样解决的:
确保您的
/etc/hosts
文件有127.0.0.1 localhost
(很可能它已经存在)已清除 Cookie 和缓存文件
已清除主机缓存
转到:
chrome://net-internals/#dns
单击清除主机缓存重新启动chrome
重置网络适配器 注意: 这是无意的,所以不确定它是否是修复的一部分,但想包括它以防万一。
很遗憾,我不确定哪一步解决了问题
某些版本的 Rails 默认绑定到本地主机,这解释了为什么您可以从容器内访问但不能从主机访问(它被视为不同的主机)。
在 CMD
指令中添加 -b 0.0.0.0
应该可以解决问题。