【问题标题】:container running on docker swarm not accessible from outside在 docker swarm 上运行的容器无法从外部访问
【发布时间】:2019-11-23 12:45:36
【问题描述】:

我在 docker swarm 上运行我的容器。 asset-frontend 服务是我的前端应用程序,它在容器内运行 Nginx 并暴露端口 80。现在如果我这样做了

卷曲http://10.255.8.21:80

卷曲http://127.0.0.1:80

在我运行这些容器的主机上,我可以看到我的 asset-frontend 应用程序,但在主机之外无法访问它。我无法从另一台机器访问它,我的主机操作系统是centos 8。

这是我的 docker-compose 文件

version: "3.3"
networks:
  basic:
services:
  asset-backend:
    image: asset/asset-management-backend
    env_file: .env
    deploy:
      replicas: 1
    depends_on:
      - asset-mongodb
      - asset-postgres
    networks:
      - basic
  asset-mongodb:
    image: mongo
    restart: always
    env_file: .env
    ports:
      - "27017:27017"
    volumes:
      - $HOME/asset/mongodb:/data/db
    networks:
      - basic
  asset-postgres:
    image: asset/postgresql
    restart: always
    env_file: .env
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=asset-management
    volumes:
      - $HOME/asset/postgres:/var/lib/postgresql/data
    networks:
      - basic
  asset-frontend:
    image: asset/asset-management-frontend
    restart: always
    ports:
      - "80:80"
    environment:
      - ENV=dev
    depends_on:
      - asset-backend
    deploy:
      replicas: 1
    networks:
      - basic
  asset-autodiscovery-cron:
    image: asset/auto-discovery-cron
    restart: always
    env_file: .env
    deploy:
      replicas: 1
    depends_on:
      - asset-mongodb
      - asset-postgres
    networks:
      - basic

这是我的 docker 服务 ls

ID                  NAME                                       MODE                REPLICAS            IMAGE                                         PORTS
auz640zl60bx        asset_asset-autodiscovery-cron   replicated          1/1                 asset/auto-discovery-cron:latest         
g6poofhvmoal        asset_asset-backend              replicated          1/1                 asset/asset-management-backend:latest    
brhq4g4mz7cf        asset_asset-frontend             replicated          1/1                 asset/asset-management-frontend:latest   *:80->80/tcp
rmkncnsm2pjn        asset_asset-mongodb              replicated          1/1                 mongo:latest                                  *:27017->27017/tcp
rmlmdpa5fz69        asset_asset-postgres             replicated          1/1                 asset/postgresql:latest                  *:5432->5432/tcp

我的 80 端口在防火墙中打开 以下是firewall-cmd --list-all的输出

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 22/tcp 2376/tcp 2377/tcp 7946/tcp 7946/udp 4789/udp 80/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

如果我检查我创建的网络,输出如下

[
    {
        "Name": "asset_basic",
        "Id": "zw73vr9xigfx7hy16u1myw5gc",
        "Created": "2019-11-26T02:36:38.241352385-05:00",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.3.0/24",
                    "Gateway": "10.0.3.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "9348f4fc6bfc1b14b84570e205c88a67aba46f295a5e61bda301fdb3e55f3576": {
                "Name": "asset_asset-frontend.1.zew1obp21ozmg8r1tzmi5h8g8",
                "EndpointID": "27624fe2a7b282cef1762c4328ce0239dc70ebccba8e00d7a61595a7a1da2066",
                "MacAddress": "02:42:0a:00:03:08",
                "IPv4Address": "10.0.3.8/24",
                "IPv6Address": ""
            },
            "943895f12de86d85fd03d0ce77567ef88555cf4766fa50b2a8088e220fe1eafe": {
                "Name": "asset_asset-mongodb.1.ygswft1l34o5vfaxbzmnf0hrr",
                "EndpointID": "98fd1ce6e16ade2b165b11c8f2875a0bdd3bc326c807ba6a1eb3c92f4417feed",
                "MacAddress": "02:42:0a:00:03:04",
                "IPv4Address": "10.0.3.4/24",
                "IPv6Address": ""
            },
            "afab468aefab0689aa3488ee7f85dbc2cebe0202669ab4a58d570c12ee2bde21": {
                "Name": "asset_asset-autodiscovery-cron.1.5k23u87w7224mpuasiyakgbdx",
                "EndpointID": "d3d4c303e1bc665969ad9e4c9672e65a625fb71ed76e2423dca444a89779e4ee",
                "MacAddress": "02:42:0a:00:03:0a",
                "IPv4Address": "10.0.3.10/24",
                "IPv6Address": ""
            },
            "f0a768e5cb2f1f700ee39d94e380aeb4bab5fe477bd136fd0abfa776917e90c1": {
                "Name": "asset_asset-backend.1.8ql9t3qqt512etekjuntkft4q",
                "EndpointID": "41587022c339023f15c57a5efc5e5adf6e57dc173286753216f90a976741d292",
                "MacAddress": "02:42:0a:00:03:0c",
                "IPv4Address": "10.0.3.12/24",
                "IPv6Address": ""
            },
            "f577c539bbc3c06a501612d747f0d28d8a7994b843c6a37e18eeccb77717539e": {
                "Name": "asset_asset-postgres.1.ynrqbzvba9kvfdkek3hurs7hl",
                "EndpointID": "272d642a9e20e45f661ba01e8731f5256cef87898de7976f19577e16082c5854",
                "MacAddress": "02:42:0a:00:03:06",
                "IPv4Address": "10.0.3.6/24",
                "IPv6Address": ""
            },
            "lb-asset_basic": {
                "Name": "asset_basic-endpoint",
                "EndpointID": "142373fd9c0d56d5a633b640d1ec9e4248bac22fa383ba2f754c1ff567a3502e",
                "MacAddress": "02:42:0a:00:03:02",
                "IPv4Address": "10.0.3.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4100"
        },
        "Labels": {
            "com.docker.stack.namespace": "asset"
        },
        "Peers": [
            {
                "Name": "8170c4487a4b",
                "IP": "10.255.8.21"
            }
        ]
    }
]

