【问题标题】:Access vagrant VMs from inside docker container从 docker 容器内部访问 vagrant 虚拟机
【发布时间】:2018-01-29 18:02:55
【问题描述】:

如何在 2 个使用 Vagrant/Virtualbox 的 centos 虚拟机和使用 docker for mac 的 docker 容器之间设置网络。他们都需要能够相互访问。

目前我无法从 docker 容器中访问虚拟机。

流浪设置:

Vagrant.configure("2") do |config|

   config.vm.define "build" do |build|
      build.vm.box = "centos/7"
      build.vm.provider "virtualbox"
      build.vm.hostname = "server-a"
      build.vm.network "private_network", ip: "192.168.50.4"
   end

   config.vm.define "test" do |test|
      test.vm.box = "centos/7"
      test.vm.provider "virtualbox"
      test.vm.hostname = "server"
      test.vm.network "private_network", ip: "192.168.50.5"
   end
end

虚拟机可以互相访问,但是docker容器不能访问虚拟机

docker network create -d bridge --gateway=192.168.50.1 --subnet=192.168.50.1/24 mybridge
docker run --network=mybridge alpine ping 192.168.50.4
=> not able to connect

【问题讨论】:

    标签: docker networking vagrant


    【解决方案1】:

    您需要将运行 docker 容器的网络和启动 vagrant VM 的网络连接到主机上的同一桥接设备:

    1.创建docker网络:

    docker network create -d bridge --gateway=192.168.50.1
    --subnet=192.168.50.1/24 mybridge
    

    Docker 在主机上创建名称为 br-<network_id> 的网桥:

    $ docker network ls | grep mybridge
    e13b3ccc6691        mybridge              bridge              local
    
    $ brctl show | grep e13b3ccc6691
    br-e13b3ccc6691     8000.024277661b29   no  
    
    $ ip r s | grep e13b3ccc6691
    192.168.50.0/24 dev br-e13b3ccc6691  proto kernel  scope link  src 192.168.50.1 linkdown 
    

    2. 将 vagrant VMs 网络连接到同一个桥接设备:

    Vagrant.configure("2") do |config|
       config.vm.define "build" do |build|
          build.vm.box = "centos/7"
          build.vm.provider "virtualbox"
          build.vm.hostname = "server-a"
          build.vm.network "public_network", ip: "192.168.50.4", bridge: "br-e13b3ccc6691"
       end
    
       config.vm.define "test" do |test|
          test.vm.box = "centos/7"
          test.vm.provider "virtualbox"
          test.vm.hostname = "server"
          test.vm.network "public_network", ip: "192.168.50.5", bridge: "br-e13b3ccc6691"
       end
    end
    

    3. 启动虚拟机:

    $ vagrant up
    

    4.mybridge网络中启动docker容器:

    $ docker run -ti --network=mybridge alpine ping -c2 192.168.50.4
    PING 192.168.50.4 (192.168.50.4): 56 data bytes
    64 bytes from 192.168.50.4: seq=0 ttl=64 time=0.898 ms
    64 bytes from 192.168.50.4: seq=1 ttl=64 time=0.869 ms
    
    --- 192.168.50.4 ping statistics ---
    2 packets transmitted, 2 packets received, 0% packet loss
    round-trip min/avg/max = 0.869/0.883/0.898 ms
    

    【讨论】:

    • 感谢您的大力响应,我已经在 linux 工作站上完成了这项工作。但是使用“docker for mac”我无法桥接网络。当进一步研究“docker for mac”文档时,它似乎是一个已知的限制。 :) docs.docker.com/docker-for-mac/networking/…
    • 我已经按照这些说明进行操作,VM 和 Docker 容器可以相互 ping 通,但是虽然 VM 可以访问 Internet,但 Docker 容器不能。 Docker 容器也无法访问 VM 公开的端口。
    【解决方案2】:

    建议的Vagrantfile 不适用于此环境:

    • 操作系统:Debian 靶心(测试)
    • 流浪者:2.2.14
    • Vagrant 提供者:libvirt (KVM)

    这是行之有效的行:

      config.vm.network "public_network", ip: "192.168.50.4", dev: "br-e13b3ccc6691", mode: "bridge", type: "bridge"
    

    我的猜测,因为提供者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2018-05-15
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多