如何从另一台主机访问运行在MacOSX上的Docker容器?

我试图开始与docker,并希望运行Ubiquitivideo控制器 。 我已经安装了Docker工具箱,并设法让容器在我的优胜美地主机上运行,​​并可以通过转到由docker-machine ip default返回的IP在同一台mac上访问它。 但我想在networking上的其他机器上访问它,并最终在家庭路由器上设置端口转发,以便在家庭networking之外访问它。

正如boot2docker问题160中所build议的那样 ,使用Virtualbox GUI,我能够添加一个桥接networking适配器,但在重新启动VM docker-machine不能再与VM连接。 docker env default挂起很长时间,但最终会返回一些环境variables以及Maximum number of retries (60) exceeded的消息。 当我使用这些variables设置shell并尝试运行docker ps ,出现错误: An error occurred trying to connect: Get https://10.0.2.15:2376/v1.20/containers/json: dial tcp 10.0.2.15:2376: network is unreachable错误: An error occurred trying to connect: Get https://10.0.2.15:2376/v1.20/containers/json: dial tcp 10.0.2.15:2376: network is unreachable

我怀疑docker-machine对虚拟机中的networkingconfiguration有一些假设,我正在把它们弄糟。

docker-machine ssh ifconfig -a返回以下内容:

 docker0 Link encap:Ethernet HWaddr 02:42:86:44:17:1E inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) dummy0 Link encap:Ethernet HWaddr 96:9F:AA:B8:BB:46 BROADCAST NOARP MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) eth0 Link encap:Ethernet HWaddr 08:00:27:37:2C:75 inet addr:192.168.1.142 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe37:2c75/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2996 errors:0 dropped:0 overruns:0 frame:0 TX packets:76 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:278781 (272.2 KiB) TX bytes:6824 (6.6 KiB) Interrupt:17 Base address:0xd060 eth1 Link encap:Ethernet HWaddr 08:00:27:E8:38:7C inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fee8:387c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:767 errors:0 dropped:0 overruns:0 frame:0 TX packets:495 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:122291 (119.4 KiB) TX bytes:116118 (113.3 KiB) eth2 Link encap:Ethernet HWaddr 08:00:27:A4:CF:12 inet addr:192.168.99.100 Bcast:192.168.99.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fea4:cf12/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:430 errors:0 dropped:0 overruns:0 frame:0 TX packets:322 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:53351 (52.1 KiB) TX bytes:24000 (23.4 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 

eth0似乎从我的路由器获得一个合理的DHCP地址。

我不确定这是否是正确的方法,或者我是否在咆哮错误的树。 如果我能够在虚拟机上运行桥接networking适配器,我不知道如何说服我的docker集装箱使用它。 我试过在互联网上search高低。 我发现有几十个站点解释了如何使用docker-machine ip default的值访问容器,而不是localhost但没有解释如何从不同的主机访问。 也许我需要提高我的Googlesearch技巧。

这为我工作

  • 停止虚拟机添加第三个“桥”networking
  • 用docker-machine启动machine-name启动VM
  • 使用docker-machine regenerate-certs machine-name重新生成证书

检查是否与docker机ls确定

好的,所以我find了比尝试使用桥接networking适配器更好的方法。 我在端口转发的boot2docker文档中find它。

只需使用VBoxManage modifyvm default --natpf1 "my_web,tcp,,8080,,80"或使用VirtualBox GUI为NAT适配器指定端口转发。

然后,从--net=host run命令中删除-p选项,并使用--net=host代替。 这是,而不是

 docker run -d -p 8080:80 --name=web nginx 

使用

 docker run -d --net=host --name=web nginx 

瞧! 您的Web服务器可在您的主机上使用localhost:8080或使用LAN上其他地方的YOURHOSTIP:8080使用。

请注意,使用--net=host可能会--net=host虚拟机上的容器之间的通信,但由于这是我计划运行的唯一容器,所以对我来说非常--net=host

在具有Docker Toolbox for Mac的机器上,我正在如下解决问题(使用default机器)。

制备

  1. 停止机器运行:

    docker-machine stop default

VirtualBox安装

  1. 打开VirtualBox,selectdefault机器,打开设置( Cmd-S ),进入networking,select“适配器3”。

  2. 选中“启用networking适配器”(打开它)。

  3. 将“连接到”设置为“桥接适配器”。
  4. 将名称设置为“en0:以太网”(或任何主networking接口或Mac)。
  5. 披露“高级”,并确保选中“连接电缆”。
  6. 请注意“适配器3”的“MAC地址”(稍后我们将使用它)。
  7. 按“确定”保存设置。

Docker设置

  1. 现在回到terminal,启动机器:

    docker-machine start default

  2. 以防万一,重新生成证书:

    docker-machine regenerate-certs default

  3. 更新环境:

    eval $(docker-machine env default)

此时,机器应该正在运行(默认IP地址为192.168.99.100,只能从主机Mac访问)。 但是,如果你进入docker VM( docker-machine ssh default )并运行ifconfig -a ,你会看到一个虚拟机的接口(在我的情况下是eth0 )与你的Mac在同一个networking中有一个IP 192.168.0.102),可以从局域网中的其他设备访问。

路由器设置

现在,最后一步是确保这个地址是固定的,而不是由您的路由器的DHCP不时更改。 这可能会有所不同,从路由器到路由器,以下适用于我的廉价TP-LINK路由器,但是应该可以方便地调整到其他品牌和型号。

  1. 打开你的路由器设置,首先检查路由器的DHCP客户端列表中的default值,以上步骤7中的MAC地址。

  2. 在路由器设置中打开“DHCP”>“地址保留”,并在其中添加“适配器3”MAC地址(您可能需要插入缺less的破折号)以及所需的IP地址(例如192.168.0.201)。

  3. 现在我的路由器要求我重新启动它。 重启后,运行docker-machine restart default为Docker虚拟机提取新的IP地址。

  4. 最终validation: docker-machine ssh default ,然后ifconfig -a ,并在输出中find新的IP地址(这次的接口是eth1 )。

结果

从主机Mac机器可以通过两个地址(192.168.99.100和192.168.0.201)访问; 从局域网中的其他设备可访问为192.168.0.201。

这个问题的主要用例是从主机(Mac)networking或主机(Mac)networking中的其他机器访问在容器中运行的应用程序

一旦容器应用程序已经启动并暴露如下

 docker run -d -p 8080 <<image-name>> 

然后find主机(Mac)端口与容器端口之间的映射如下

 docker port <<container-name>> sample output : 8080/tcp -> 0.0.0.0:32771 

现在从主机(Mac)networking中的任何机器以主机(Mac IP):32771访问容器应用程序