Docker Registry安装和应用小记

Docker Registry安装和应用小记

安装机器地址

1
master 172.16.147.129 master.bruce.com

获取registry官方镜像(此处选择tag为2的私有仓库版本)

1
2
# 此处选用的版本为 registry:2 的版本
docker pull registry:2

创建auth认证文件htpasswd

1
2
3
# 只是生成htpasswd文件,生成完成后容器就会退出
docker run --entrypoint htpasswd registry:2 -Bbn {username} {password} >> htpasswd
docker run --entrypoint htpasswd registry:2 -Bbn user password >> htpasswd

使用Docker Compose创建Docker Registry服务

准备docker registry yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# docker registry yml 文件
version: '2'
services:
registry:
image: registry:2
hostname: registry-test
ports:
- "5000:5000"
environment:
- TZ="Asia/Shanghai"
- "REGISTRY_AUTH=htpasswd"
- "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"
- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
volumes:
- /home/bruce/docker-registry/auth:/auth
- /home/bruce/docker-registry/registry:/var/lib/registry
restart: always

Docker Registry 目录树结构

1
2
3
4
5
docker-registry/
├── auth
│ └── htpasswd
├── docker-compose.yml
└── registry

Docker Registry 相关命令

1
2
3
4
5
6
7
8
9
10
# 启动服务docker(需要在 docker-compose.yml 文件所在目录运行)
docker-compose up -d
# 查看registry服务
docker-compose ps
# 停止registry服务
docker-compose kill registry
# 删除registry服务
docker-compose rm registry
# 进入容器查看registry信息
docker-compose exec registry sh

记录Docker Registry Server地址

http://master.bruce.com:5000

允许HTTP访问Docker Registry

1
2
3
4
5
# (若是较新的docker版本中 修改/etc/default/docker中的$DOCKER_OPTS 即可)
sudo vim /etc/systemd/system/multi-user.target.wants/docker.service
# 在ExecStart中增加--insecure-registry=master.bruce.com:5000参数,并应用新的配置
sudo systemctl daemon-reload
sudo systemctl restart docker

登录Docker Registry

1
2
3
docker login master.bruce.com:5000
# Username: user
# Password: password

测试向私有仓库推送、下载image

1
2
3
4
docker image tag myapp master.bruce.com:5000/myapp:v1
docker push master.bruce.com:5000/myapp:v1
docker rmi master.bruce.com:5000/myapp:v1
docker pull master.bruce.com:5000/myapp:v1

访问registry-api并查看仓库内的镜像信息

1
2
curl http://master.bruce.com:5000/v2/_catalog
# 更多api使用方式查看:https://docs.docker.com/registry/spec/api/

docker-registry在kubernetes上的应用

1
2
3
# 首先需要创建 docker-registry secret
# 然后在应用部署文件中的引用镜像 填入private docker registry 下的 image 地址即可
kubectl create secret docker-registry regsecret --docker-server={docker-reg-server} --docker-username={username} --docker-password={password} --docker-email={your-email-address} --namespace={namespace}

删除私有仓库内镜像信息

  • 在kubernetes的环境中使用docker registry,每次部署都会生成一个tag的docker image,长此以往,docker registry占用的硬盘会越来越大,而且其中无用的包占比特别高,所以在网上找到了一个使用python编写的脚本,用来定时清除无用的docker image,以释放硬盘空间节省资源。

Ref: https://github.com/burnettk/delete-docker-registry-image

安装 delete_docker_registry_image 脚本

1
2
curl https://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/delete_docker_registry_image.py | sudo tee /usr/local/bin/delete_docker_registry_image >/dev/null
sudo chmod a+x /usr/local/bin/delete_docker_registry_image

加入环境变量

1
2
3
4
# 注意!!! 
# 此处的地址为自己设置的docker registry所在地址,否则会使用默认地址。
# 使用默认地址导致使用脚本时会无法找到目录。
export REGISTRY_DATA_DIR=/home/bruce/docker-registry/registry/docker/registry/v2

测试删除

1
2
sudo delete_docker_registry_image --image {what image want to be deleted}
sudo delete_docker_registry_image --image test-myapps/app

注意点

  • 如果docker配置了代理,那么docker registry的仓库地址需要加入到/etc/systemd/system/docker.service.d/https-proxy.conf 中的NO_PROXY中去(如果系统挂了代理,最好也把仓库地址放到全局的.bashrc中的no_proxy中去,以防无法访问),否则在docker login时会无法登陆。
  • 当无法登陆私有仓库时,并找不到对应解决办法,systemctl restart docker 是最有效的解决办法

Thanks for watching!