【问题标题】:How do I get Docker to run on a Windows system behind a corporate firewall?如何让 Docker 在企业防火墙后面的 Windows 系统上运行?
【发布时间】:2013-12-10 08:31:08
【问题描述】:

我正在尝试按照本教程安装有效的 Docker: http://docs.docker.io/en/latest/installation/windows/

到目前为止,我使用手动下载的存储库运行虚拟机(按照 GitHub 链接并下载为 ZIP 文件,因为“git clone”在我的公司代理后面不起作用,即使在使用“设置代理”之后也是如此git conf --global http.proxy ..." - 尽管我输入了用户名和密码,但它一直要求我进行身份验证 407。

现在我处于应该使用“docker run busybox echo hello world”的状态(“运行 Docker”部分)。

当我这样做时,我首先被告知没有安装 Docker(如教程底部所示),然后,在我使用 apt-get install docker 得到它之后,我得到 "Segmentation Fault or critical遇到错误。转储核心并中止。"

我现在能做什么?这是因为我没有使用git clone 还是 Docker 安装有问题?我在某处读到,apt-get install docker 没有安装我想要的 Docker,而是安装了一些 GNOME 工具。我可以指定我的 apt-request 以获得正确的工具吗?

【问题讨论】:

  • 运行vagrant up后,运行vagrant provision。让我知道是否有任何错误。 vagrantfile/virtualbox 也需要互联网连接。
  • 我现在选择了相反的方式 - 在使用 Vagrant 设置 VM 后,我使用 VirtualBox 在自己的 shell 中启动它,并按照 Linux/Ubuntu-Tutorial 安装 lxc-docker,经过大量代理配置后,它终于运行良好。 Atm,我只是再次停留在应该使用“docker run busybox”(或任何其他存储库)的地方。虽然安装了 docker,但在拉取所需的存储库时连接超时,我猜这又是一个代理问题。
  • 如果您想在经过身份验证的代理后面使用 Git,您可以为您的代理设置一个带有 cache_peer 的 Squid,并将其用作您的 http.proxy

标签: windows git proxy docker


【解决方案1】:

企业代理背后的 Windows Boot2Docker

(上下文:2015 年 3 月,Windows 7,在公司代理之后)

TLDR;参见 GitHub 项目VonC/b2d

克隆它并:

  • env.bat.template之后配置..\env.bat
  • 在“profile”文件中添加您想要的别名,
  • 执行senv.bat,然后执行b2d.bat

然后,您将处于适当定制的 boot2docker 环境中:

  • 当您键入 docker search/pull 时,一个 ssh 会话能够通过公司代理访问 Internet。
  • 当 Dockerfile 执行 apt-get update/install 并且您键入 docker build 时,它们能够通过公司代理访问 Internet。

安装和第一步

如果您是工作站的管理员,则可以运行 boot2docker install on your Windows
它目前附带:

  • Boot2Docker 1.5.0(Docker v1.5.0、Linux v3.18.5)
  • Boot2Docker管理工具v1.5.0
  • VirtualBox v4.3.20-r96997
  • msysGit v1.9.5-preview20141217

然后,一旦安装:

  • 在您的%PATH% 中添加c:\path\to\Boot2Docker For Windows\
  • (一次):boot2docker init
  • boot2docker start
  • boot2docker ssh
  • 键入 exit 退出 ssh 会话,然后键入 boot2docker ssh 返回:您刚刚键入的命令的历史记录将被保留。
  • 如果你想关闭虚拟机,boot2docker stop

如果您打开 Virtual Box GUI,您实际上可以看到 VM 启动或停止,然后输入 DOS cmd 会话 boot2docker startstop


主机和代理:Windows => Boot2Docker => Docker 容器

要理解的要点是您将需要管理 2 个主机

  • 您的 Windows 工作站是 VirtualBox 运行的 Linux Tiny Core主机,以便您定义和运行容器
    (%HOME%\.boot2docker\boot2docker.iso =>
    .%USERPROFILE%\VirtualBox VMs\boot2docker-vm\boot2docker-vm.vmdk),
  • 您的 boot2docker Linux Tiny Core 是您将运行的容器宿主

代理而言,这意味着:

  • 您的 Windows 主机必须设置了它的 HTTP_PROXYHTTPS_PROXYNO_PROXY 环境变量(您可能已经拥有它们,并且它们可以被 Virtual Box 用来检测新版本的 Virtual Box)
  • 您的 Tiny Core 主机必须设置 http_proxyhttps_proxyno_proxy(注意大小写,在 Linux 环境中为小写):
    • docker 服务 能够查询/加载图像(例如:docker search nginx)。
      如果未设置,下一个docker pull 将为您提供dial tcp: lookup index.docker.io: no such host
      这是在新文件/var/lib/boot2docker/profile 中设置的:它是profile,而不是.profile
    • docker 帐户(在/home/docker/.ashrc 中设置),如果您需要执行任何其他需要互联网访问的命令(docker 除外)
    • 您将创建的任何 Dockerfile(或者下一个 RUN apt-get update 将为您提供一个,例如,Could not resolve 'http.debian.net')。
      这意味着您必须先添加行 ENV http_proxy http://...,然后再添加任何需要 Internet 访问权限的 RUN 命令。

一个好的no_proxy 设置是:

.company,.sock,localhost,127.0.0.1,::1,192.168.59.103

(带有'.company'贵公司的域名,用于内部网站)


数据持久化?使用文件夹共享

另外一点要理解的是,boot2docker 使用 Tiny Core,一个...微型 Linux 发行版(.iso 文件只有 26 MB)。
而且Tiny Core 不提供持久性(除了一些技术文件夹):如果您使用所有首选设置和别名修改您的~/.ashrc...下一个boot2docker stop / boot2docker start 将恢复一个原始的 Linux 环境,您的修改消失了

您需要确保VirtualBox已下载Oracle_VM_VirtualBox_Extension_Pack并将其添加到Virtual Box/文件/设置/扩展名/添加Oracle_VM_VirtualBox_Extension_Pack-4.x.yy-zzzzz.vbox-extpack文件中)。

