Docker compose端口转发工作不正常

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时,使用非常简单的命令:

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引入的。如果它在这里有影响,我想记录的是正式角色。