企业代理背后的 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 start 或 stop。
主机和代理: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_PROXY、HTTPS_PROXY 和 NO_PROXY 环境变量(您可能已经拥有它们,并且它们可以被 Virtual Box 用来检测新版本的 Virtual Box)
- 您的 Tiny Core 主机必须设置
http_proxy、https_proxy 和 no_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