当我使用非常简单的命令来运行Docker时:
docker run -p 80:80 nginx
端口转发正常工作,当我使用浏览器 / curl 访问 localhost:80 时,可以获取nginx的“欢迎页面”。
同时,当我使用非常相似但是特定于docker-compose的配置时:
version: '3'
services:
nginx:
image: nginx
ports:
- "80:80"
当我执行docker-compose up
并在浏览器中查看时,我看到无限加载,因此看起来端口转发未正确配置,但我无法理解配置中的错误。
这里提到的Nginx只是一个例子,因为它很简单,实际上,我在redis/mysql/java镜像中遇到了相同的问题,所以问题与nginx无关。
我还尝试了以下方法通过docker-compose启动容器:
docker-compose run -p 80:80 nginx
docker-compose run --service-ports nginx
但是没有运气,我得到了相同的结果。
在这两种情况下(docker run
和docker-compose up
),我都有相同的网络驱动程序类型-bridge
。
我比较了两种情况下的docker inspect <container id>
结果:http://i.prntscr.com/obvxi0yESEa92znLDEu_PA.png
以及docker inspect <network id>
的结果:http://i.prntscr.com/yyTpetvJSXa-dz4o9Pcl3w.png
ifconfig docker0
的结果:
docker0 Link encap:Ethernet HWaddr 02:42:f1:9a:b6:72
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:f1ff:fe9a:b672/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:174 errors:0 dropped:0 overruns:0 frame:0
TX packets:837 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:47434 (47.4 KB) TX bytes:107712 (107.7 KB)
的结果:bridge name bridge id STP enabled interfaces
br-f7adc3956101 8000.02427f870e7f no
docker0 8000.0242f19ab672 no
在主机上运行ifconfig
的结果为:https://pastebin.com/6ufWeYTE
在主机上运行route
的结果为:
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 600 0 0 wlp4s0
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 docker0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.0.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp4s0
使用官方网站提供的Linux安装说明,安装了docker
和docker-compose
。
主机操作系统:Ubuntu 17.04
更新:我尝试在组合配置中设置了“可连接”(attachable)网络属性,问题已得到解决。虽然仍然不清楚为什么会发生这种情况。
networks:
default:
attachable: true
nslookup
命令,以确保您已经连接成功。 - Mike Tungdocker-compose run
而不是docker-compose up
?如果是这样,你需要使用--service-ports
来发布服务定义中的端口。 - Zymotik