企业代理下如何使用docker-machine

32

我正在尝试使用docker-machine在企业http代理后面的私有云(Openstack)上创建实例。

是否可以告诉docker-machine使用代理,还是我需要一个已经预先配置了http_proxy环境变量的glance镜像?


这应该能解决你的问题。 https://github.com/docker/machine/blob/8f82b762749bb8dcf52c6dd0774b927510c5e885/docs/reference/create.md - BMW
确实是这样。我认为它是在v0.4.0中添加的,在v0.3.0中不可用,谢谢。你想把它发布为答案,这样我就可以接受它了吗? - eighilaza
6个回答

38

如先前提到的,您可以编辑该文件,位于

$HOME\.docker\machine\machines\default\config.json

并设置HTTP_PROXY、HTTPS_PROXY和NO_PROXY变量(或删除它们):

 "HostOptions": {
        "Driver": "",
        ...
        "EngineOptions": {
           ...
            "Env": [
              "HTTP_PROXY=http://10.121.8.110:8080",
              "HTTPS_PROXY=http://10.121.8.110:8080",
              "NO_PROXY=192.168.23.4"
            ],

文件编辑完成后,只需执行以下命令:

docker-machine provision 

这适用于引擎,例如需要拉取图像。 - lanoxx
1
如果当前没有默认的预配,并且$HOME.docker\machine\内没有“machines”文件夹,那该怎么办? - Nikhil VJ

28

目前的Docker Machine版本中,我找不到比在boot2docker中进行更改的更好方法(Docker/Boot2Docker: Set HTTP/HTTPS proxies for docker on OS X

如果你在Docker Machine中手动设置代理,将其配置在 /var/lib/boot2docker/profile 中,在重启后,代理设置将被自动删除。

因此,我必须使用 --engine-env 在 Docker Machine 中创建代理。

docker-machine create -d virtualbox \
    --engine-env HTTP_PROXY=http://example.com:8080 \
    --engine-env HTTPS_PROXY=https://example.com:8080 \
    --engine-env NO_PROXY=example2.com \
    proxybox

注意:

这是两年前的回答,Docker 发生了很多变化,所以如果你仍然无法在代理后面使用它,请阅读@Senri's answer以及其他答案。

文档:创建 Docker Machine


2
如果您正在使用类似于CNTLM之类的工具在主机上创建代理,那么您需要将虚拟机的代理设置为http://10.0.2.2:<主机代理端口>(请参见此问题)。 - Nat Knight
1
仅仅编辑/var/lib/boot2docker/profile对我来说没有用。@Senri的解决方案可行。 - netmikey
合理的,Docker 的更新每天都在发生,我们无法及时跟上所有的变化,我将删除更新部分。 - BMW

5

可以修改现有的docker-machine配置以添加代理环境。在$HOME/.docker/machine/machines//.config.json中编辑config.json。

在config.json的Env中添加"HTTP_PROXY=http://example.com:8080"。重新启动机器,就可以了。


3
如果您已经创建了虚拟机(VM),您可以像这样配置代理: ```html

如果您已经创建了虚拟机(VM),您可以像这样配置代理:

```
1- SSH into the docker dev host: docker-machine ssh dev
2- Add the following lines to /var/lib/boot2docker/profile (this file is read-only, use sudo)
    export HTTP_PROXY=http://<proxy>:<port>
    export HTTPS_PROXY=http://<proxy>:<port>
3- Exit the ssh session and restart the docker machine: docker-machine restart dev 

Source


这对我有用!!!... 我尝试了上面的方法,但它对我不起作用... 我不知道为什么。 - Meiyappan Kannappa

3

从Docker 18.09开始,我们可以像以下命令一样在命令行中为容器指定环境变量(如代理):

docker run --env HTTP_PROXY="172.10.13.14" -it myImage:latest /bin/bash

此外,我们还可以通过将这些设置写入~/.docker/config.json文件来为Docker客户端指定它们:

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://127.0.0.1:3001",
     "noProxy": "*.test.example.com,.example2.com"
   }
 }
}

更多信息可在文档中获得。

1
这似乎只影响新启动的容器,但对引擎本身没有影响。 - lanoxx

0
如果Docker机器在公司代理后面:
Linux(Ubuntu,Debian):
sudo mkdir -p /etc/systemd/system/docker.service.d
cd /etc/systemd/system/docker.service.d/
sudo touch http-proxy.conf
sudo nano http-proxy.conf

# copy and paste in the file:
[Service] 
Environment="HTTP_PROXY=http://<PROXYIP>:3128"
Environment="HTTPS_PROXY=http://<PROXYIP>:3128"
Environment="NO_PROXY=localhost,192.168.1.0/16,10.*.*.*" 

sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl show --property=Environment docker

Windows:

使用Powershell更新环境变量(具有管理员权限):

[Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://<PROXYIP>:3128", [EnvironmentVariableTarget]::Machine)
[Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://<PROXYIP>:3128", [EnvironmentVariableTarget]::Machine)
[Environment]::SetEnvironmentVariable("NO_PROXY", "192.168.*.*, 172.24.*.*, 172.25.*.*, 10.*.*.*, localhost, 127.0.0.1, 0.0.0.0/8", [EnvironmentVariableTarget]::Machine)
Restart-Service docker

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