【问题标题】:container to container access on windows server 2016 for windows containers problemwindows server 2016上的容器到容器访问windows容器问题
【发布时间】:2019-08-31 00:48:27
【问题描述】:

我想运行到同一网络中的容器:

docker-compose.yml:

    version: '2.1'

    services:

        web:
            build:
                context: ./src/web
                dockerfile: web.Dockerfile
            image: somethingWeb
            container_name: smt-web 
            mem_limit: 2G
            restart: on-failure
            depends_on:
                - db

        db:
            build:
                context: ./src/db
                dockerfile: db.Dockerfile
            image: somethingDB
            container_name: smt-db
            ports:
                - ${EXPOSED_SQLSERVER_PORT?err}:1433
            environment:
                sa_password: "Lfdc82zo!"
                ACCEPT_EULA: "Y"

但是没有从 web 到 db 的 ping:

    PS C:\> ping db

        Pinging db [172.24.248.112] with 32 bytes of data:
        Request timed out.
        Request timed out.

        Ping statistics for 172.24.248.112:
            Packets: Sent = 2, Received = 0, Lost = 2 (100% loss),

我在作为主机的 vmware ESXI 上运行 Windows Server 2016。和容器也是 windows server 2016 映像。

有什么建议可以解决我的容器到容器的隔离问题吗?

根据this microsoft's article 的 NAT 网络,我将 Hyper-V 功能添加到 windows server 2016 (from this) 并启用了 Hyper-V。

这些是我的 docker 网络:

λ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
bb82f97a3679        mehdi_default       nat                 local
ee22d8faad51        nat                 nat                 local
0e05aee3cc5f        none                null                local

【问题讨论】:

  • Pinging db [172.24.248.112] 表明 docker 网络配置正确(它获取了db 的 IP 地址)。 Ping 可能不是最好的工具,您的数据库在预期的端口上没有响应吗?是否设置为监听所有接口?
  • 容器无法看到另一个容器。每个容器中的端口侦听都可以。从容器中我可以看到端口和 IP。但容器到容器的连接是不可能的。他们还加入了创建的 docker-compose nat 网络!
  • docker service ls 显示什么?
  • 我没有为这台机器设置 Swarm。我只想用 docker-compose 将我的 web 容器连接到 db 容器。这就是我在 Windows 10 中遵循的方式,但在 Windows Server 2016 上却没有。

标签: docker windows-server-2016 docker-for-windows docker-networking


【解决方案1】:

Windows 2016 有自己的 Docker NAT,这是一个 PITA,因为您必须公开您的端口,并且每个容器都有自己的内部 IP。这对我来说是个问题,因为我无法让容器直接相互交谈。这是一个简单的 Nuget 服务器,暴露了 1 个端口,但由于恕我直言,服务器 2016 的 Docker NAT 损坏,我无法将该容器作为服务运行。

我发现微软在 2016 年之后的任何更新版本的 Windows Server 上修复/更改了 docker 支持,这使得 Docker 的网络能够像在 OSX/Linux 上一样运行。因此,运行容器并公开端口使用的是服务器 IP,而不是一些随机的 NAT IP。

您能否尝试使用 Windows Server 1803 或更高版本,或者 Windows Server 2019? 您可以使用 docker inspect 来查找正在运行的容器端口/IP。这在 2016 年尝试跨容器交谈时很有帮助,因为您使用的是确切的网络地址:由于 Docker 的 MS NAT 可能需要该端口。我在 2016 年的解决方法是使用 MS NAT 服务通过 NAT 规则将流量从外部路由到 continer,该规则真正将流量传递到 docker 容器。如果服务器重新启动,这是一个问题,因为容器获得了一个新的 IP,需要更新 MS 服务器 NAT 服务端点 IP,但它可以工作。这一切都可以编写脚本,但我觉得它已经使用 MS NAT 服务与运行服务的容器通信,这很麻烦。所以我搬到了 2019 年,不需要任何这些 NAT hacky 的东西。

【讨论】:

    猜你喜欢
    • 2019-11-23
    • 2016-06-09
    • 2017-04-21
    • 1970-01-01
    • 2019-12-10
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    相关资源
    最近更新 更多