如何从其他主机访问在MacOSX上运行的docker容器?

时间:2015-09-15 19:34:33

标签: macos docker virtualbox docker-machine

我试图开始使用docker并希望运行Ubiquiti video controller。我已经安装了Docker Toolbox并设法让容器在我的Yosemite主机上运行,​​并且可以通过转到docker-machine ip default返回的IP在同一台mac上访问它。但我想在网络上的其他机器上访问它,并最终在我的家用路由器上设置端口转发,以便我可以在我的家庭网络之外访问它。

正如boot2docker issue 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对虚拟机中的网络配置有一些假设,我正在捣乱它们。

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的值来解释您需要如何访问容器,但没有解释如何从其他主机访问。也许我需要提高我的谷歌搜索技能。

5 个答案:

答案 0 :(得分:8)

这对我有用

  • 停止的VM添加第3个“网桥”网络
  • 使用docker-machine start machine-name
  • 启动VM
  • 使用docker-machine regenerate-certs machine-name
  • 重新生成证书

检查docker-machine ls是否正常

答案 1 :(得分:4)

好的,所以我找到了比尝试使用桥接网络适配器更好的方法。我在port forwarding的boot2docker文档中找到了它。

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

然后,从docker 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可能会破坏VM上容器之间的通信,但由于这是我计划运行的唯一容器,因此对我来说非常有用。

答案 2 :(得分:1)

在使用 Docker Toolbox for Mac 的计算机上,我正在解决此问题,如下所示(使用default计算机)。

<强>制备

  1. 如果机器正在运行,请停止它:

    docker-machine stop default

  2. VirtualBox设置

    1. 打开VirtualBox,选择default计算机,打开设置(Cmd-S),转到网络,然后选择“适配器3”。

    2. 选中“启用网络适配器”(将其打开)。

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

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

        docker-machine start default

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

        docker-machine regenerate-certs default

      3. 更新环境:

        eval $(docker-machine env default)

      4. 此时,计算机应该正在运行(默认IP地址为192.168.99.100,只能从托管Mac访问)。但是,如果您进入docker VM(docker-machine ssh default)并运行ifconfig -a,您将看到其中一个VM的接口(在我的情况下为eth0)具有相同的IP网络作为您的Mac(例如192.168.0.102),可从LAN上的其他设备访问。

        路由器设置

        现在,最后一步是确保此地址已修复,并且路由器的DHCP不会随时更改。这可能因路由器而异,以下内容适用于我的简洁TP-LINK路由器,但应该可以轻松调整到其他品牌和型号。

        1. 打开路由器设置,首先检查default是否在路由器的DHCP客户端列表中,并使用上面步骤7中的MAC地址。

        2. 打开“DHCP”&gt;路由器设置中的“地址预留”,并添加“适配器3”MAC地址(您可能必须插入缺失的短划线),以及您想要的IP(例如192.168.0.201)。

        3. 现在我的路由器要求我重新启动它。重新启动后,运行docker-machine restart default以使Docker VM获取其新IP地址。

        4. 最终验证:docker-machine ssh default,然后是ifconfig -a,并在输出中找到您的新IP地址(此时界面为eth1)。

        5. <强>结果

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

答案 3 :(得分:0)

这个问题的主要用例是从主机(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

答案 4 :(得分:0)

如果我将第一张网卡从NAT更改为网桥,我也将无法连接到它。

我发现可以使用的方法是添加第三个网卡,将其设置为桥接模式,然后将适配器类型更改为Intel PRO/1000 MT Desktop (82540EM)boot2docker发行版可能不支持默认版本。

在github上查看我的comment