macOS下Docker host模式容器接口IP所属网段在宿主机不存在问题
问题原因
- Docker Desktop for macOS 底层依赖虚拟化层运行:macOS内核没有原生支持Docker所需的cgroup、namespace等容器特性,因此Docker Desktop会在后台启动一个轻量的Linux虚拟机作为容器的实际运行环境,你所使用的
--network=host参数,实际共享的是这个内部Linux虚拟机的网络栈,而非macOS宿主机的网络栈。 - 你在容器内看到的192.168.65.0/24网段,是Docker为内部Linux虚拟机分配的专属网段,该网段仅存在于虚拟化层的内部网络中,macOS宿主机和这个虚拟机之间默认通过NAT模式通信,因此你在macOS本机执行
ifconfig自然无法查询到该网段的地址。 - 补充说明:host网络模式的原生表现仅在Linux环境下生效,Linux系统中Docker直接运行在宿主机内核上,
--network=host会让容器直接共享宿主机的所有网络接口,不会出现网段不互通的问题。
解决方案
- 需要容器服务暴露给macOS宿主机访问
不要依赖host网络模式,改用端口映射参数即可实现等效效果,比如要映射容器的80端口到macOS本机的8080端口,执行命令:
$ docker run --name container-test -p 8080:80 -it --rm busybox:latest
此时访问macOS本机的127.0.0.1:8080即可直接访问容器内的80端口服务,和host模式的使用体验一致。
- 需要查看/调试Docker内部虚拟机的网络配置
可以通过特权容器进入Docker后台的Linux虚拟机内部,执行网络查询命令即可看到192.168.65.0/24网段的相关配置,操作命令如下:
$ docker run -it --rm --privileged --pid=host justincormack/nsenter1 / # ip a | grep 192.168.65
- 需要使用原生host网络模式特性
换用Linux操作系统运行Docker,Linux内核原生支持容器相关特性,没有中间虚拟化层,--network=host模式会直接共享宿主机的网络栈,容器内的网络接口和IP地址都会直接同步到宿主机上。
内容的提问来源于stack exchange,提问作者user7693832
相关产品推荐
相关产品推荐

