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

如何从另一台主机访问MacOSX上运行的docker容器?,macos,docker,virtualbox,docker-machine,Macos,Docker,Virtualbox,Docker Machine,我正试着从docker开始,并想运行这个程序。我已经安装了Docker Toolbox并设法使容器在我的Yosemite主机上运行,并且可以通过转到Docker machine IP default返回的IP在同一mac上访问它。但是我想在网络上的其他机器上访问它,并最终在我的家庭路由器上设置端口转发,这样我就可以在家庭网络之外访问它 正如中所建议的,使用Virtualbox GUI,我可以添加桥接网络适配器,但是在重新启动VMdocker机器之后,它就不能再与VM连接了docker env d

我正试着从docker开始,并想运行这个程序。我已经安装了Docker Toolbox并设法使容器在我的Yosemite主机上运行,并且可以通过转到Docker machine IP default返回的IP在同一mac上访问它。但是我想在网络上的其他机器上访问它,并最终在我的家庭路由器上设置端口转发,这样我就可以在家庭网络之外访问它

正如中所建议的,使用Virtualbox GUI,我可以添加桥接网络适配器,但是在重新启动VM
docker机器之后,它就不能再与VM连接了
docker env default
挂起很长一段时间,但最终返回一些环境变量,并显示消息
超过最大重试次数(60次)
。当我使用这些变量设置shell并尝试运行
docker ps
时,我得到了错误:
尝试连接时出错:gethttps://10.0.2.15:2376/v1.20/containers/json: 拨打tcp 10.0.2.15:2376:无法访问网络

我怀疑docker机器对虚拟机中的网络配置有一些假设,我把它们搞糟了

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地址


我不确定这是正确的方法还是我找错了方向。如果我能让桥接网络适配器在VM上工作,我不知道如何说服我的docker容器使用它。我试着在互联网上到处搜索。我发现了几十个站点,它们解释了如何使用
docker machine ip default
的值来访问容器,而不是
localhost
,但是没有解释如何从其他主机访问。也许我需要提高我的谷歌搜索技能。

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

只需使用VBoxManage modifyvm默认值--natpf1“我的web,tcp,8080,80”
或者使用VirtualBox GUI为NAT适配器指定端口转发

然后,从docker run命令中删除
-p
选项,并改用
--net=host
。而不是

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

瞧!您的web服务器在您的主机上的localhost:8080或LAN上的其他位置的hostIP:8080上可用

请注意,使用
--net=host
可能会打乱VM上容器之间的通信,但由于这是我计划运行的唯一容器,它对我来说非常有用。

这对我来说非常有用

  • 停止VM后,添加第三个“网桥”网络
  • 使用docker计算机启动计算机名称启动VM
  • 使用docker计算机重新生成证书重新生成证书计算机名称

检查docker machine ls是否正常此问题的主要用例是从主机(Mac)计算机或主机(Mac)网络中的其他计算机访问容器中运行的应用程序

一旦容器应用程序启动并公开,如下所示

docker run -d -p 8080 <<image-name>>
docker run-d-p8080
然后查找主机(Mac)端口与容器端口之间的映射,如下所示

docker port <<container-name>>
sample output : 8080/tcp -> 0.0.0.0:32771
docker端口
样本输出:8080/tcp->0.0.0.0:32771

现在,从主机(Mac)网络中的任何计算机以主机(Mac IP)身份访问容器应用程序:32771。在一台带有Mac Docker Toolbox的计算机上,我正在解决以下问题(使用
默认
计算机)

准备

  • 如果机器正在运行,请停止机器:

    docker机器停止默认值

  • VirtualBox设置

  • 打开VirtualBox,选择
    默认
    机器,打开设置(
    Cmd-S
    ),转到网络,然后选择“适配器3”

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

  • 将“连接到”设置为“桥接适配器”
  • 将名称设置为“en0:Ethernet”(或任何主网络接口或Mac)
  • 披露“高级”,并确保“电缆连接”已检查
  • 请注意“适配器3”的“MAC地址”(稍后我们将使用它)
  • 按“确定”保存设置
  • 码头工人设置

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

    docker机器启动默认值

  • 以防万一,请重新生成证书:

    docker机器重新生成证书默认值

  • 更新环境:

    eval$(docker机器环境默认值)

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

    路由器设置

    现在,最后一步是确保这个地址是固定的,并且不会被路由器的DHCP不时更改。这可能因路由器而异,以下内容适用于我的无装饰TP-LINK路由器,但应可轻松调整到其他品牌和型号

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

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

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

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