Vagrant和Docker提供商:一种为Linux主机强制代理虚拟机的方法



TL&DR: 是否有办法强制Vagrant使用代理虚拟机,即使主机操作系统本身支持Docker ?

我正在使用Vagrant与Docker提供程序。Vagrant VM是我的应用程序(web服务器,db)的操作系统和Docker容器。

问题:

Linux容器不能在非Linux机器上本机运行。如果你的开发人员在Mac或Windows上,他们不能运行Docker容器本机。Vagrant检测到这些情况,并且自动旋转aLinux虚拟机运行Docker容器。

[…]

如果Vagrant在Linux上与Docker一起使用,Vagrant不会自动启动虚拟机,而将运行Docker本机

来源:http://www.vagrantup.com/blog/feature-preview-vagrant-1-6-docker-dev-environments.html

这是伟大的Vagrant自动启动代理虚拟机的操作系统,不支持原生Docker,因为他们有相同的操作系统工作。但是对于Linux主机,我们只能使用本地Docker安装,这会导致一些问题:
  • 文件/文件夹权限
  • 不同Linux操作系统的不同用户(Apache用户有时是"Apache",有时是"www",取决于您的Linux发行版)

这里是我的Vagrant文件供参考:

DockerHost。Vagrantfile

Vagrant.configure("2") do |config|
  config.vm.provision "docker"
  config.vm.box = "ubuntu/trusty64"
  config.vm.define "dockerhost"
  config.vm.network :forwarded_port, guest: 80, host: 8080
  config.vm.synced_folder "/sites", "/sites" [...]
  config.vm.provider :virtualbox do |vb|
    vb.name = "Vagrant-Dockerhost"
    vb.memory = 1024 # => Required by MySQL Server
  end
end

Vagrantfile

ENV['VAGRANT_DEFAULT_PROVIDER'] = 'docker'
DOCKER_HOST_NAME = "dockerhost"
DOCKER_HOST_VAGRANTFILE = "DockerHost.Vagrantfile"
Vagrant.configure("2") do |config|
  config.vm.define "mysql-server" do |v|
    v.vm.provider "docker" do |d|
      d.image = "mysql"
      d.name = "mysql-server"
      d.env = {
        MYSQL_ROOT_PASSWORD: "rootpasswd",
        MYSQL_USER: "mysqluser",
        MYSQL_PASSWORD: "userpasswd",
        MYSQL_DATABASE: "dev"
      }
      d.volumes = ["/mysql:/var/lib/mysql"]
      d.cmd = ["/entrypoint.sh", "mysqld"]
      d.remains_running = true
      d.vagrant_machine = "#{DOCKER_HOST_NAME}"
      d.vagrant_vagrantfile = "#{DOCKER_HOST_VAGRANTFILE}"
    end
  end
  config.vm.define "apache-server" do |v|
    v.vm.provider "docker" do |d|
      d.image = "lacavalerie/apache-server"
      d.ports = ["80:80"]
      d.name = "apache-server"
      d.link("mysql-server:db")
      d.volumes = [...]
      d.cmd = ["/scripts/setup.rb"]
      d.remains_running = true
      d.vagrant_machine = "#{DOCKER_HOST_NAME}"
      d.vagrant_vagrantfile = "#{DOCKER_HOST_VAGRANTFILE}"
    end
  end
end

只使用d.force_host_vm = true选项

From Vagrant docs:

force_host_vm (boolean) -如果为true,则主机虚拟机将自动启动运行Vagrant的计算机是否支持Linux容器。这是用于强制一个一致的环境来运行Docker。这个值在Mac和Windows主机上默认为"true",在Windows主机上默认为"false"Linux主机。选择使用不同Docker的Mac/Windows用户原生Docker构建的provider或opt-in可以显式地设置这个值为false表示禁用该行为。

最新更新