如何让Docker在公司防火墙后的Windows系统上运行?

我试图得到一个工作docker安装以下教程: http : //docs.docker.io/en/latest/installation/windows/

到目前为止,我得到的虚拟机运行一个手动下载的存储库(后面的github链接,并下载为zip,因为“git克隆”没有工作在我的公司代理,即使设置代理与“git conf –global http .proxy …“ – 它一直要求我authentication407,虽然我进入了我的用户&PW)。 现在我处于应该使用“docker run busybox echo hello world”(Section“Running Docker”)的状态。 当我这样做的时候,我首先被告知Docker没有安装(如教程的底部所示),然后,我用apt-get install docker得到它后,我得到“Segmentation Fault或者遇到严重错误。核心和堕落“。

现在做什么? 这是因为我没有使用git clone或者是docker安装有问题吗? 我读的地方,apt-get安装docker不安装我想要的docker,但一些GNOME的工具,我可以指定我的apt-request来获得正确的工具?

公司代理之后的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会话可以访问公司代理服务器后面的网络。
  • 在执行apt-get update/install并且键入docker build时,Dockerfiles能够在公司代理后面访问互联网。

安装和第一步

如果您是工作站的管理员,则可以在Windows上运行boot2docker安装 。
它目前来与:

  • 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

然后,一旦安装:

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

实际上,如果打开Virtual Box GUI,则可以看到虚拟机启动或停止,然后键入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的新版本)
  • 你的微型核心主机必须设置http_proxyhttps_proxyno_proxy (注意,在Linux环境下小写):
    • docker服务能够查询/加载图像(例如: docker search nginx )。
      如果没有设置,下一个dial tcp: lookup index.docker.io: no such host docker pull会给你一个dial tcp: lookup index.docker.io: no such host
      这被设置在一个新的文件/var/lib/boot2docker/profile :它是profile ,而不是.profile
    • /home/docker/.ashrc 帐户 (在/home/docker/.ashrc设置),如果需要执行任何其他需要访问互联网的命令( /home/docker/.ashrc除外)
    • 任何您将创建的Dockerfile (或下一个RUN apt-get update都会得到一个例如Could not resolve 'http.debian.net' )。
      这意味着您必须在任何需要访问互联网的RUN命令之前先添加ENV http_proxy http://...行。

一个好的no_proxy设置是:

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

(与“。 .company ”的公司的域名,内部网站)


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

另一点要明白的是, boot2docker使用微小的核心 ,一个微小的Linux发行版(.iso文件只有26 MB)。
而且Tiny Core不提供持久性 (除了一些技术文件夹):如果你用你所有的首选设置和别名来修改你的~/.ashrc …下一次boot2docker stop / boot2docker start会恢复一个原始的 Linux环境, 走了

您需要确保VirtualBox具有下载的Oracle_VM_VirtualBox_Extension_Pack并添加到Virtual Box / File / Settings / Extension /添加了Oracle_VM_VirtualBox_Extension_Pack-4.x.yy-zzzzz.vbox-extpack文件。

正如boot2docker中所记录的 ,您将可以访问(从您的Tiny Core ssh会话)到/c/Users/<yourLogin> (即%USERPROFILE%由Virtual Box共享)


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

最后要理解的是, 默认情况下没有端口被导出

  • 您的容器端口在您的Tiny Core主机中不可见(例如,为了将容器的80端口暴露于Linux会话的80端口,您必须使用-p 80:80
  • 您的微型Cort端口默认情况下不会从您的Virtual Box虚拟机中导出 :即使您的容器在Tiny Core内部可见,Windows浏览器也不会看到它: http : //127.0.0.1将不起作用“ 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" $* ,然后: – 如果Virtual boot2docker-vm '尚未启动,则使用vbm modifyvm – 如果Virtual boot2docker-vm ' 已经启动,则使用vbm controlvm

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

 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


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

为了方便使用boot2docker

  • 在Windows上创建一个文件夹%USERPROFILE%\prog\b2d
  • 在其中添加一个.profile (直接在Windows中,在%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返回的boot2docker 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修改。
    或者你实际上可以使用你最喜欢的编辑器(而不是vi )从Windows会话中编写和修改相同的文件(比如一些Dockerfile)

而所有这一切都是在企业防火墙的后面。


奖金:只有http

Tuan补充说 :

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

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