Vernlium/vernlium.github.io

docker私有镜像仓库搭建

Opened this issue · 0 comments


title: docker镜像仓库的安装-k8s_2
date: 2017-08-14 21:13:24
tags:

简介

镜像仓库是存储镜像和分发镜像的系统。docker的使用离不开镜像仓库。当前最大的镜像仓库是dockerhub,这里面包含了很多镜像,比如各大常用软件的镜像,如nginx/ubuntu/mysql/redis等,还有很多个人开发者制作的镜像,或者是完全新的镜像或者是在现有镜像基础上开发的特殊需求的镜像等。

有时候开发者可能需要进行测试或者涉及安全问题不想把镜像流传到外网,这时就需要自己搭建私有镜像仓库,只能在自己到内网中访问。

下面就来讲一下私有镜像仓库如何搭建。

安装

本安装指导使用到操作系统是Ubuntu 14.04。

下面我们安装一个域名为vernlium.com的镜像仓库。

环境检查

我们到镜像仓库是以docker容器到方式启动到,所以需要安装docker。

apt-get install docker-engine

另外,安装过程中需要用到except软件,所以安装前需要检查此软件是否已安装,没安装到进行安装。

#检查是否安装except

#安装except
apt-get install except

证书生成

expect -c "
set timeout 300
spawn openssl req -newkey rsa:2048 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt
expect {
    \"Country Name *\" {send \"CN\r\";exp_coutinue}
    \"State or Province Name*\" {send \"JS\r\";exp_coutinue}
    \"Locality Name *\" {send \"NJ\r\";exp_coutinue}
    \"Organization Name *\" {send \"HW\r\";exp_coutinue}
    \"Organiztional Unit Name *\" {send \"DW\r\";exp_coutinue}
    \"Common Name *\" {send \"vernlium.com:5005\r\";exp_coutinue}
    \"Email Address *\" {send \"zhanganan0425@163.com\r\"}
}
expect eof;
"

执行完上述命令后,会在执行脚本的目录下certs下生成两个文件:domain.crt和domain.key,这个是证书文件和私钥文件。

这个证书在K8S安装时需要用到。

生成认证文件

镜像仓库容器启动

使用如下命令启动

docker run -d -ti \
  -p 5005:5000 \
  --restart=always \
  --name registry \
  --log-opt max-size=50m \
  -v /etc/localtime:/etc/localtime:ro \
  -v `pwd`/auth:/auth \
  -v /var/lib/docker/registry:/var/lib/registry \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v `pwd`/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry

命令中挂载来三个文件夹,其作用为:

  • auth: 认证信息
  • certs: 证书信息
  • /var/lib/docker/registry: 存放镜像文件到目录,如果镜像比较多且单个镜像比较大到话,这个文件夹到磁盘空间需要比较大。

连接到镜像仓库

镜像仓库搭建完成后,如何让一个机器连接到此镜像仓库从此镜像仓库拉取镜像和向此镜像仓库推送镜像呢?

  • /etc/hosts文件中添加镜像仓库域名对应的ip: vernlium.com 100.120.45.26
  • 证书:新建目录:/etc/docker/certs.d/vernlium.com\:5005/,将镜像仓库安装过程中生成的docker.crt拷贝到此文件夹下;
  • 密码文件,在文件/root/.docker/config.json文件中添加如下内容:
{
    “auth”:{
            "vernlium.com:5005":{
                   "auth":"dGVzdDphbmFu"
    }
}

其中:那一串字符是userName:passwd的base64加密后密文,可使用浏览器进行加密。

Chrome在任意页面,按F12,切到Console页签,使用如下方式加密:

image

上述操作完成后,执行'docker login vernlium.com:5000',按照提示输入镜像仓库的用户名(一般会给出默认值,就是config.json文件中配的)和密码,如果配置都正确的话,则显示:Login Successed

镜像仓库的使用

获取镜像列表

命令方式

命令方式只能在镜像仓库到机器上执行才行,其原理就是遍历存放镜像文件到目录,获取所有到镜像。

api方式

镜像仓库提供来一些api接口可以来查询镜像列表。可以通过浏览器或者其他api工具如postman等进行访问。

find /var/lib/docker/registry/ -print | grep 'v2/repositories' | grep 'current' | grep -v 'link' | sed -e 's/\/_manifests\/tags\//:/' | sed -e 's/\/current//' | sed -e 's/^.*repositories/vernlium.con:5005/' | sort
获取镜像列表
GET https://registry_ip:5005/v2/_catalog
获取单个镜像到tag列表
GET https://registry_ip:5005/v2/<name>/tags/list
删除镜像
DELETE https://registry_ip:5005/v2/<name>/manifests/<reference>

镜像仓库的清理

我们都知道docker镜像是以层的形式组织的,而镜像仓库提供的删除镜像的能力只是删除镜像的tag,而非真正的删除镜像的层文件。那么镜像仓库使用一段时间后,就会产生很多废弃的层文件,如何清理这些文件呢?镜像仓库提供了GC能力,就是清理无用的镜像层文件。

执行如下命令进行GC操作:

docker exec -it registry /bin/registry garbage-collect [--dry-run] /etc/docker/registry/config.yml

其中:
--dry-run 参数可选,加上此参数表示:运行GC列出可GC的文件列表,并不真正的进行GC,而不加此参数则表示直接进行GC操作。

参考

http://blog.csdn.net/ztsinghua/article/details/51496658