【问题讨论】:

  • 如果您在云服务上部署这些服务,请确保您的实例配置允许使用端口 80。例如:将端口 80 添加到您的 EC2 实例的安全组中,以便能够从 Internet 访问。
  • @ToanQuocHo 不,我正在 Hyper-V 虚拟机上部署这些服务
  • 那么您是否将超级主机的端口映射到您的 docker 主机? :D.. 我说是因为您似乎在使用 Windows 来设置 Hyper-V VM,然后在该 VM 中,您安装 docker 并为您的应用程序设置 docker-swarm。所以就像我说的那样,你还必须将一个端口从你的 Windows 机器映射到你的 Hyper-V VM 机器上的相应端口。之后 from 可以从外部连接。
  • 已经完成了。因为之前在同一个虚拟机上,我运行我的前端服务器,NGINX 暴露在端口 80 上,没有 docker ..我能够访问它。
  • 所以你已经在没有 docker 的 VM 上设置了它,并且其他机器可以连接,但是现在通过 docker 设置之后它不起作用?当您能够从 docker 主机 @@.. 连接时,它应该可以工作

标签: docker nginx networking docker-compose docker-swarm


【解决方案1】:

遇到了同样的问题,结果发现这是我的本地网络子网与自动创建的ingress 网络的子网之间的冲突。这可以使用docker network inspect ingress 进行验证,并检查IPAM.Config.Subnet 值是否与您的本地网络重叠。

要解决此问题,您可以按照Customize the default ingress network 中的指定更新ingress 网络的配置;总结:

  1. 删除发布端口的服务
  2. 删除现有网络:docker network rm ingress
  3. 使用非冲突子网重新创建:
    docker network create \
        --driver overlay \
        --ingress \
        --subnet 172.16.0.0/16 \ # Or whatever other subnet you want to use
        --gateway 172.16.0.1 \
        ingress
    
  4. 重启服务

您可以通过在使用--default-addr-pool 选项初始化群时指定默认子网池来避免冲突。

【讨论】:

  • 谢谢您,先生!这是整个互联网上唯一解决我问题的答案。我想找个时间给你买杯咖啡。
  • 这就是答案
【解决方案2】:
docker service update your-service --publish-add 80:80

您可以通过更新服务来发布端口。

【讨论】:

  • 我试过这是响应。 Error response from daemon: rpc error: code = InvalidArgument desc = EndpointSpec: duplicate published ports provided
  • 我删除了堆栈并再次部署它。然后使用您现在给出的命令更新服务,输出是成功的,但仍然无法从外部访问它opsalliant_opsalliant-frontend overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged
  • 你用什么ip访问它?
  • 主机IP ...例如10.255.8.21
【解决方案3】:

你能试试这个网址而不是 IP 地址吗? host.docker.internal 类似http://host.docker.internal:80

【讨论】:

    【解决方案4】:

    我建议您首先使用 docker-compose 来验证“正确”的行为。然后,尝试使用没有网络规范的docker swarm,只是为了验证没有网络接口问题。

    另外,您可以使用以下命令来验证您的 LISTEN 端口:

    netstat -tulpn
    

    编辑:我遇到了同样的问题,但我能够通过 127.0.0.1 访问我的服务

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2022-09-24
      相关资源
      最近更新 更多