可以从主机访问Docker容器,但是那不可能吗?

时间:2019-10-26 21:29:48

标签: docker

我已经克隆了这个项目:

https://github.com/andfanilo/vue-hello-world

并为其创建了一个dockerfile:

FROM node:10
RUN apt install curl

# make the 'app' folder the current working directory
RUN mkdir /app
# copy project files and folders to the current working directory (i.e. 'app' folder)
COPY . /app

WORKDIR /app

RUN npm install
CMD [ "npm", "run", "serve" ]

我使用以下命令构建并运行它:

FRONTEND_IMAGE='frontend-simple-image'
FRONTEND_CONTAINER_NAME='frontend-simple-container'

docker build -t ${FRONTEND_IMAGE} .
docker rm -f ${FRONTEND_CONTAINER_NAME}
docker run -it --name ${FRONTEND_CONTAINER_NAME} ${FRONTEND_IMAGE}

它可以成功构建并运行:

enter image description here

我可以在主机浏览器上访问它:

enter image description here

除了我不会期望我可以根据以下条件从主机浏览器访问之外,这一切都很好:

https://docs.docker.com/config/containers/container-networking/

默认情况下,创建容器时,它不会将其任何端口发布到外界。要使端口可用于Docker外部的服务或未连接到容器网络的Docker容器,请使用--publish或-p标志。这将创建一个防火墙规则,该规则将容器端口映射到Docker主机上的端口。这是一些示例。

那么为什么不添加-p 8080:8080docker run上就可以工作(从我的主机浏览器访问Web应用程序)?

1 个答案:

答案 0 :(得分:5)

一切正常。要访问该网站,您正在使用172.17.0.2,它属于最初的Docker bridge网络172.17.0.0/16。如果您不指定任何其他网络,则它是在其中创建所有容器的基本网络。

由于bridge是在主机上创建的网络,因此您可以使用直接ip地址自由访问它。但是,如果您尝试通过localhost:8080127.0.0.1:8080访问Vue应用程序,则您将无法连接,因为您使用的是其他网络。添加-p 8080:8080后,行为应会更改,并且可以通过本地主机访问应用程序。

基本上,Docker文档中的“外部世界”是指分配给容器的网络之外的网络,因此在您的情况下,“外部世界”除172.17.0.0/16外都是其他东西。

您是否可以阅读有关容器通信here的更多信息: