Docker compose端口转发工作不正常
当我使用docker时,使用非常简单的命令:Docker compose端口转发工作不正常,docker,docker-compose,Docker,Docker Compose,当我使用docker时,使用非常简单的命令: docker run -p 80:80 nginx 端口转发工作正常,当我使用browser/curl转到localhost:80时,我可以获得nginx的“欢迎页面” 同时,当我使用非常相似但docker compose特定的配置时: version: '3' services: nginx: image: nginx ports: - "80:80" 当我做docker compose up并进入浏览器时,我看到
docker run -p 80:80 nginx
端口转发工作正常,当我使用browser/curl转到localhost:80时,我可以获得nginx的“欢迎页面”
同时,当我使用非常相似但docker compose特定的配置时:
version: '3'
services:
nginx:
image: nginx
ports:
- "80:80"
当我做docker compose up
并进入浏览器时,我看到无限加载,因此看起来端口转发没有正确配置,但我无法理解配置中的错误。
我尝试使用不同的浏览器和curl,得到了相同的结果-无限加载
这里的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
结果:
和docker inspect的结果:
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
brctl显示
结果:
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结果:
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
主机上的路由结果:
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
docker
和docker compose
都是使用Linux的官方网站说明安装的
主机操作系统:Ubuntu 17.04
更新:
我尝试在compose配置中设置“attachable”网络属性,问题已得到解决。尽管还不清楚为什么会这样
networks:
default:
attachable: true
这就是我使用docker compose up运行的程序,它运行得很好
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
我尝试在compose配置中设置“attachable”网络属性,问题已得到解决。尽管还不清楚为什么会这样
networks:
default:
attachable: true
文章“”将可连接网络定义为swarm覆盖网络的一种类型
这意味着在该网络上创建的服务将允许docker运行
命令:
docker service create --publish 80:80 --network=core-infra --name
docker run --network=core-infra -ti ...
这些行可以在docker compose.yml
文件中指定,结果是相同的:如果网络是可连接的,那么docker run
将能够使用它
创建容器后,docker network inspect core infra将显示网络子网和其他诊断信息
奇怪的是,从2.1开始,网络在默认情况下应该是可连接的,如中所述
可连接网络可帮助Docker Swarm服务与以前版本的Swarm编排进行互操作。遗留Swarm和Swarm服务之间的核心区别在于,遗留服务允许以强制方式调度容器。声明式swarm服务允许我们定义我们想要达到的最终状态,然后swarm将应用和维护该状态
我的解决方案是添加一行
网络模式:“主机”
这是完整的文件
version: '3'
services:
nginx:
image: nginx
ports:
- "80:80"
volumes: ['./:/app']
network_mode: 'host'
在我的例子中,我使用的
docker compose run
没有--service ports
参数,因此忽略了端口映射
例如:
docker compose.yml
version: "3"
services:
app-host:
image: nginx:1.19.0-alpine
working_dir: /app
volumes:
- ./:/app/
ports:
- "80:3000"
命令
docker compose运行--服务端口应用程序主机
参考资料:您如何知道端口转发不起作用?例如,当您执行docker compose up时会得到什么?我知道它不起作用,因为我无法建立到服务(nginx/数据库,无论什么)的连接,尽管我看到有人试图这样做(f.e.浏览器不会立即返回“连接被拒绝”,但会尝试“加载”,数据库/java等也会出现类似情况)。同时在这两种情况下(docker撰写和docker运行)“ps”命令显示正确的映射:0.0.0.0:80->80/tcp。不确定这是否重要,但我在docker-compose.yml文件中没有使用引号:ports:-80:80另外,在运行docker-compose up-d之后,docker-ps的状态是什么?端口显示为已映射?我还将执行
nslookup
以确保您实际连接正在使用的端口被其他程序破坏?尝试了此配置的精确副本,不幸没有帮助OP没有使用docker swarm。我知道,但attachable是专门为docker swarm引入的。如果它在这里有影响,我想记录的是正式角色。