【问题标题】:Docker for Mac VM IPDocker for Mac 虚拟机 IP
【发布时间】:2016-12-21 16:15:59
【问题描述】:

我刚刚从以前使用 Docker Toolbox 和用于 OSX 的 virtualbox 迁移到使用 Docker for Mac。

我以前用$(docker-machine ip default)获取机器IP地址。

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

谢谢!

【问题讨论】:

    标签: macos docker docker-machine


    【解决方案1】:

    Docker 工具箱相反,Docker for WindowsDocker 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 连接:

    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上映射您想要的内容

    如果需要,由您在启动时运行 socat 命令。

    这对我来说很有用,例如将 Webstorm nodeJS 调试器 关联到 nodeJS 容器(因为在撰写本文时,docker 调试Webstorm docker 集成插件支持,但不通过 unix 套接字)。

    Docker for Mac 限制文档

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

    ma​​cOS 上没有 docker0 网桥

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

    【讨论】:

      【解决方案2】:

      无需像使用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 可用。

      【讨论】:

      • 好的,谢谢!这很有帮助。在某些情况下,实际的 VM IP 仍然有用 - 但现在这很好。
      • 我投了反对票,因为它没有回答问题。我想知道如何获取ip。我知道如何映射端口。
      【解决方案3】:

      你可以为 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}'
      

      【讨论】:

      • 正是我需要的,tnx :ok
      【解决方案4】:

      我目前的解决方案是使用 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 地址

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2012-08-04
          • 1970-01-01
          • 2018-07-01
          • 2012-09-25
          • 1970-01-01
          • 1970-01-01
          • 2022-06-14
          • 2019-08-25
          • 1970-01-01
          相关资源
          最近更新 更多