端口转发
原创大约 2 分钟
两台虚拟机能够互相ping
通。
虚拟机1
:172.16.185.166
虚拟机2
:172.16.185.130

现在需要实现如下目的。

这必须借助端口转发才能完成。
创建容器web2
,将宿主机的8080
端口映射到容器的80
端口上:-p [宿主机端口]:[容器端口]
。
> docker run -d -p 8080:80 --name web2 --network mynet nginx
查看web2
的ip
地址。
> docker inspect web2
......
"Networks": {
"mynet": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"db317495c64f"
],
"NetworkID": "7984433eed3c720ccc84890d75a31ee922366a5e6dd097a0977a9ca726f075f7",
"EndpointID": "ca71520537eaa8063d474d2809a0151f56b253228ebf49beb70d1c0fc53e1034",
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.4",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:13:00:04",
"DriverOpts": null
}
}
在宿主机1
上通过容器IP
访问Nginx服务。

在宿主机1
上通过宿主机IP
访问。


在宿主机2
上通过宿主机1
的IP
访问。

在虚拟机外部的MacBook
上访问。

端口转发。

查看iptables
的转发规则。
> iptables -t nat -nvxL

问题:如果docker命令使用端口转发-p参数,那么在Dockerfile中是否还需要通过EXPOSE来暴露端口?
答案:不需要。
EXPOSE
语法的作用实际上更多是解释说明的作用。也就是说,EXPOSE
起不到端口转发的作用。但是如果没有它,那么初次使用镜像的用户就不知道该通过哪个端口访问服务了。

有这样一个Dockerfile
。
FROM python:3.9.5-slim
RUN pip install flask
WORKDIR /src
ENV FLASK=app.py
COPY app.py /src/app.py
# EXPOSE 2024
CMD ["flask", "run", "h", "0.0.0.0"]
如果取消掉EXPOSE
的注释,那么在通过inspect
指令查看时会发现多出了一个"ExposedPorts":{"2024/tcp":{}}
的属性值。
感谢支持
更多内容,请移步《超级个体》。