【问题标题】:Docker container - how to configure so it gets a viable IP address when running in vagrant?Docker 容器 - 如何配置以便在 vagrant 中运行时获得可行的 IP 地址?
【发布时间】:2013-04-23 10:27:08
【问题描述】:

Docker (www.docker.io) 看起来很棒。但是,安装 VirtualBox 后,Vagrant ...最后是 Mac 上的 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 以尝试获取,但这并没有解决问题。

【问题讨论】:

    标签: macos vagrant virtualbox docker linux-containers


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      要点...

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

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

      【讨论】:

      • 欢迎来到 SO!即使您包含了 URL,在答案中包含要点也很有帮助。
      • 添加了更多信息。感谢您的评论。
      【解决方案3】:

      您还可以定义 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
      

      【讨论】:

        【解决方案4】:

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

        但是,这只允许您访问虚拟机本身,而不是容器。
        为此,在运行容器时,您可以添加 -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 上提供:

        【讨论】:

        • 现在可以通过docker run -d -p :8989 直接将端口映射到与github.com/dotcloud/docker/commit/… 相同的端口
        • Docker 中是否有更改禁用此功能?如果不使用 vagrant ssh 创建隧道,我将无法从主机 (OS X) 访问我的 docker 容器。
        • @DavClark 你为你的流浪虚拟机设置了静态IP吗? Docker 现在默认使用 unix 套接字。您需要启用 TCP 模式。你可以像这样运行 damon:docker -d -H tcp://0.0.0.0:4243 和这样的客户端:docker -H tcp://<ip of vm>:4243 run -i -t base bash
        • 0.0.0.0 是我缺少的部分。容器只是在 localhost 上监听。文档当然还不清楚这个问题!
        猜你喜欢
        • 1970-01-01
        • 2019-09-19
        • 2018-03-10
        • 1970-01-01
        • 2015-02-24
        • 2018-03-11
        • 1970-01-01
        • 1970-01-01
        • 2013-09-15
        相关资源
        最近更新 更多