Docker容器 - 如何配置,以便在vagrant中运行时获得可行的IP地址?

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. 我在VagrantFile中添加了"config.vm.network: bridged",尝试解决问题,但无效。
4个回答

16
由vagrant生成的虚拟机确实是隔离的,为了从主机访问它,可以为其分配一个私有网络。 尝试使用config.vm.network :private_network, ip: "192.168.50.4"而不是config.vm.network :bridged,这应该就可以了。
但这将仅允许您访问虚拟机本身,而不能访问容器。 为了解决这个问题,在运行容器时,可以添加-p选项。
例如:docker run -d -p 8989 base nc -lkp 8989 这将在容器内运行监听端口8989的netcat,并公开该端口。由于还以-d参数运行,因此容器将处于分离模式,唯一的输出将是容器的ID。
为了暴露端口,Docker执行简单的NAT。为了知道真实的端口,您可以执行docker port <容器的ID> 8989 Netcat将在mac上的192.168.50.4:<结果>可用。

5
现在可以使用 docker run -d -p :8989 直接将端口映射到公共的同一端口,具体操作请参考 https://github.com/dotcloud/docker/commit/2aad4a34785a1b0d02d910a14dbb9b0d6d3edc17。 - bojo
Docker 有没有进行任何更改以禁用此功能?我无法在主机(OS X)上访问我的 Docker 容器,除非使用 vagrant ssh 创建隧道。 - Dav Clark
1
@DavClark,你为你的vagrant虚拟机设置了静态IP吗?现在Docker默认使用Unix套接字。你需要启用TCP模式。你可以像这样运行守护进程:docker -d -H tcp://0.0.0.0:4243,客户端像这样:docker -H tcp://<vm的ip>:4243 run -i -t base bash - creack
0.0.0.0是我缺少的一部分。容器只是在本地侦听。文档在这个问题上肯定还不清楚! - Dav Clark

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容器子网
实际步骤在博客中,带有输出,因此您可以将其与跟随它们时看到的内容进行比较。

欢迎来到SO!虽然您已经包含了URL,但在回答中包含重要的要点也是有帮助的。 - Anton K
添加了更多信息。感谢您的评论。 - Andrew

1

我已经从我的Dockerfile安装了Tomcat,并使用Vagrant的端口转发将其转发到6060。以下是适用于我的步骤:

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

我可以在本地主机的6060端口上看到运行中的Tomcat,因为我在我的Vagrantfile中进行了端口转发。


0

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

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

在我的情况下,我可以使用 Mac 访问 postgres。
$ telnet 192.168.50.4 49154

要找出实际应用程序端口,您可以使用以下方法:

$ sudo docker port 1854499c6547 5432
0.0.0.0:49154

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接