Docker疑问:为何-p 80:80生效,而-p 80:8080无法正常访问?
你的问题根源是搞反了Docker -p 参数的端口顺序,同时没搞清楚官方Nginx容器默认的监听端口。
先明确-p参数的正确格式
Docker端口映射的格式是:-p 宿主机端口:容器内部监听端口
简单说就是外部(宿主机)端口在前,内部(容器)端口在后,流量是从宿主机端口转发到容器对应的内部端口。
逐个分析你的命令
测试命令
docker run -it --rm -d -p 8080:80 --name web nginx
这个命令是把宿主机的8080端口,映射到容器内部的80端口——而官方Nginx容器默认就是在80端口提供HTTP服务的,所以访问宿主机的8080端口能正常打开欢迎页,这完全符合预期。错误尝试的
docker run -it --rm -d -p 80:8080 --name web nginx
你以为是把宿主机80端口转发到容器的8080,但问题是官方Nginx容器根本没在8080端口监听任何服务,容器里的Nginx只在80端口运行。这个映射相当于把宿主机80的流量发到容器一个空端口,自然访问不通。
你说此时仍能通过8080访问,大概率是之前运行的8080:80容器没被彻底停止(虽然用了--rm,但如果容器是后台运行状态,需要先执行docker stop web才能清除旧容器,再启动新的)。生效的
docker run -it --rm -d -p 80:80 --name web nginx
这个命令把宿主机80端口直接映射到容器内部的80端口,和Nginx的默认监听端口完全匹配,所以访问宿主机80端口就能正常请求到容器里的Nginx服务,不用输入端口号的需求也就实现了。
额外补充
如果之后你自定义了Nginx配置,让容器内的Nginx监听8080端口,那此时执行-p 80:8080才会生效——但官方镜像默认是监听80的,所以你的错误尝试里这个映射完全无效。
内容的提问来源于stack exchange,提问作者Kevin Chou

