[英]How to access a docker container running on MacOSX from another host?
我正在尝试开始使用docker并想要运行Ubiquiti视频控制器 。 我已经安装了Docker Toolbox并设法让容器在我的Yosemite主机上运行,并且可以通过访问docker-machine ip default
返回的IP在同一台mac上访问它。 但我想在网络上的其他机器上访问它,并最终在我的家用路由器上设置端口转发,以便我可以在我的家庭网络之外访问它。
正如boot2docker问题160中所建议的那样 ,使用Virtualbox GUI我能够添加桥接网络适配器,但在重新启动VM之后, docker-machine
无法再与VM连接。 docker env default
挂起很长时间但最终会返回一些环境变量以及消息Maximum number of retries (60) exceeded
。 当我使用这些变量设置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
。
我怀疑docker-machine对VM中的网络配置有一些假设,我正在弄乱他们。
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地址。
我不确定这是否是正确的方法,或者我是否正在咆哮错误的树。 如果我可以在虚拟机上运行桥接网络适配器,我不知道如何说服我的docker容器使用它。 我试过在互联网上搜索高低。 我找到了几十个网站,解释了如何使用docker-machine ip default
而不是localhost
来访问容器,但没有解释如何从其他主机访问。 也许我需要提高我的谷歌搜索技巧。
这对我有用
检查docker-machine ls是否正常
好的,所以我找到了比尝试使用桥接网络适配器更好的方法。 我在boot2docker文档中发现了端口转发 。
只需使用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
VM上容器之间的通信,但由于这是我计划运行的唯一容器,因此对我来说非常--net=host
。
在使用Docker Toolbox for Mac的计算机上,我解决了以下问题(使用default
计算机)。
制备
如果机器正在运行则停止:
docker-machine stop default
VirtualBox设置
打开VirtualBox,选择default
机器,打开设置( Cmd-S
),转到网络,然后选择“适配器3”。
选中“启用网络适配器”(将其打开)。
Docker设置
现在,回到终端,启动机器:
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
,您将看到其中一个VM的接口(在我的情况下为eth0
)在与Mac相同的网络中具有IP(例如192.168.0.102),可从LAN上的其他设备访问。
路由器设置
现在,最后一步是确保此地址已修复,并且路由器的DHCP不会随时更改。 这可能因路由器而异,以下内容适用于我的简洁TP-LINK路由器,但应该可以轻松调整到其他品牌和型号。
打开路由器设置,首先使用上面步骤7中的MAC地址检查路由器的DHCP客户端列表中的default
。
在路由器设置中打开“DHCP”>“地址预留”,并添加“适配器3”MAC地址(您可能必须插入缺失的短划线),并在那里添加所需的IP(例如192.168.0.201)。
现在我的路由器要求我重新启动它。 重新启动后,运行docker-machine restart default
以使Docker VM获取其新IP地址。
最终验证: docker-machine ssh default
,然后是ifconfig -a
,并在输出中找到你的新IP地址(这次接口是eth1
)。
结果
从托管Mac可以通过两个地址(192.168.99.100和192.168.0.201)访问该机器; 从LAN中的其他设备可以访问192.168.0.201。
这个问题的主要用例是从主机(Mac)机器或主机(Mac)网络中的其他机器访问容器中运行的应用程序
一旦容器应用程序启动并暴露如下
docker run -d -p 8080 <<image-name>>
然后找到主机(Mac)端口与容器端口之间的映射,如下所示
docker port <<container-name>>
sample output : 8080/tcp -> 0.0.0.0:32771
现在从主机(Mac)网络中的任何计算机访问容器应用程序作为主机(Mac IP):32771
如果我将第一个网卡从NAT
更改为网桥,我也无法连接到它。
我发现工作的是添加第三张网卡,将其设置为桥接模式并将适配器类型更改为Intel PRO/1000 MT Desktop (82540EM)
。 boot2docker
发行版可能不支持默认值。
在github上查看我的评论 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.