如何为私有Docker Registry设置账号密码及构建时配置认证
为私有Docker Registry配置认证及在Dockerfile/docker-compose中使用的方法
没问题,我来一步步帮你搞定这个事儿:
一、给私有Registry开启用户名密码认证
你之前跑的是无认证的Registry容器,得先调整配置加入认证机制:
- 停止并移除现有Registry容器(如果还在运行的话):
docker stop registry && docker rm registry
- 创建认证文件存储目录:
mkdir -p auth
- 生成用户认证文件:
我们用htpasswd工具生成安全的认证记录(Debian/Ubuntu系统先装apache2-utils,RHEL/CentOS装httpd-tools)。替换your-username为你要设置的用户名,执行后按提示输入密码:
htpasswd -Bc auth/htpasswd your-username
-B:用bcrypt加密密码(比默认加密方式更安全)-c:创建新文件(如果要添加第二个用户,去掉-c即可)
- 重新启动带认证的Registry容器:
docker run -itd \ --name registry \ --publish 5000:5000 \ --volume $(pwd)/auth:/auth \ --env REGISTRY_AUTH=htpasswd \ --env REGISTRY_AUTH_HTPASSWD_REALM="Private Registry" \ --env REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ registry
关键参数解释:
--volume $(pwd)/auth:/auth:把本地的认证目录挂载到容器内,让Registry能读取认证文件REGISTRY_AUTH=htpasswd:指定使用htpasswd认证方式REGISTRY_AUTH_HTPASSWD_REALM:登录时的提示文案,比如告诉用户这是私有仓库REGISTRY_AUTH_HTPASSWD_PATH:容器内认证文件的具体路径
现在你的私有仓库就需要用户名密码才能访问了,试试推送/拉取镜像,会自动提示你登录。
二、本地Docker客户端登录私有仓库
要让本地Docker能正常和私有仓库交互,先执行登录命令:
docker login localhost:5000
输入你刚才设置的用户名和密码,登录成功后,Docker会把认证信息存在~/.docker/config.json里,之后拉取/推送镜像就不用重复输入密码了。
三、在Dockerfile中使用私有仓库镜像
如果你的Dockerfile需要从私有仓库拉取基础镜像(比如FROM localhost:5000/my-base-image:latest),只要执行docker build的机器已经登录过私有仓库,Docker会自动读取config.json里的认证信息,直接build就行,不需要额外配置。
如果是在CI环境或者未登录的机器上build,推荐两种安全方式:
- build前自动登录:在CI脚本里先执行登录命令(把用户名密码作为环境变量传入,避免硬编码):
docker login localhost:5000 -u $REGISTRY_USER -p $REGISTRY_PASS docker build -t my-image . - 用Docker BuildKit的secret功能(更安全,避免密码暴露在命令行日志中):
- 首先在Dockerfile开头加上语法声明:
# syntax=docker/dockerfile:1.2 - 然后在需要访问私有仓库的步骤挂载认证secret:
FROM localhost:5000/my-base-image:latest # 如果后续步骤需要拉取私有仓库的其他镜像,挂载认证文件 RUN --mount=type=secret,id=registry_auth,dst=/root/.docker/config.json \ docker pull localhost:5000/another-image:latest - 执行build命令时传入本地的认证文件:
docker build --secret id=registry_auth,src=~/.docker/config.json .
- 首先在Dockerfile开头加上语法声明:
四、在docker-compose中配置认证
场景1:拉取私有仓库的镜像运行
如果你的docker-compose.yml里的服务使用私有仓库的镜像(比如image: localhost:5000/my-service:latest),只要主机已经登录过私有仓库,docker-compose up会自动读取config.json里的认证信息,直接启动服务就行。
场景2:CI环境或未登录主机上运行
如果不想手动登录,可以通过环境变量自动完成:
- 创建
.env文件,存储认证信息(注意不要把这个文件提交到代码仓库):REGISTRY_USER=your-username REGISTRY_PASS=your-password REGISTRY_URL=localhost:5000 - 在执行
docker-compose up前,先执行登录命令:docker login $REGISTRY_URL -u $REGISTRY_USER -p $REGISTRY_PASS docker-compose up -d
场景3:docker-compose build时使用私有基础镜像
和单独的docker build逻辑一致,要么提前登录主机,要么用secret功能。你可以在docker-compose.yml中配置secret挂载:
version: '3.8' services: my-service: build: context: . dockerfile: Dockerfile secrets: - registry_auth secrets: registry_auth: file: ~/.docker/config.json
然后在Dockerfile里用--mount挂载这个secret,就像之前BuildKit的例子一样。
内容的提问来源于stack exchange,提问作者Arun