作为documented in boot2docker,您将有权(从您的Tiny Core ssh 会话)访问/c/Users/<yourLogin>(即%USERPROFILE% 由Virtual Box 共享)


端口重定向?对于 VirtualBox VM 的容器

最后要理解的是默认不导出端口

  • 您的容器端口在 Tiny Core 主机上不可见(例如,您必须使用 -p 80:80 将容器的 80 端口暴露给 Linux 会话的 80 端口)
  • 您的 Tiny Cort 端口默认不会从您的 Virtual Box VM 导出:即使您的容器在 Tiny Core 中可见,您的 Windows 浏览器也不会看到它:http://127.0.0.1 won'工作“The connection was reset”。

对于第一点,docker run -it --rm --name my-apache-app -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4 中没有 -p 80:80 将无法工作。

对于第二点,定义一个别名doskey vbm="c:\Program Files\Oracle\VirtualBox\VBoxManage.exe" $*,然后: - 如果虚拟盒子“boot2docker-vm”尚未启动,则使用vbm modifyvm - 如果虚拟框“boot2docker-vm已经启动,则使用vbm controlvm

通常,如果我在 boot2docker 会话期间意识到无法从 Windows 访问端口 80:

vbm controlvm "boot2docker-vm" natpf1 "tcp-port80,tcp,,80,,80";
vbm controlvm "boot2docker-vm" natpf1 "udp-port80,udp,,80,,80";

然后,只有这样,我才能访问http://127.0.0.1


永久设置:复制到 docker 服务 docker 帐户

