为什么我无法在Vagrant VM中解析docker.io和代理后面的其他主机

时间:2014-10-31 16:24:29

标签: proxy vagrant virtualbox docker boot2docker

我正在运行Vagrant,里面有两个docker容器,当它不在公司代理上时工作正常但是当我在公司代理上并尝试运行vagrant时我会继续:

https://index.docker.io/v1/repositories/dockerfile/ubuntu/images: 
dial tcp: lookup index.docker.io: no such host

我使用

在vagrant中设置代理
VAGRANT_HTTP_PROXY="http://proxy.example.com:8080/" vagrant up

我也无法使用公司代理

中的vagrant中的nslookup来解析主机

我尝试在vagrantfile中包含以下here

config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
end

我也尝试过使用桥接连接,按照建议here重新启动docker服务器,然后在我的mac上交换我的DNS(我在其他地方看到建议但找不到链接)

我真的很感激一些帮助/方向,如果它的相关性,我在运行带虚拟盒的OSX 10.9的macbook上运行vargrant 1.6.5,这是我的流浪文件:

$start = <<SCRIPT
#service docker stop
#HTTP_PROXY=http://proxy:8080/ docker -d &
service docker restart

#stop and remove any existing containers
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

echo "Building from Dockerfiles"
# Build containers from Dockerfiles
docker build -t sapvagrant/web_app /var/local/app/webApp
docker build -t sapvagrant/node /var/local/app/nodeService

echo "Running & linking containers"
# Run and link the containers
docker run -d --name node myvagrant/node
docker run -d -P -p 49166:80 --name web --link node:db myvagrant/web_app

docker start node
docker start web
SCRIPT

VAGRANTFILE_API_VERSION = "2"

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

=begin
    if Vagrant.has_plugin?("vagrant-proxyconf")
        config.proxy.http     = "http://proxy:8080/"
        config.proxy.https    = "http://proxy:8080/"
        config.proxy.no_proxy = "localhost,127.0.0.1"
    end
=end
    #config.vm.network :bridged
    config.vm.provider :virtualbox do |vb|
        #vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
        #vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    end

    # Port Forwarding
    config.vm.network "forwarded_port", guest: 49166, host: 3000

    # Ubuntu
    config.vm.box = "precise64"
    config.vm.box_url="http://files.vagrantup.com/precise64.box"

    # Install latest docker
    config.vm.provision "docker"

    config.vm.synced_folder ".", "/var/local/app" #, type: "nfs"
    config.vm.provision :shell, inline: "/etc/init.d/docker restart"

    #config.vm.provision "shell", inline: $setup

    config.vm.provision "shell", run: "always", inline: $start

end

1 个答案:

答案 0 :(得分:3)

没有必要解析Internet上的名称,因为您的代理服务器会解析名称。但是,如果没有安装docker,vagrant-proxyconf不会配置代理。您有两种方法可以解决此问题。

在docker provision

之前配置代理

Vagrant docker provisioner无法更改配置文件。 (例如/etc/default/docker/etc/sysconfig/docker) 您需要在使用shell provisioner进行配置之前配置代理,如下所示。

  # If you use RHEL write to /etc/sysconfig/docker
  config_proxy = 'echo export http_proxy=$http_proxy >> /etc/default/docker'
  config.vm.provision('shell',
                      inline: config_proxy)
  config.vm.provision 'docker'

我简化了您的Vagrantfile

VAGRANTFILE_API_VERSION = '2'

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

  if Vagrant.has_plugin?('vagrant-proxyconf')
    config.proxy.http     = 'http://proxy:8080/'
    config.proxy.https    = 'http://proxy:8080/'
    config.proxy.no_proxy = 'localhost,127.0.0.1'
  end

  config.vm.synced_folder '.', '/var/local/app'

  # Ubuntu
  config.vm.box = 'precise64'
  config.vm.box_url = 'http://files.vagrantup.com/precise64.box'

  # If you use RHEL write to /etc/sysconfig/docker
  config_proxy = 'echo export http_proxy=$http_proxy >> /etc/default/docker'
  config.vm.provision('shell',
                      inline: config_proxy)
  config.vm.provision 'docker' do |d|
    d.build_image '/var/local/app/webApp',      args: '-t sapvagrant/web_app'
    d.build_image '/var/local/app/nodeService', args: '-t sapvagrant/node'
    d.run 'sapvagrant/node',    args: '--name node'
    d.run 'sapvagrant/web_app', args: '-P -p 49166:80 --name web --link node:db'
  end
end

使用docker安装的VM框

如果没有安装docker,Vagrant-proxyconf不会配置代理。如果您使用docker安装的VM框,Vagrant-proxyconf将配置代理。

  • 注意:
    • Vagrant-proxyconf 1.4.0总是重启docker,所以有时docker容器可能会被破坏。
    • Vagrant-proxyconf 1.4.2(2014年12月22日未发布)仅在代理配置发生变化时重新启动docker。

您可以在ATLAS上找到docker安装的VM盒。我找到了jess / ubuntu-precise-nginx-docker。

我简化了您的Vagrantfile

VAGRANTFILE_API_VERSION = '2'

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

  if Vagrant.has_plugin?('vagrant-proxyconf')
    config.proxy.http     = 'http://proxy:8080/'
    config.proxy.https    = 'http://proxy:8080/'
    config.proxy.no_proxy = 'localhost,127.0.0.1'
  end

  config.vm.synced_folder '.', '/var/local/app'

  # Ubuntu
  config.vm.box = 'jess/ubuntu-precise-nginx-docker'

  config.vm.provision 'docker' do |d|
    d.build_image '/var/local/app/webApp',      args: '-t sapvagrant/web_app'
    d.build_image '/var/local/app/nodeService', args: '-t sapvagrant/node'
    d.run 'sapvagrant/node',    args: '--name node'
    d.run 'sapvagrant/web_app', args: '-P -p 49166:80 --name web --link node:db'
  end
end