12

Docker (www.docker.io) 看起来很棒。但是,在 Mac 上安装 VirtualBox、Vagrant ......最后是 Docker 之后,我发现无法从另一台计算机(或从 Mac 上的终端会话)访问在 Docker 容器中运行的服务。我试图访问的服务是 Redis。

问题似乎是没有路由到分配给 Docker 容器的 IP 地址。在这种情况下,容器的 IP 是 172.16.42.2,而 Mac 的 IP 是 196.168.0.3。

几点注意事项:

  1. 可以访问它——但只能从 VirtualBox 会话中访问。这可以使用 redis-cli -h 172.16.42.2 -p 6379 来完成。
  2. 我已将“config.vm.network :bridged”添加到 VagrantFile 以尝试获取,但这并没有解决问题。
4

4 回答 4

16

vagrant 生成的虚拟机确实是隔离的,为了从你的主机访问它,你可以给它分配一个私有网络。而不是做config.vm.network :bridged,尝试config.vm.network :private_network, ip: "192.168.50.4",它应该做的伎俩

但是,这只允许您访问 VM 本身,而不是容器。
为此,在运行容器时,您可以添加-p选项

前任:docker run -d -p 8989 base nc -lkp 8989

这将在容器内运行一个 netcat 监听 8989 并公开该端口。因为它也使用 -d 运行,所以容器将处于分离模式,唯一的输出将是容器的 ID

为了暴露端口,Docker 做了一个简单的 NAT。为了知道真正的端口,你可以

docker port <ID of the container> 8989

Netcat 将在 192.168.50.4 的 mac 上提供:<result>

于 2013-05-01T06:31:09.810 回答
2

我刚刚写了一篇关于如何使用仅主机网络和 TCP 路由的教程,以使这变得非常容易。这样您就不必映射每个特定端口。

http://ispyker.blogspot.com/2014/04/accessing-docker-container-private.html

重点...

1) 将仅主机网络添加到 Virtual Box 2) 告诉 boot2docker VM 在仅主机网络上有一个适配器 3) 为新的 boot2docker VM 仅主机网络适配器添加 IP 4) 路由所有 Mac OS X 流量该 boot2docker VM 仅主机网络 IP 的 docker 容器子网

实际步骤在带有输出的博客上,因此您可以与您在遵循它们时看到的内容进行比较。

于 2014-04-24T21:41:25.047 回答
1

我已经从我的 Dockerfile 安装了 tomcat,并使用 vagrant 的端口转发将其转发到 6060。这些是对我有用的步骤:

vagrant provision
vagrant up
vagrant ssh
box_name$ docker run  -i -t -p 8080:8080 bsb_tomcat6 /bin/bash

能够在 localhost:6060 上看到 tomcat 启动和运行,因为我已经在我的 Vagrantfile 中将端口转发到 6060

于 2014-05-05T15:58:20.633 回答
0

您还可以定义 PRIVATE_NETWORK 和 FORWARD_DOCKER_PORTS 环境变量来访问在 docker 容器中运行的服务:

$ vagrant halt
$ export PRIVATE_NETWORK=192.168.50.4
$ export FORWARD_DOCKER_PORTS=1
$ vagrant up

就我而言,我可以使用 Mac 从 Mac 访问 postgres

$ telnet 192.168.50.4 49154

找出您可以使用的实际应用程序端口

$ sudo docker port 1854499c6547 5432
0.0.0.0:49154
于 2014-02-19T06:45:01.327 回答