赞
踩
当你满心欢喜的安装完docker desktop,准备来感受一下docker的全新软件分发方式带给你便捷体验时。你发现除了使用交互式命令登录到容器,似乎想ssh访问容器都不行,你只能:
$docker exec -it <container_id> /bin/sh
哈哈,至于你如果安装了nginx这样的服务,想通过浏览器访问,怎么办?
其实看看官方的说明 就知道,你无法在主机上ping通docker容器网络。
There is no docker0 bridge on macOS
Because of the way networking is implemented in Docker Desktop for Mac, you cannot see a
docker0
interface on the host. This interface is actually within the virtual machine.I cannot ping my containers
Docker Desktop for Mac can’t route traffic to containers.
其实说来,docker在mac上的运行实现最早是通过docker-machine命令,通过virtualbox虚拟机,启动linux实现的,那个时候工具是Docker Toolbox
,后来开发了Docker for Mac
,这个虚拟机更加轻量,底层使用了mac提供的虚拟化技术。目前的统一更名为Docker desktop mac版,注意对mac os版本有要求。
文章:《Docker for Mac 的网络问题及解决办法》 解释了原因并给出了三种解决方案;我觉得《MAC DOCKER无法ping通容器解决方案》 里面的两张图说明docker0 bridge很直观。
Docker for Mac 也是在本地跑了一个虚拟机来运行 Docker,不过 Hypervisor 采用的是 xhyve,而 xhyve 又基于 Mac 自带的虚拟化方案 Hypervisor.framework,虚拟机里运行的发行版是 Docker 自己打包的 LinuxKit,之前用的发行版好像是 Alpine Linux。
一下子就了三种解决办法,感觉豁然开朗。
但是第一种依然使用linux虚拟机的显然是走了回头路了,第三种使用代理的方式,我明显感觉到作者应该是遗漏了安装本地代理服务器的步骤。联系不到作者,它博客的Disqus不能用了。于是只能选择第二中,架设V**的方式。
我找到了《Docker:解决 Mac 上 Docker 无法直接 ping 通的问题》 步骤很简单,但是其实里面是有坑的,已经过去了半年的文章没什么问题,问题可能出在软件上。
因为镜像kylemanna/openv**
的版本默认是latest,会去拉去最新的openv**版本,这样有一些配置实际已经过时。
我整理下填完坑后的步骤:
$ brew cask install tunnelblick
$ git clone https://github.com/wojas/docker-mac-network.git
由于alpine的源直接访问不了,需要设置国内的镜像,可参见文章:《alpine修改镜像源》
我直接使用了阿里的镜像,更改完后的Dockerfile如下:
FROM alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add --no-cache socat
ENTRYPOINT ["socat"]
不要修改run.sh中的ip和子网掩码配置,route 172.16.0.0 255.240.0.0
这个设置的子网范围更大。
$ docker-compose up -d
两个注意点,
可以查尝试阶段选择前台运行,这样可以方便看日志,当然去Docker decktop 的 Dashboard也可以看到日志。
运行成功后会在docker-mac-network目录下生成docker-for-mac.v**
文件。
在文件结尾处route 行前一行加上 comp-lzo no
,修改后文件结尾处如下:
comp-lzo no
route 172.16.0.0 255.240.0.0
是的,注意这里要关闭comp-lzo压缩方式,方法来源docker-mac-network官仓issues#13。
安装Tunnelblick后,已经关联了打开方式,直接双击docker-for-mac.v**就可以启动Tunnelblick,并会提示你导入配置。会要求输入管理员密码,并会弹出一个提示,大概意思就是comp-lzo未来会弃用。
“comp-lzo” 在OpenV** 2.4中已弃用,将来会在未来的版本中移除。
点击右上角最左侧 Tunnelblick 图标 >> V** 详情 …,选择docker-for-mac,点击右下角连接。
连接成功后,可以使用ping测试一下是否可以访问容器中网络,但是如果容器内有http服务最好用curl也测试一下,我之前设置comp-lzo yes时,可以ping通,但是http服务访问不了,docker-mac-network容器中日志会报:Bad compression stub decompression header byte
还有一个警告是:
发现了一些DNS问题:
DNS服务器192.168.0.1不是公开的IP地址,将不会通过V**
直接忽略了,好像没啥影响。
至此,容器的工具可以开始用起来了。其实我感觉这个方法还比较好用,容器的ip每次变化,但是有了v**对子网的路由,什么时候都可以访问到。
先查看容器id或名称,使用docker-compose ps
或者 docker container ls
然后使用:
$ docker inspect <container id or name> | grep IPAddress
输出:
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.18.0.2",
看docker-compose.yml,openv**的配置目录都是挂载到docker-mac-network目录和config子目录下的;
所以如果要重新生成配置,删除掉下列配置,再次启动容器会再生成:
rm -rf conf/*
rm -rf docker-for-mac.ov**
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。