搭建docker私有仓库
最近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-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/