为了方便使用boot2docker

  • 在 Windows 上创建一个文件夹 %USERPROFILE%\prog\b2d
  • 在其中添加一个.profile(直接在Windows 中,in%USERPROFILE%\prog\b2d),并带有您的 设置和别名。

例如(我修改了原来的/home/docker/.ashrc):

# ~/.ashrc: Executed by SHells.
#
. /etc/init.d/tc-functions
if [ -n "$DISPLAY" ]
then
        `which editor >/dev/null` && EDITOR=editor || EDITOR=vi
else
        EDITOR=vi
fi
export EDITOR

# Alias definitions.
#
alias df='df -h'
alias du='du -h'

alias ls='ls -p'
alias ll='ls -l'
alias la='ls -la'

alias d='dmenu_run &'
alias ce='cd /etc/sysconfig/tcedir'

export HTTP_PROXY=http://<user>:<pwd>@proxy.company:80
export HTTPS_PROXY=http://<user>:<pwd>@proxy.company:80
export NO_PROXY=.company,.sock,localhost,127.0.0.1,::1,192.168.59.103

export http_proxy=http://<user>:<password>@proxy.company:80
export https_proxy=http://<user>:<password>@proxy.company:80
export no_proxy=.company,.sock,localhost,127.0.0.1,::1,192.168.59.103

alias l='ls -alrt'
alias h=history
alias cdd='cd /c/Users/<user>/prog/b2d'

ln -fs /c/Users/<user>/prog/b2d /home/docker

(192.168.59.103通常是boot2docker ip返回的ip)


将所有内容放在一起启动 boot2docker 会话:b2d.bat

  • 在您的%PATH% 中创建并添加一个b2d.bat 脚本,它将:
    • 开始boot2docker
    • docker 服务(已重新启动)和/home/docker 用户帐户复制正确的配置文件。
    • 启动交互式 ssh 会话

即:

doskey vbm="c:\Program Files\Oracle\VirtualBox\VBoxManage.exe" $*
boot2docker start
boot2docker ssh sudo cp -f /c/Users/<user>/prog/b2d/.profile /var/lib/boot2docker/profile
boot2docker ssh sudo /etc/init.d/docker restart
boot2docker ssh cp -f /c/Users/<user>/prog/b2d/.profile .ashrc
boot2docker ssh

要进入一个新的 boot2docker 会话,并根据需要完全定义您的设置,只需键入:

b2d

你很高兴:


最终结果:

  • docker search xxx 可以工作(它可以访问互联网)
  • 任何docker build 都可以工作(如果有ENV http_proxy 指令,它将访问互联网)
  • %USERPROFILE%\prog\b2d 中的任何 Windows 文件都可以直接从 ~/b2d 进行修改。
    或者,您实际上可以直接在 Windows 会话中使用您最喜欢的编辑器(而不是 vi)编写和修改这些相同的文件(例如一些 Dockerfile)

所有这一切都在公司防火墙之后。


奖励:仅限 http

Tuan 添加in the comments

也许我公司的代理不允许 https。这是我的解决方法:

  • boot2docker ssh,
    杀死 docker 进程并
  • 设置代理export http_proxy=http://proxy.com,然后
  • docker -d --insercure-registry docker.io启动docker

【讨论】:

  • @nwinkler 谢谢。我终于完全按照我的意愿设置了“docker 环境”,并且我开始定义我需要的不同图像。这在企业环境中是一项相当大的成就。
  • 我知道 - 在企业环境中工作也是如此 :-)
  • @VonC 我克隆了你的但仍然得到这个:来自守护进程的错误响应:获取index.docker.io/v1/search?q=bind:拨号 tcp 52.5.160.228:443:i/o 超时
  • @Tuan 这将取决于您的 env.bat 参数。你用的是什么版本的docker?
  • @VonC 我用的是最新的 1.7.0。我可以使用 wget 或 curl 获取 https://index.docker.io 内容,但不能使用 docker。
猜你喜欢
  • 2010-09-16
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多