适用于Mac VM IP的Docker

时间:2016-12-21 16:15:59

标签: macos docker docker-machine

我刚刚迁移到使用Docker for Mac,之前使用Docker Toolbox和Virtualbox for OSX。

我曾经用$(docker-machine ip default)获取机器的IP地址。

是否有可靠的方法来获取Hyperkit IP地址?

谢谢!

5 个答案:

答案 0 :(得分:22)

Docker工具箱相反,适用于Windows的Docker 适用于Mac的Docker 旨在让您感觉 Docker < / strong>直接在您的操作系统上运行,因此他们使用在 docker 可执行文件直接处理的轻量级虚拟机管理程序(而不是 VirtualBox )下运行的轻量级虚拟机。 因此,您无法通过 docker-machine 看到它们,并且您不会看到除 localhost 之外的其他IP地址。

适用于Windows的Docker 依赖于 HyperV 虚拟机管理程序,该虚拟机管理程序允许网络连接到tcp://localhost:2375

适用于Mac的Docker 依赖于 xhyve 虚拟机管理程序,其实现方式仅通过套接字unix:///var/run/docker.sock提供连接。

解决方法

Docker for Mac 提供TCP连接:

  1. 安装 socat 。使用 brew

    brew install socat

  2. 运行此 socat 命令将TCP请求转发到套接字

    socat TCP-LISTEN:2375,reuseaddr,fork,bind=localhost UNIX-CONNECT:/var/run/docker.sock

  3. tcp://localhost:2375

  4. 上映射您想要的内容

    如果需要,最多可以在启动时运行 socat 命令。

    这对我来说非常有用,可以将 Webstorm nodeJS调试器 nodeJS 容器相关联(因为在撰写本文时, docker debugging Webstorm docker集成插件支持,但不支持unix套接字。)

    有关Docker for Mac限制的文档

    https://docs.docker.com/docker-for-mac/networking/#/known-limitations-use-cases-and-workarounds

      

    macOS上没有docker0桥接

         

    由于在Docker for Mac中实现网络的方式,您无法在macOS中看到docker0接口。这个界面实际上在HyperKit中。

答案 1 :(得分:9)

没有必要像使用docker-machine一样直接使用xhyve VM的IP地址。所有端口映射都直接映射到localhost

$ docker run -d -p 8080:80 nginx:latest
$ curl localhost:8080

另见official documentation

  

当您使用-p参数运行容器时,例如:$ docker run -p 80:80 -d nginx Docker for Mac将使容器端口在localhost处可用。

答案 2 :(得分:7)

您可以将docker图像用于socat,每次启动时都会启动它#docker for mac&#39;

  

docker run -d --restart = always -p 2376:2375 -v   /var/run/docker.sock:/var/run/docker.sock bobrik / socat   TCP4-LISTEN:2375,fork,reuseaddr UNIX-CONNECT:/var/run/docker.sock

找到您的docker API IP地址:

ifconfig | grep 'inet 192'| awk '{ print $2}'

答案 3 :(得分:1)

我目前的解决方案是使用Docker Machine(一个可在另一个IP地址下使用的Linux VM)创建容器,并将容器的所有流量路由到docker machine VM。

sudo route -n add -net 172.18.0.0/16 192.168.99.100

您可以使用docker inspect获取docker容器的网络范围,并使用docker-machine ip

获取docker machine VM的IP地址

答案 4 :(得分:0)

另一种解决方法是使用sudo ifconfig lo0 alias 172.17.0.1,因此您仍可以使用相同的静态IP地址(如果基于Linux的同事或bash脚本坚持使用该IP地址)。