MacOS 下不能 ping Docker 容器的问题

站长 4周前 访问:30 评论:0 关注:0

天下午从docker hub上pull了CentOS。跑起来后装了ssh,然后在宿主机上ping不通CentOS的container.....这是多么囧的事情...

原因

  • 先来看下LINUX的docker架构:

docker是在linux内核容器基础上实现的,linux安装docker后,会创建一个为docker0的虚拟网卡,linux宿机与docker容器之间的通信,通过docker0虚拟网卡进行。

  • 再来看下OSX的docker

docker在OSX的实现方式,是首先创建一个linux的虚拟机,在将docker放入到虚拟机中实现,而对于linux虚拟机,与OSX之间的通信,目前版本采用/var/run/docker.sock这种socket文件来通信,在OSX宿机中自然ping不通docker容器。

对于docker for mac不能ping容器官网给的解释是

对于以上解释通过端口映射可以解决docker for mac连接容器的问题,但是有些情况下是不需要端口的怎么办?以上说法对我毫无卵用。带着问题,Google了下据说有个openVPN可以解决这个问题。

  • 解决问题

搜了好一阵子,大多都没有详细说明,最后在GitHub上搜到一个叫 docker-mac-network 的项目。嗯,很是牛逼。

项目README大致翻译

使用OpenVPN来搞定。让你从macOS访问docker for mac。

Quickstart

访问docker网络:

安装Tunnelblick 这个软件是OpenVPN的macOS的客户端。

  • 运行 docker-compose up 因为该项目需要生成一些keys,所以第一次启动会耗费点时间。
  • 双击生成的 docker-for-mac.ovpn 文件,或者直接在你的终端运行该文件把它添加到Tunnelblick。 该文件会在项目根目录生成。
  • 使用Tunnelblick链接你新添加的docker-for-mac。

现在你可以从你的macOS访问doker里面的网络了。

Implementation notes

该配置由两个服务组成,它们都是基于Alpine

openvpn

使用OpenVPN docker镜像 kylemanna/openvpn.

服务端和客户端配置文件都自动的由helpers/run.sh来生成, 该脚本运行在镜像中,只能通过调整该脚本的配置来访问你docker for mac的网络。

该服务使用网络在TCP 1194端口上跑着,这说明它可以在vm上访问所有的docker网络。

只有172.16.0.0/20 私有网络被配置生成器路由到了Docker for Mac。主机上没有设置DNS服务。

镜像OpenVPN的配置在目录 (/etc/openvpn/*)中,对应宿主的文件系统的./config/,这样便于自定义。

proxy

自打有docker for mac开始,宿主机就不能访问容器的网络。我们使用TCP代理。此镜像使用socat将端口13194转发到OpenVPN容器上。

具体流程

前提:先安装 Tunnelblick

1.克隆项目

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

2.修改helper/run.sh脚本

#!/bin/sh

dest=${dest:-docker.ovpn}

if [ ! -f "/local/$dest" ]; then
    echo "*** REGENERATING ALL CONFIGS ***"
    set -ex
    #rm -rf /etc/openvpn/*
    ovpn_genconfig -u tcp://localhost
    sed -i 's|^push|#push|' /etc/openvpn/openvpn.conf
    echo localhost | ovpn_initpki nopass
    easyrsa build-client-full host nopass
    ovpn_getclient host | sed '
        s|localhost 1194|localhost 13194|;
    s|redirect-gateway.*|route 172.17.0.3 255.255.0.0|; # 这里要配置你container的ip和子网掩码
    ' > "/local/$dest"
fi

# Workaround for https://github.com/wojas/docker-mac-network/issues/6
/sbin/iptables -I FORWARD 1 -i tun+ -j ACCEPT

exec ovpn_run

主要修改ip地址和子网掩码的配置,具体信息可以进入容器执行ifconfig进行查看

3.构建容器

docker-compose up

运行后自动创建两个容器,一个为代理容器一个为openvpn服务端容器:

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                               NAMES
fe3346e830dd        dockermacnetwork_proxy   "socat TCP-LISTEN:13…"   28 minutes ago      Up 28 minutes       127.0.0.1:13194->13194/tcp          dockermacnetwork_proxy_1
1225f562c22c        kylemanna/openvpn        "/local/helpers/run.…"   28 minutes ago      Up 28 minutes                                           dockermacnetwork_openvpn_1

4.查看项目根目录,会发现有生成的docker-for-mac.ovpn文件

5.编辑docker-for-mac.ovpn文件,这里是个坑,需要加一个comp-lzo yes属性

comp-lzo yes #在最后行添加该配置
route 172.17.0.0 255.255.0.0

6.把该文件添加到Tunnelblick,然后连接该网络。

7.测试

ping 172.17.0.3

ping通,大功告成!


参考文章:

https://www.jianshu.com/p/a0933256c829

https://blog.csdn.net/Mr0o0rM/article/details/80683115


评论

还没有人评论 ~

公告