You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacOSX Docker Desktop创建无外网但主机可访问的Docker容器

解决方案:MacOS M2 Docker Desktop 创建可主机访问但无外网权限的容器

核心思路

MacOS上Docker运行在虚拟机环境中,直接使用--internal网络会彻底隔离主机访问,因此需要创建普通自定义桥接网络,再通过iptables规则限制容器的外网访问,同时配置端口映射实现主机与容器的通信。

具体操作步骤

1. 创建自定义桥接网络

docker network create --driver bridge no-internet-net

2. 获取网络子网信息

执行命令查看网络详情,提取Subnet字段(示例值:172.30.0.0/16):

docker network inspect no-internet-net

3. 添加iptables规则限制外网访问

MacOS需先进入Docker Desktop的虚拟机环境,执行以下命令:

docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -i -n sh

在虚拟机内添加iptables规则,阻止该子网的所有外网请求:

iptables -I DOCKER-USER -s 172.30.0.0/16 -j DROP

(替换为你实际获取的子网地址)

4. 启动容器并配置端口映射

docker run --net no-internet-net -p 8080:8080 --rm --name web docker.io/alpinelinux/darkhttpd

此时主机可通过localhost:8080访问容器,容器无法访问外网。

Docker REST API实现方式

创建自定义网络

发送POST请求到/networks/create,请求体:

{
  "Name": "no-internet-net",
  "Driver": "bridge"
}

获取子网信息

发送GET请求到/networks/no-internet-net,解析返回的IPAM.Config[0].Subnet字段。

添加iptables规则

通过exec API调用主机命令进入Docker虚拟机,执行添加规则的操作。

创建并启动容器

发送POST请求到/containers/create,请求体:

{
  "Image": "docker.io/alpinelinux/darkhttpd",
  "Name": "web",
  "HostConfig": {
    "PortBindings": {
      "8080/tcp": [{"HostPort": "8080"}]
    },
    "NetworkMode": "no-internet-net"
  }
}

发送POST请求到/containers/web/start启动容器。

问题原因说明

  • 问题1:直接指定自定义网络未配置端口映射时,Mac虚拟机的网络规则未将容器端口转发到主机,导致无法访问;必须显式添加-p参数完成端口映射。
  • 问题2:先连接默认桥接网络时,默认网络自带端口转发机制,因此主机可访问容器,但默认网络未做外网限制,容器仍能访问外网。
  • 问题3:--internal网络的设计仅允许同网络容器间通信,Mac虚拟机的防火墙规则会阻止主机访问该网络内的容器,因此curl请求超时。

内容的提问来源于stack exchange,提问作者Bartlomiej Lewandowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:23:11