最近docker的image越来越小,好多docker image的体积一下子减少到之前的一半不到,docker的官方registry服务仓库上也能看到各个image的大小。 这使得docker的广泛应用在国内的应用有了不错的基础。如何搭建一个私有的docker registry用来存储docker镜像呢?下面做一个简单的总结。

##1.创建专门用于跑registry的docker machine: $docker-machine create –driver virtualbox docker $docker-machine ls $docker-machine env docker

##2.连接到docker machine:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.101:2376"
export DOCKER_CERT_PATH="/Users/davideuler/.docker/machine/machines/docker"
export DOCKER_MACHINE_NAME="docker"

##3.启动docker registry

$docker pull registry:2

参考:https://docs.docker.com/registry/deploying/

取到一个CA证书

假定你是myregistrydomain.com域名的所有者,而且这个域名的DNS指向了你运行registry服务的地址。首先你需要从一个CA提供商买到证书。

把证书文件重命名为: certs/domain.crt

key秘钥文件重命名为: certs/domain.key.

你也可以使用自签名的证书。

###使用自签名证书

自签名证书跟basic authentication一起使用时,也需要在运行docker的机器上信任签名的证书。 生成证书:

$mkdir -p certs && openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt

命令执行过程中,确保使用 myregistrydomain.com作为CN。

使用证书来启动启用TLS的registry。

docker run -d -p 5000:5000 --restart=always --name registry -v `pwd`/certs:/certs  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key  registry:2

然后需要让每一个docker进程信任签名的证书。把domain.crt文件拷贝到/etc/docker/certs.d/myregistrydomain.com:5000/ca.crt就可以让docker进程信任证书。需要重启docker。

#…. mkdir & wget domain.crt to /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt
# mkdir -p /etc/docker/certs.d/myregistrydomain.com:5000/
# wget http://192.168.99.1:8000/domain.crt -O /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt
#docker-machine ssh default
$sudo du
#ps aux|grep docker
#ps aux | grep "docker daemon" | awk '{print $2}' | xargs kill -9
#/usr/local/bin/docker daemon -D -g /var/lib/docker -H unix:// -H tcp://0.0.0.0:2376 --label provider=virtualbox --tlsverify --tlscacert=/var/lib/boot2docker/ca.pem --tlscert=/var/lib/boot2docker/server.pem --tlskey=/var/lib/boot2docker/server-key.pem -s aufs

##4.使用private registry

然后可以在已经把证书加入到信任列表的docker host中访问私有仓库:

docker pull ubuntu
docker tag ubuntu myregistrydomain.com:5000/ubuntu
docker push myregistrydomain.com:5000/ubuntu
docker pull myregistrydomain.com:5000/ubuntu

docker tag gliderlabs/consul-server docker.ihopeit.com:5000/gliderlabs/consul-server

##5.持久化docker中的配置文件 步骤3,docker-machine重启过后,/etc/docker/certs.d目录中的证书丢失。

由于docker-machine的系统是挂载在临时文件中的。/etc/docker是在临时目录中的。

/mnt/sda1是挂载的虚拟磁盘,只有虚拟磁盘中的文件会被保存。/var/lib/docker, /var/lib/boot2docker/目录下的文件会被保存。

docker file system

docker-machine启动时会自动运行 /var/lib/boot2docker/bootlocal.sh 文件。

参考:https://github.com/boot2docker/boot2docker/issues/347

可以这样来使得每次启动容器时,自动配置证书:

$docker-machine ssh default
$sudo tee /var/lib/boot2docker/bootlocal.sh << EOF >/dev/null
#!/bin/sh
mkdir -p /etc/docker/certs.d/docker.ihopeit.com:5000/
wget http://192.168.99.1/dcert/domain.crt -O /etc/docker/certs.d/docker.ihopeit.com:5000/ca.crt
EOF
$sudo chmod +x /var/lib/boot2docker/bootlocal.sh
$exit
$docker-machine restart default

##6.registry api curl https://docker.ihopeit.com:5000/v2/_catalog

/v2/name/tags/list, Fetch the tags under the repository identified by name. such:

curl https://docker.ihopeit.com:5000/v2/gogs/gogs/tags/list

/v2/name/manifests/