当前位置:   article > 正文

mac os中连接docker网络_mac访问docker子网ip

mac访问docker子网ip
  • docker desktop 的版本是2.2.0.3(42716)
  • mac os 的版本是macOS Catalina10.15.3

当你满心欢喜的安装完docker desktop,准备来感受一下docker的全新软件分发方式带给你便捷体验时。你发现除了使用交互式命令登录到容器,似乎想ssh访问容器都不行,你只能:

$docker exec -it <container_id> /bin/sh
  • 1

哈哈,至于你如果安装了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**版本,这样有一些配置实际已经过时。

我整理下填完坑后的步骤:

1、安装Tunnelblick

$ brew cask install tunnelblick
  • 1

2、拿到docker-mac-network项目代码

$ git clone https://github.com/wojas/docker-mac-network.git
  • 1

由于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"]
  • 1
  • 2
  • 3
  • 4

不要修改run.sh中的ip和子网掩码配置,route 172.16.0.0 255.240.0.0 这个设置的子网范围更大。

3、启动docker-mac-network服务

$ docker-compose up -d
  • 1

两个注意点,

  • 一是在docker-mac-network目录下启动,会加载docker-compose.yml;
  • 二是加上-d参数,服务会运行在后台,否则一直在前台运行并输出日志;

可以查尝试阶段选择前台运行,这样可以方便看日志,当然去Docker decktop 的 Dashboard也可以看到日志。

运行成功后会在docker-mac-network目录下生成docker-for-mac.v**文件。

4、编辑docker-for-mac.v**

在文件结尾处route 行前一行加上 comp-lzo no,修改后文件结尾处如下:

comp-lzo no
route 172.16.0.0 255.240.0.0
  • 1
  • 2

是的,注意这里要关闭comp-lzo压缩方式,方法来源docker-mac-network官仓issues#13

5、启动Tunnelblick

安装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**对子网的路由,什么时候都可以访问到。

如何拿到容器的ip

先查看容器id或名称,使用docker-compose ps或者 docker container ls

然后使用:

$ docker inspect <container id or name> | grep IPAddress
  • 1

输出:

          "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.18.0.2",
  • 1
  • 2
  • 3

重新生成配置

看docker-compose.yml,openv**的配置目录都是挂载到docker-mac-network目录和config子目录下的;

所以如果要重新生成配置,删除掉下列配置,再次启动容器会再生成:

rm -rf conf/*
rm -rf docker-for-mac.ov**
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/205596?site
推荐阅读
相关标签
  

闽ICP备14008679号