You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为私有Docker Registry设置账号密码及构建时配置认证

为私有Docker Registry配置认证及在Dockerfile/docker-compose中使用的方法

没问题,我来一步步帮你搞定这个事儿:

一、给私有Registry开启用户名密码认证

你之前跑的是无认证的Registry容器,得先调整配置加入认证机制:

  1. 停止并移除现有Registry容器(如果还在运行的话):
docker stop registry && docker rm registry
  1. 创建认证文件存储目录
mkdir -p auth
  1. 生成用户认证文件
    我们用htpasswd工具生成安全的认证记录(Debian/Ubuntu系统先装apache2-utils,RHEL/CentOS装httpd-tools)。替换your-username为你要设置的用户名,执行后按提示输入密码:
htpasswd -Bc auth/htpasswd your-username
  • -B:用bcrypt加密密码(比默认加密方式更安全)
  • -c:创建新文件(如果要添加第二个用户,去掉-c即可)
  1. 重新启动带认证的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,推荐两种安全方式:

  1. build前自动登录:在CI脚本里先执行登录命令(把用户名密码作为环境变量传入,避免硬编码):
    docker login localhost:5000 -u $REGISTRY_USER -p $REGISTRY_PASS
    docker build -t my-image .
    
  2. 用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 .
      

四、在docker-compose中配置认证

场景1:拉取私有仓库的镜像运行

如果你的docker-compose.yml里的服务使用私有仓库的镜像(比如image: localhost:5000/my-service:latest),只要主机已经登录过私有仓库docker-compose up会自动读取config.json里的认证信息,直接启动服务就行。

场景2:CI环境或未登录主机上运行

如果不想手动登录,可以通过环境变量自动完成:

  1. 创建.env文件,存储认证信息(注意不要把这个文件提交到代码仓库):
    REGISTRY_USER=your-username
    REGISTRY_PASS=your-password
    REGISTRY_URL=localhost:5000
    
  2. 在执行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

火山引擎 最新活动