在Docker中使用代理

我们常常会因为下面这些原因需要使用代理:

  • 本机本身访问网络需要经过代理
  • 本地访问Docker Hub过慢需要加速

而Docker本身又是由服务端与客户端构成

作用 使用代理
Docker客户端 用于连接服务端 向服务端发送指令及本地数据 设置代理则会通过代理与服务端进行连接
当我们docker服务端和客户端并不在同一设备上时 docker 使用 https 进行通信,而docker客户端是可能会受到http_proxy、 https_proxy环境变量影响的。可能的原因因为Docker客户端版本不同或者其他原因造成有时会影响有时不会影响

如果在客户端的命令行设置了 http_proxy、 https_proxy 之后,客户端会通过代理链接服务端,此时,如果代理不可到达服务器(比如OSX中docker服务端在本地的虚拟机中,使用Host-only方式与本机链接,如果使用的代理并非本机,则代理无法到达本地虚拟机种的docker服务端),则会导致docker命令无法连上服务端。
在这种情况下,在需要使用docker命令的命令行环境,需要 unset http_proxy 、https_proxy 确保客户端直接与服务端进行连接。

Docker服务端 Docker的执行进程 对外提供接口
执行收到的命令(包含实际访问Docker Registry、Docker Hub)
通过代理进行对应的网络请求
在Bash运行环境中设置的 http_proxy、 https_proxy、 no_proxy docker的服务端并不能识别 参考 Github Issue #402 Using Docker behind a firewall。

 

 

Docker服务端设置代理(加速)

1. 给Docker配置代理

在启动Docker服务端的命令行前直接加入: HTTP_PROXY=server:port

例如直接启动时使用:
sudo HTTP_PROXY=server:port docker -d &

或者在docker的服务启动文件(如:/usr/local/etc/init.d/docker)找到
/usr/local/bin/docker -d,在前面加入 HTTP_PROXY=server:port

2. 使用Daocloud加速器

如果Docker服务器并不需要代理来访问外部网络,仅仅是访问 Docker Hub 过慢的话,还可以考虑 DaoCloud 提供的 Mirror加速器。具体参见:https://dashboard.daocloud.io/mirror

使用 Docker Machine 取代 Boot2Docker 在 OSX 中使用 Docker

原先,我们使用Boot2Docker在OSX下管理Docker。在Docker发布了 Toolbox 之后,新增了 Docker Machine 命令行。通过 docker-machine ,可以让我们以一致化的命令在本地或者云计算上创建 docker 服务。同时很方便的切换 docker 命令对应的目标服务器。

一、安装 Docker Toolbox

Docker Toolbox 安装包包含了:
docker 客户端
docker-machine 工具
docker-compose 工具
Kitematic 一个Docker的GUI

我们可以在 官网 或者 DaoCloud 镜像 下载并安装。

二、将Boot2Docker迁移到Docker Machine

如果原先并没有使用Boot2Docker,可以直接忽略

使用命令:
docker-machine create -d virtualbox –virtualbox-import-boot2docker-vm boot2docker-vm dev
-d virtualbox
使用virtualbox驱动
–virtualbox-import-boot2docker-vm boot2docker-vm
导入virtualbox中boot2docker的vm boot2docker原先在virtualbox创建的虚拟机名字为 boot2docker-vm
dev
可以根据自己需要设置 docker-machine 中的机器名

三、Docker Machine 使用

1. 创建一台新的 Docker Machine

docker-machine create –driver virtualbox default
–driver virtualbox
本机使用的话 使用virtualbox驱动
driver 还可以是amazonec2, azure, digitalocean, exoscale, generic, google, openstack, rackspace, softlayer, virtualbox, vmwarefusion, vmwarevcloudair, vmwarevsphere 等 配置对应的秘钥和参数后 可以直接在云服务中创建设备
default
docker-machine 中的机器名 之后的管理命令均使用该名称

2. 设置环境变量

在创建好 Docker Machine 之后,需要让本地的 docker 客户端了解需要连接的 docker 目标服务器地址,或者在不同的docker服务器之间切换,因此需要设置环境变量。

eval “$(docker-machine env default)”
–driver virtualbox
default
之前创建的machine的名称

3. 使用docker客户端管理docker

当我们将环境变量配置完成之后,我们就可以在本地操作docker一下,使用docker命令管理docker设备了

三、Docker Machine 管理

docker machine 提供了一系列命令来管理对应的docker设备

以下是 boot2docker 与 docker-machine 命令的对照表 使用 docker-machine 时 最后都需要跟上对应的设备名称

boot2docker docker-machine docker-machine description
init create 创建新的docker主机
up start 启动一个关闭的主机
ssh ssh 通过ssh连接到对应的docker主机
save –
down stop 关闭正在运行时的主机
poweroff stop 关闭正在运行时的主机
reset restart 重启正在运行的主机
config inspect 获取主机的参数配置信息
status ls 列出所有主机及其状态
info inspect 获取主机的参数配置信息
ip ip 获取主机的IP地址
shellinit env 设置主机的环境变量
delete rm 删除主机
download –
upgrade upgrade 将主机的docker客户端更新到最新版本