Docker是开源的应用容器引擎,能很好地支持DevOps中相当重要的云计算,为了搭建完整的应用级别的Docker环境,我们一起开始探索吧。
本篇知识点如下,将分为三部分来介绍:
Registry(本篇)
Shipyard
Docker Swarm
Registry(v2)
我们在真实应用场景中,有时会需要将自定义镜像存储起来的场景,特别是一些内网应用的系统,需要我们自建Docker仓库,这里我们选择官方提供的Registry(v2)镜像,并设置SSL,以及密码验证。
1. 证书及密钥
1.1 新建文件夹/registry/
1.2 复制SSL证书
1.2.1 生成并下载证书
需要与域名相匹配,否则会报错,这里使用的是腾讯云服务,使用TrustAsia生成的证书
1.2.2 解压
将.crt, .key两个文件重命名为domain.crt, domain.key,并复制到/registry/certs/文件夹中
1.3 生成密钥
1.3.1 在/registry/文件夹下创建/auth/文件夹
1.3.2 使用docker命令创建密钥
在/registry/文件夹下运行以下命令,将在 /auth/中生成一个用户名为testuser,密码为testpassword的密钥
docker run --entrypoint htpasswd registry:2 -Bbn testuser testpassword > auth/htpasswd
1.4 在/registry/下,新建/images/文件夹
1.5 在/registry/下,新建/config/文件夹
增加配置文件,config.yml,内容如下:
version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
1.6 检查
2. 下载registry镜像
2.1 下载镜像
(可选——强迫症专用)创建registry:2的镜像,运行 docker pull registry:2
3. 运行registry
3.1 在/registry/文件夹下运行以下命令
创建一个端口5000,指定证书与密钥的自动运行实例,所有上传到本仓库的镜像,保存在/images/文件夹中,注意需要在/registry/文件夹下,因为用到了相对路径
docker run -d -p 5000:5000 --restart=always --name registry \
-v `pwd`/auth:/auth \
-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 \
-e REGISTRY_STORAGE_DELETE_ENABLED=true \
-v `pwd`/images:/var/lib/registry \
-v `pwd`/config/config.yml:/etc/docker/registry/config.yml \
registry:2
3.2 检查
3.2.1 在其他机器上,使用生成的密钥进行登录
3.2.2登录后,查询本机镜像列表
3.2.3 对需要上传到仓库的镜像打上tag
3.2.4 上传至仓库
3.2.5 可以使用v2 API进行查看
在浏览器中打开 https://docker.xxx.cn:5000/v2/_catalog
输入用户名及密码后可以查看
4 验证
4.1 显示镜像列表
curl -X GET -u username:password https://docker.xxx.cn:5000/v2/_catalog
返回如下
{"repositories":["hello-world","nginx","registry","ubuntu","ubuntu/nginx"]}
4.2 显示指定镜像tag列表
curl -X GET -u username:password https://docker.xxx.cn:5000/v2/hello-world/tags/list
返回如下
{"name":"hello-world","tags":["latest”]}
4.3 显示指定镜像信息
curl -X GET -u username:password https://docker.xxx.cn:5000/v2/hello-world/manifests/latest
4.4 查询digest信息:
(注意,此处巨坑)
curl -H "Accept:application/vnd.docker.distribution.manifest.v2+json" GET -vvv -k -u username:password https://docker.xxx.cn:5000/v2/hello-world/manifests/latest
返回值中重要的信息是这一行中的Digest信息,这个是指定镜像Tag的信息,删除时会用到:
。。。
< Docker-Content-Digest:sha256:467af83b77759844196762fc8d9e981a0c3d4fa3c59d76445b7e35a6ee5ca916
。。。
4.5 删除镜像
curl -X DELETE -u username:password https://docker.xxx.cn:5000/v2/hello-world/manifests/sha256:467af83b77759844196762fc8d9e981a0c3d4fa3c59d76445b7e35a6ee5ca916
至此,一个私有的Docker仓库就被搭建出来了,并且可以使用命令进行操作,下一篇会介绍可视化工具Shipyard的搭建。
不喜欢使用命令的同学,可以在网上可以找一下web图形操作的镜像,下载前先了解一下是否支持registry v2版本。
我自己写了一个可以查询、删除镜像的简单web-ui(node, koa2, NG1.6, BS3),时间关系,未能做到完善,有兴趣的同学可以一起继续贡献代码 ^_^
https://github.com/JasonLiSZ/registry-web-ui