Docker Desktop 中新容器不会自动加入 docker network create 创建的网络,必须显式指定;默认无图形界面选网,仅支持 CLI 或 Compose 操作,如 docker run --network 或 docker network connect 。

docker network create创建的网络在 Docker Desktop 中默认可用,但新容器不会自动加入——必须显式指定。Docker Desktop 本身不提供图形界面来选择网络,所有网络绑定操作都依赖 CLI 或 Compose。
用 docker run --network 指定已有网络
这是最直接、最可控的方式,适用于单容器快速验证或脚本化部署。
- 先确认目标网络存在:
docker network ls,比如看到openim-docker_openim - 启动容器时必须加
--network参数,例如:docker run -d --network openim-docker_openim --name myapp nginx - 如果该网络是自定义 bridge(非
bridge、host、none),容器会获得自动 DNS 解析能力:同一网络内可直接用myapp或prometheus这类容器名通信 - 注意:
--network必须在docker run时使用;容器启动后无法用docker run再次“绑定”,只能用docker network connect
docker network connect 动态加入运行中容器
适合已运行但未连网的容器,或需多网络接入(如同时连 backend 和 monitoring)。
- 命令格式:
docker network connect - 若要指定固定 IP,必须在 connect 时加
--ip,且该 IP 必须属于目标网络子网(如openim-docker_openim的子网是172.18.0.0/16):docker network connect --ip 172.18.0.100 openim-docker_openim myapp - 不能对已连接同一网络的容器重复执行;会报错
endpoint with name myapp already exists in network xxx - Windows/macOS 上 Docker Desktop 的 Linux 后端(WSL2 / HyperKit)对此支持完全,但连接后需进容器检查
ip a确认新接口是否生效
Docker Compose 默认行为与覆盖技巧
Compose 文件里写死的 networks 配置,**只对 docker-compose up 启动的容器生效**;它不会影响 docker run 手动启的容器。
- 若
docker-compose.yml定义了networks: [mynetwork],但运行时加了--network bridge,后者会覆盖前者 - 想让 Compose 服务强制使用某网络,不要在
services.xxx.networks下写名字,而是用external: true声明外部网络:networks:<br> mynetwork:<br> external: true
否则 Compose 会尝试新建同名网络并失败 - 多个服务共用一个 external 网络时,DNS 名称解析才真正可用;否则各服务可能落在不同子网,ping 得通但
curl http://other-service:8080会失败
容易被忽略的 Windows/macOS 特殊点
Docker Desktop 的网络栈实际跑在轻量虚拟机里(WSL2 或 HyperKit),宿主机不是“网络一员”,这点和 Linux 直装完全不同。
- 从宿主机(Windows CMD / macOS Terminal)
ping容器 IP(如172.18.0.5)一定不通——因为该 IP 只存在于 WSL2/HyperKit 虚拟网络内,宿主机路由表里没有对应条目 - 若需宿主机访问容器服务,唯一可靠方式是用
-p映射端口,例如docker run -p 8080:80 nginx,然后浏览器访问http://localhost:8080 - 不要试图在 Docker Desktop 里改
/etc/docker/daemon.json调整默认 bridge 网络;修改后重启 Desktop 可能导致网络功能异常,尤其 WSL2 backend 下 daemon.json 不生效











