【问题标题】:How to bind the VM docker-machine creates to OSX IP address?如何将 docker-machine 创建的 VM 绑定到 OSX IP 地址?
【发布时间】:2015-10-08 16:46:35
【问题描述】:

我正在使用最新的 Docker 工具包在 OSX 上使用 Docker 进行本地开发。我有一个在 docker 容器中运行的节点服务器,绑定到 VM 的端口 9999。我可以从我的 Mac 上的浏览​​器访问此服务器,我想从同一网络上的另一台设备访问。有没有办法将VM绑定到机器的IP地址?还是以其他方式曝光?

【问题讨论】:

  • 您是否尝试过 docker-macine 的 ip 子命令来检索实际的 docker-machine ip 地址?如果您使用端口映射运行容器,则可以使用此 ip 和映射端口使用它。否则,您可以尝试将 docker-machine VB 映像网络配置配置为 NAT 和 Bridge,以使其通过您的主机 IP 地址可用
  • 好吧,我从来没有在 Docker 中找到一个很好的方法来做到这一点,所以我最终在 Node 中创建了自己的代理。

标签: macos networking docker docker-machine


【解决方案1】:

我今天才发现这个!我在 Mac OS 10.10.5 上使用带有 virtualbox 的 docker-machine。我尝试的第一件事是将网络接口从 NAT 更改为桥接。这只是破坏了 docker-machine 与 VM 通信的能力。

相反,我添加另一个以桥接模式运行的网络适配器。 启动 docker-machine 后,我得到了这个:

$ docker-machine ip redis-test
10.222.11.242

这是我办公室或 VPN 上的任何其他人都可以访问的本地网络地址。

如果我运行类似的东西:

$ docker run -p 6379:6379 -d redis

我在 10.222.11.242 地址的 6379 端口上运行了一个容器化的 redis 服务。

所以我可以从网络上的其他任何地方执行此操作:

$ telnet 10.222.11.242 6379
Trying 10.222.11.242...
Connected to 10.222.11.242.
Escape character is '^]'.
info
$1827
# Server
redis_version:2.8.19
...

作为一个很酷的好处,我们可以像这样重新映射端口:

$ docker run -p 8080:6379 -d redis
e7cc53d9c157a658041c3bee5967dd3678b4d35e6146a02220a87bfebfc919ad
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
e7cc53d9c157        redis               "/entrypoint.sh redis"   7 seconds ago       Up 6 seconds        0.0.0.0:8080->6379/tcp             goofy_yonath
bf1dc6c7c6b5        redis               "/entrypoint.sh redis"   51 minutes ago      Up 51 minutes       0.0.0.0:6379->6379/tcp             redis

现在我有两个 redis 实例侦听同一 IP 的不同端口(6379 和 8080)。

编辑:这里有一些细节可以帮助那些对在 VirtualBox 中添加 NIC 到 VM 感到困惑的人。我只为此使用过 VirtualBox,无法提供其他虚拟化系统配置的建议。

  1. 通过在 VM 管理器中选择 VM 并使用右键菜单或按“command-F”来停止 VM。
  2. 点击“设置”。
  3. 点击“网络”。
  4. 选择当前未启用的适配器之一。
  5. 启用它。
  6. 在“附加到”选项中选择“桥接适配器”。
  7. 点击确定。
  8. 启动您的虚拟机并尝试一下。

注意:我确信有一些巧妙的命令行选项可用于执行此设置,但因为我只需要在从未费心将其自动化时进行设置。

【讨论】:

  • 我仍在努力解决这个问题。您能否列出您为添加该网络适配器并使其正常工作所执行的步骤?
  • 要添加网络适配器,您只需先停止虚拟机
  • 还有更多信息吗?很高兴看到您按照@geddski 的评论实际做了什么
【解决方案2】:

您可以在 VirtualBox NAT 适配器上设置端口转发。

将其桥接到本地网络(在上面的答案中)与使用 OSX IP 地址不同。如果您使用笔记本电脑并移动到不同的互联网连接,桥接有时会导致额外的头痛。 VM 可能不会自动从新网络中提取新 IP,等等。

在 UI 中转到设置 --> 网络 --> 端口转发或从命令行中类似这样:

VBoxManage controlvm "default" natpf1 "tcp-port9999,tcp,,9999,,9999";

其中“default”是虚拟机的名称(“default”通常用于 docker-machine),9999 是您要映射的端口。

更多信息请访问:https://github.com/boot2docker/boot2docker/blob/master/doc/WORKAROUNDS.md

https://www.virtualbox.org/manual/ch06.html(使用 NAT 配置端口转发)

【讨论】:

    【解决方案3】:

    你把expose命令放到Dockerfile里了吗?

    EXPOSE 9999
    

    【讨论】:

    • 我没有使用 Dockerfile,我只是从 dockerhub 上的官方节点映像执行 docker run。但是,我将容器的端口绑定到 docker run 上的 VM。 (docker run --name server --port 9999:9999 node npm run server。我现在面临的问题是如何将VM绑定到我的计算机的公共IP地址?
    • --net=host 是文档所说的 - 我无法让它在我的 Mac 上运行 - 让我们知道它是否适合您。
    【解决方案4】:

    基于@e.thompsy 的回答,这里是命令行版本。 首先,找出你需要使用的接口名称:

    vboxmanage list bridgedifs

    对我来说是 en1。 那么:

    docker-machine create ...

    docker-machine stop $VM

    vboxmanage modifyvm "$VM" --nic3 bridged --bridgeadapter3 en1

    docker-machine start $VM

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      相关资源
      最近更新 更多