自建Docker私有仓库如何设置镜像公开?拉取免登录、推送需认证
绝对可以实现!你想要的这种「匿名拉取+认证推送」的权限模型,不管是用官方Docker Registry还是更易用的企业级工具都能搞定,下面给你两种具体的实现方案:
方案一:官方Docker Registry原生配置(轻量型)
官方Docker Registry v2版本支持通过配置文件实现匿名拉取、认证推送的规则,步骤如下:
创建认证用户库
首先用htpasswd工具生成用户密码文件(如果系统没装,先安装apache2-utils包):htpasswd -Bc /opt/registry/htpasswd admin执行后输入密码,就会在
/opt/registry/下生成包含认证用户的htpasswd文件。编写Registry配置文件
创建/opt/registry/config.yml,内容如下:version: 0.1 log: fields: service: registry storage: filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] auth: htpasswd: realm: Registry Realm path: /etc/docker/registry/htpasswd middleware: registry: - name: authorization options: access: repository: pull: ["*"] # 允许所有用户(包括匿名)拉取 push: ["authenticated"] # 仅认证用户可推送核心是
middleware里的权限规则,明确拉取开放给所有人,推送仅限已认证用户。启动Registry容器
挂载配置文件、密码文件和镜像存储目录,启动容器:docker run -d -p 5000:5000 \ --name private-registry \ -v /opt/registry/data:/var/lib/registry \ -v /opt/registry/config.yml:/etc/docker/registry/config.yml \ -v /opt/registry/htpasswd:/etc/docker/registry/htpasswd \ registry:2测试验证
- 拉取测试:内网用户无需登录,直接执行
docker pull your-registry-ip:5000/your-image:tag,应该能成功拉取。 - 推送测试:未登录时执行
docker push your-registry-ip:5000/your-image:tag会报错,必须先执行docker login your-registry-ip:5000输入账号密码,才能推送成功。
- 拉取测试:内网用户无需登录,直接执行
方案二:用Harbor实现可视化的公开镜像管理(企业级)
如果需要更直观的UI管理、多项目隔离或更精细化的权限,推荐用VMware开源的Harbor仓库,它原生支持「公开项目」功能,步骤更简单:
部署Harbor
下载Harbor安装包,修改harbor.yml配置文件(设置内网访问地址、admin密码等),然后执行install.sh完成部署(过程很简单,跟着提示走就行)。创建公开项目
登录Harbor的Web UI,点击「新建项目」:- 填写项目名称,勾选「公开项目」选项(这个选项开启后,所有用户包括匿名用户都能拉取该项目下的镜像)。
- 项目创建后,你可以给特定用户分配「开发者」或「管理员」角色,只有这些角色的用户才能推送镜像到该项目。
测试验证
- 拉取测试:内网用户无需登录,直接执行
docker pull harbor-ip/your-public-project/your-image:tag即可拉取。 - 推送测试:未登录时推送会失败,登录Harbor后,只有拥有项目推送权限的用户才能执行
docker push harbor-ip/your-public-project/your-image:tag。
- 拉取测试:内网用户无需登录,直接执行
内容的提问来源于stack exchange,提问作者singhspk




