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

che*_*one 9 macos virtualbox docker docker-machine

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

正如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)
Run Code Online (Sandbox Code Playgroud)

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

我不确定这是否是正确的方法,或者我是否正在咆哮错误的树.如果我可以在虚拟机上运行桥接网络适配器,我不知道如何说服我的docker容器使用它.我试过在互联网上搜索高低.我找到了几十个网站,解释了如何使用值来解释如何访问容器,docker-machine ip default而不是localhost解释如何从其他主机访问.也许我需要提高我的谷歌搜索技巧.

Mic*_*ele 8

这对我有用

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

检查docker-machine ls是否正常


che*_*one 5

好的,所以我找到了比尝试使用桥接网络适配器更好的方法。我在 boot2docker 文档中关于端口转发的内容中找到了它。

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

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

docker run -d -p 8080:80 --name=web nginx
Run Code Online (Sandbox Code Playgroud)

使用

docker run -d --net=host --name=web nginx
Run Code Online (Sandbox Code Playgroud)

瞧!您的 Web 服务器位于主机上的 localhost:8080 或 LAN 上其他位置的 YOURHOSTIP:8080 处。

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

  • 知道如何使用最新的 Mac Docker 而不使用 boot2docker 来实现这一点吗? (2认同)