如何从另一台主机访问运行在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
机器)。
制备
-
停止机器运行:
docker-machine stop default
VirtualBox安装
-
打开VirtualBox,select
default
机器,打开设置(Cmd-S
),进入networking,select“适配器3”。 -
选中“启用networking适配器”(打开它)。
- 将“连接到”设置为“桥接适配器”。
- 将名称设置为“en0:以太网”(或任何主networking接口或Mac)。
- 披露“高级”,并确保选中“连接电缆”。
- 请注意“适配器3”的“MAC地址”(稍后我们将使用它)。
- 按“确定”保存设置。
Docker设置
-
现在回到terminal,启动机器:
docker-machine start default
-
以防万一,重新生成证书:
docker-machine regenerate-certs default
-
更新环境:
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路由器,但是应该可以方便地调整到其他品牌和型号。
-
打开你的路由器设置,首先检查路由器的DHCP客户端列表中的
default
值,以上步骤7中的MAC地址。 -
在路由器设置中打开“DHCP”>“地址保留”,并在其中添加“适配器3”MAC地址(您可能需要插入缺less的破折号)以及所需的IP地址(例如192.168.0.201)。
-
现在我的路由器要求我重新启动它。 重启后,运行
docker-machine restart default
为Docker虚拟机提取新的IP地址。 -
最终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访问容器应用程序