如何绑定VM docker-machine创建OSX IP地址?

时间:2015-10-08 16:46:35

标签: macos networking docker docker-machine

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

4 个答案:

答案 0 :(得分:6)

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

而是我 ADDED 另一个在桥接模式下运行的网络适配器。 启动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中为VM添加网卡感到困惑的人。我只使用了VirtualBox,并且无法建议其他虚拟化系统配置。

  1. 通过在VM Manager中选择VM并使用右键单击菜单或按下命令-F'来停止VM。
  2. 点击"设置"。
  3. 点击"网络"。
  4. 选择其中一个当前未启用的适配器。
  5. 启用它。
  6. 选择"桥接适配器"在"附加到"选择。
  7. 单击“确定”。
  8. 启动虚拟机并试用。
  9. 注意:我确信有一些聪明的命令行选项可用于执行此设置,但因为我只需要设置它一次我从未打扰自动化它。

答案 1 :(得分:3)

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

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

在用户界面中转到设置 - >网络 - >端口转发或命令行如下:

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

其中"默认"是VM的名称("默认"通常用于docker-machine),9999是您要映射的端口。

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

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

答案 2 :(得分:2)

您是否将曝光命令放在Dockerfile中?

EXPOSE 9999

答案 3 :(得分:0)

根据@ e.thompsy的答案,这是命令行版本。 首先,使用以下方法确定所需的接口名称:

vboxmanage list bridgedifs

对我来说这是en1。 然后:

docker-machine create ...

docker-machine stop $VM

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

docker-machine start $VM