Docker 网络,从 windows 主机连接到 linux 容器

Docker networking, connecting to linux container from windows host

我不确定为什么 运行 linux 基于 windows 10 主机上的容器时,我无法通过容器的 IP 地址访问,而如果 运行 windows 个容器我可以。

linux

的示例
networks:
  team_net:
    ipam:
      driver: default
      config:
        - subnet: 172.28.1.0/26

services:
  sql:
    image: mcr.microsoft.com/mssql/server:latest
    networks:
      team_net:
        ipv4_address: 172.28.1.11
    environment:
      - ACCEPT_EULA: Y
      - SA_PASSWORD: My_password123
    volumes:
      - "mssql:/var/opt"
    restart: unless-stopped

volumes:
  mssql:

正在连接到服务器:172.28.1.11,1433,将拒绝连接。

此外,如果未设置并检查 运行 容器,我可以看到分配给它的 IP 地址,但再次尝试使用它会失败。

我不是网络人,但想知道是否可以直接使用分配给容器的 IP 地址,然后使用公开的端口进行连接。如果不可能,那是为什么?

这是explicitly noted in the Docker Desktop documentation。当您无法直接访问 container-private IP 地址时,还有多种其他情况:在 MacOS 主机上;如果您使用 Docker 工具箱或其他 VM-based 解决方案;如果您不在同一台物理主机上。由于这适用于很少的环境,因此直接使用 container-private IP 地址通常不是最佳做法。

尽管如此,无论平台如何,它都可以为您的服务指定 ports:,然后使用主机的 IP 地址访问那些已发布的端口(localhost 来自容器外的同一主机; VM 的 IP 地址(如果您使用的是 Docker 工具箱)。您几乎永远不需要问题中显示的手动 IP 配置。

version: '3.8'
# Compose provides a "default" network; just use that
services:
  sql:
    image: mcr.microsoft.com/mssql/server:latest
    # Compose provides
    # networks: [default]
    # But to make the container accessible
    ports:
      - '1433:1433' # second port _must_ be 1433, first can be anything
    environment:
      - ACCEPT_EULA: Y
      - SA_PASSWORD: My_password123
    volumes:
      - "mssql:/var/opt"
    restart: unless-stopped
volumes:
  mssql:

使用此配置,您可以访问 localhost 和端口 1433(或者,如果您更改了第一个 ports: 号码,则为备用端口)。