企业内部通常会搭建私有镜像仓库。可以安装 Docker 的官方镜像 Registry。镜像名为 registry:3
或 registry:3.0.0
。
官方文档:https://distribution.github.io/distribution/about/deploying/
安装 Registry
docker run -d -p 5000:5000 --restart=always --name registry registry:3
使用 Registry
docker 默认只支持 HTTPS 协议的仓库,如使用 HTTP 协议,需配置 "insecure-registries":["http://localhost:5000"]
。
# 从 docker hub 官方拉取镜像
docker pull ubuntu:24.04
# Tag Image 标记镜像
docker tag ubuntu:24.04 localhost:5000/ubuntu:24.04
# Push Image 推送镜像
docker push localhost:5000/ubuntu:24.04
Registry 挂载存储卷
推送到 Registry 的镜像如果保存在容器内部,容器重启后,镜像数据将全部丢失。需要将存储路径挂载到容器外面,挂载路径是 /var/lib/registry
。
docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /mnt/registry:/var/lib/registry \
registry:3
Registry 权限认证
如果要将 Registry 放到公网上,需要加上权限认证,否则所有的人都可以向仓库推送镜像。加上权限认证后,需要登录才可以拉取和推送镜像。
Registry 的提供的认证非常基础,如需更高级的权限认证,可以使用 Harbor,拥有更高级的功能。
完成权限认证后,需要登录才可以推送和下载:
docker login myregistrydomain.com:5000
在 K8s 中使用镜像的容器,则需配置 Docker Secret。
生成密码文件
获取 htpasswd
密码文件。其中 testuser
是用户名,testpassword
是密码,可自行更改。
Linux 系统运行以下命令:
$ mkdir auth
$ docker run \
--entrypoint htpasswd \
httpd:2 -Bbn testuser testpassword > auth/htpasswd
Windows 系统运行以下命令(在 PowerShell 中运行,不能在 cmd 中运行,否则会提示 Set-Content 无法找到):
docker run --rm --entrypoint htpasswd httpd:2 -Bbn testuser testpassword | Set-Content -Encoding ASCII auth/htpasswd
挂载密码文件
将密码文件挂载到容器中:
-v ./auth:/auth
如果在 K8s 环境中,可将 htpasswd 内容配置到 ConfigMap 中,然后将文件挂载到容器 /auth/htpasswd
文件中。
配置环境变量
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
访问 Registry
如果需要查看 Registry 中有哪些镜像已经镜像有哪些版本,可以使用以下 API:
# 查看所有镜像
http://myregistrydomain.com:5000/v2/_catalog
# 查看 nginx 镜像的版本
http://myregistrydomain.com:5000/v2/nginx/tags/list