【发布时间】:2016-12-21 16:15:59
【问题描述】:
我刚刚从以前使用 Docker Toolbox 和用于 OSX 的 virtualbox 迁移到使用 Docker for Mac。
我以前用$(docker-machine ip default)获取机器IP地址。
有没有可靠的方法来获取 Hyperkit IP 地址?
谢谢!
【问题讨论】:
标签: macos docker docker-machine
我刚刚从以前使用 Docker Toolbox 和用于 OSX 的 virtualbox 迁移到使用 Docker for Mac。
我以前用$(docker-machine ip default)获取机器IP地址。
有没有可靠的方法来获取 Hyperkit IP 地址?
谢谢!
【问题讨论】:
标签: macos docker docker-machine
与 Docker 工具箱相反,Docker for Windows 和 Docker for Mac 旨在让您感觉 Docker 直接在您的操作系统上运行,因此它们使用在由 docker 可执行文件直接处理的轻量级管理程序(而不是 VirtualBox)下运行的轻量级虚拟机。
因此,您不会通过 docker-machine 看到它们,并且您不会看到除 localhost 之外的另一个 IP 地址。
Docker for Windows 依赖于 HyperV 管理程序,该管理程序允许与tcp://localhost:2375 建立网络连接。
Docker for Mac 依赖于 xhyve 管理程序,其实现方式仅提供通过套接字unix:///var/run/docker.sock 的连接。
为 Docker for Mac 提供 TCP 连接:
安装 socat。使用 brew:
brew install socat
运行这个 socat 命令将 TCP 请求转发到套接字
socat TCP-LISTEN:2375,reuseaddr,fork,bind=localhost UNIX-CONNECT:/var/run/docker.sock
在tcp://localhost:2375上映射您想要的内容
如果需要,由您在启动时运行 socat 命令。
这对我来说很有用,例如将 Webstorm nodeJS 调试器 关联到 nodeJS 容器(因为在撰写本文时,docker 调试 受 Webstorm docker 集成插件支持,但不通过 unix 套接字)。
https://docs.docker.com/docker-for-mac/networking/#/known-limitations-use-cases-and-workarounds
macOS 上没有 docker0 网桥
由于 Docker for Mac 中实现网络的方式,您在 macOS 中看不到 docker0 接口。这个接口实际上在 HyperKit 中。
【讨论】:
无需像使用docker-machine 那样直接使用xhyve VM 的IP 地址。所有端口映射都直接映射到localhost。
$ docker run -d -p 8080:80 nginx:latest
$ curl localhost:8080
当您使用
-p参数运行容器时,例如:$ docker run -p 80:80 -d nginxDocker for Mac 将使容器端口在localhost可用。
【讨论】:
你可以为 socat 使用 docker 镜像,它会在你每次启动 'docker for mac' 时启动
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}'
【讨论】:
我目前的解决方案是使用 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 机器 VM 的 IP 地址
【讨论】:
另一种解决方法是使用sudo ifconfig lo0 alias 172.17.0.1,这样您仍然可以使用相同的静态 IP 地址(如果您基于 Linux 的同事或 bash 脚本坚持使用该地址)。
【讨论】: