【问题标题】:docker container networking not working as expecteddocker 容器网络未按预期工作
【发布时间】:2025-12-01 00:15:01
【问题描述】:

我创建了两个 docker 镜像并使用 docker compose 启动它们。

docker-compose.yaml

version: '2'
services:
  dmgr:
    hostname: dmgr
    image: dmgr
    build:
      context: ./dmgr
    ports:
     - "9060:9060"
    tty: true

  custom1:
    hostname: node
    image: node
    build:
      context: ./custom
    ports:
     - "9080:9080"
    environment:
     - PROFILE_NAME=Node
     - HOST_NAME=node
     - NODE_NAME=Node
     - DMGR_HOST=dmgr
     - DMGR_PORT=8879
    depends_on:
     - dmgr

两个容器启动后,第二个容器“节点”能够解析并 ping 容器“dmgr”,但其他方式不起作用

root@node:/# nslookup dmgr
Server:    127.0.0.11
Address:    127.0.0.11#53
Non-authoritative answer:
Name:   dmgr
Address: 172.18.0.2

root@node:/# cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.3  node

root@node:/# cat /etc/resolv.conf 
nameserver 127.0.0.11
options ndots:0

如果我执行容器“dmgr”并运行“nslookup 节点”,它无法解决。我究竟做错了什么?请有人指出我正确的方向

root@dmgr:/# nslookup node
Server:     127.0.0.11
Address:    127.0.0.11#53

** server can't find node: NXDOMAIN

【问题讨论】:

    标签: macos docker networking docker-compose


    【解决方案1】:

    主机名无法使用 docker 的嵌入式 DNS 解析(违反直觉,但这可以在 docker 的控制之外进行更改,因此有一些逻辑)。将解决的是容器名称和服务名称 custom1。更改服务名称将解决您的问题:

    version: '2'
    services:
      dmgr:
        hostname: dmgr
        image: dmgr
        build:
          context: ./dmgr
        ports:
         - "9060:9060"
        tty: true
    
      node:
        image: node
        build:
          context: ./custom
        ports:
         - "9080:9080"
        environment:
         - PROFILE_NAME=Node
         - HOST_NAME=node
         - NODE_NAME=Node
         - DMGR_HOST=dmgr
         - DMGR_PORT=8879
        depends_on:
         - dmgr
    

    如果您需要解决不同的问题,您还可以定义网络别名:

    version: '2'
    services:
      dmgr:
        hostname: dmgr
        image: dmgr
        build:
          context: ./dmgr
        ports:
         - "9060:9060"
        tty: true
    
      custom1:
        image: node
        build:
          context: ./custom
        ports:
         - "9080:9080"
        networks:
          default:
            aliases:
             - node
        environment:
         - PROFILE_NAME=Node
         - HOST_NAME=node
         - NODE_NAME=Node
         - DMGR_HOST=dmgr
         - DMGR_PORT=8879
        depends_on:
         - dmgr
    

    https://docs.docker.com/compose/compose-file/#aliases

    【讨论】: