原因
我们创建docker容器时可以通过端口映射,来实现宿主机与容器间的互通。但有些情况我们需要直接请求容器的ip。其实docker已经为我们想好了,在linux中安装docker后,系统会自动生成一个docker0的虚拟网卡,宿主机与docker容器之间的通信通过docker0进行。
但,MacOS没有docker0
解决方案
网上有很多解决方法,这里列举两种,做下记录
方法一
通过openvpn搭建vpn服务,可以参考这篇文章
方法二
使用docker-connector。我用的是这种方法,亲测有效。
2-1 使用方法
2-1-1 安装 docker-connector
$ brew tap wenjunxiao/brew
$ brew install docker-connector
2-1-2 添加路由
通过以下命令把Docker所有bridge
子网放入配置文件,后续的增减可以参考后面的详细配置
$ docker network ls --filter driver=bridge --format "{{.ID}}" | xargs docker network inspect --format "route {{range .IPAM.Config}}{{.Subnet}}{{end}}" >> /usr/local/etc/docker-connector.conf
或者手动修改 /usr/local/etc/docker-connector.conf
,文件内容如下:
addr 192.168.251.1/24
# mtu 1400
# host 127.0.0.1
# port 2511
route 172.17.0.0/16
# route 172.18.0.0/16
# iptables 172.17.0.0+172.18.0.0
将需要通信的容器子网的路由添加到文件。
2-1-3 启动Mac端的服务
配置完成,直接启动服务(需要 sudo
,路由配置启动之后仍然可以修改,并且无需重启服务立即生效)
$ sudo brew services start docker-connector
2-1-4 下载镜像wenjunxiao/mac-docker-connector
$ docker pull wenjunxiao/mac-docker-connector
2-1-5 创建容器
启动Docker端的容器,其中网络必须是host
,并且添加NET_ADMIN
特性
$ docker run -it -d --restart always --net host --cap-add NET_ADMIN --name connector wenjunxiao/mac-docker-connector
如果你想导出你自己的容器给其他人,让其他人可以访问你在容器中搭建的服务,其他人必须安装另一个客户端docker-accessor,同时你必须开启
expose
(这默认是关闭的)和提供访问的令牌(token
), 更详细的配置说明参考配置说明
2-1-6 大功告成
通常这个时候宿主机已经可以ping通容器ip了。
如果你的环境比较特殊,也可以对mac-docker-connector进行更多配置, 更详细的配置说明参考配置说明。
2-2 配置
基本的配置选项,通常你不需要修改他们,除非你的环境冲突(比如端口被占用,子网已使用)。 一旦需要变更,那么Docker容器mac-docker-connector
也需要使用相同的参数重新启动
addr
虚拟网络地址, 默认192.168.251.1/24
(可以修改,但容器端需要同步修改参数)addr 192.168.251.1/24
port
UDP服务监听端口, 默认2511
(可以修改,但容器端需要同步修改参数)port 2511
mtu
网络的MTU值,默认1400
(可以修改,但容器端需要同步修改参数)mtu 1400
host
UDP监听的地址,仅用于Docker容器mac-docker-connector
连接使用,处于安全和适应移动办公设置成127.0.0.1
(通常无需修改)host 127.0.0.1
动态热加载的配置选项,修改配置文件之后无需启动,立即生效(除非禁用watch
),可以在需要的时候随时增减route
添加一条访问Docker容器子网的的路由,通常在你通过docker network create --subnet x.x.x.x/mask name
命令创建一个bridge
子网时需要添加route 172.100.0.0/16
iptables
插入(+
)或删除(-
)一条iptables
规则,用于两个子网之间互相访问iptables 172.0.1.0+172.0.2.0 iptables 172.0.3.0-172.0.4.0
IP是无掩码子网的地址,通过+
连接表示插入一条可以互相访问的规则,通过-
连接表示删除它们之间互相访问的规则expose
导出你本地的容器给其他人,指定其他人用于连接的开放端口expose 0.0.0.0:2512
导出的地址必须是其他人可以通过docker-accessor
访问的地址token
定义其他人访问你的服务的令牌,以及连接成功之后分配的虚拟网络IPtoken token-name 192.168.251.3
令牌是自定义的字符串,并且在配置文件中唯一,IP则必须是addr
配置的虚拟网络中有效的IP
© 版权声明
THE END
淡淡 7个月前0
感谢分享椰奶燕麦粥 7个月前0
挺好的 加油!!!!雨精靈 8个月前0
人生不管結局如何,努力過,揮灑過屬於自己的青春,也不枉人生走一遭,別讓負面情緒消耗自己,縱有疾風起,人生不言棄,加油!!用户19344506 8个月前0
挺好的,加油!雨精靈 9个月前0
就怕來不及努力,遺憾已造成 人總會因為價值觀的不同造成一些誤解 當你明白了,他們已悄然離去 明日復明日,明日何其多 我若待明日,萬事成蹉跎雨精靈 9个月前0
既然有遺憾,何不去珍惜,人生數十載,匆匆已回首,故人相辭去,獨留白頭翁梦屿 2年前0
感谢博主分享