在 Docker Machine 中使用 Mirror 服务

Docker Machine 是 Docker 官方推出用来取代原来 boot2docker 的工具,其实我感觉就是把原来的 boot2docker 再次包装了一层?给了一个统一化的管理方式,但是这下问题来了,原来我们使用的 DaoCloud 的加速器服务在这里该怎么使用了呢?

先看了下docker-machine的大概操作,里面有个

ssh			Log into or run a command on a machine with SSH.

可以提供一个交互式的 shell,但是坑就在这里,即使你登上去在/var/lib/boot2docker/profile里修改了EXTRA_ARGS结果你运行了

docker-machine restart default
docker-machine env default

之后,整个文件就会被还原……简单的上 GDB 下断看了下调用栈发现是 ConfigureAuth 调用了 GenerateDockerOptions 所导致的问题……但是为啥会调用 ConfigureAuth 就不清楚了噜,不懂 Go 怎么调源码_(:з」∠)_

那应该是使用的逻辑不一样了,docker-machine的逻辑是每次重启一个 VM 然后设置环境时都会被还原到初始化的状态,所以按照设计者的逻辑而言需要你在create的时候就指定--engine-registry-mirror

那么跟着官方文档我们新建一个 VM 的时候就像是这样:

docker-machine create -d virtualbox --engine-registry-mirror http://********.m.daocloud.io dev

然后等新建完成后用docker-machine env dev啥的切换你使用的docker的后端。

那么问题又来了,有没有办法修改已存在 VM 的--engine-registry-mirror呢?

答案是坑定的,你需要人为地修改这个文件~/.docker/machine/machines/default/config.json,找到里面有个RegistryMirror字段,是个 list,大概就插入你的镜像地址"http://********.m.daocloud.io",然后再重启你就会在/var/lib/boot2docker/profile看见一个--registry-mirror http://********.m.daocloud.io了。

但是为啥我用了 Mirror docker pull debian的时候还是从docker.io上下 image 呢?

我也不知道发生了啥:

time="2015-08-17T08:40:58.129505060Z" level=debug msg="Trying to pull debian from http://********.m.daocloud.io/ v2" 
time="2015-08-17T08:40:58.838492184Z" level=debug msg="Pulling tag from V2 registry: \"latest\"" 
time="2015-08-17T08:40:58.953815999Z" level=debug msg="Error trying v2 registry: Error parsing HTTP response: invalid character '<' looking for beginning of value: \"<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 3.2 Final//EN\\\">\\n<title>404 Not Found</title>\\n<h1>Not Found</h1>\\n<p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>\\n\"" 
time="2015-08-17T08:40:58.953885554Z" level=debug msg="Trying to pull debian from https://registry-1.docker.io v2" 

在访问http://********.m.daocloud.io/v2时出现了 404,然后 docker 就往官方源上找了噜(╯‵□′)╯︵┻━┻。