系统环境

操作系统:CentOS 7.9

docker-compose version:1.29.1

registry部署

使用Docker Registry部署仓库,并使用klausmeyer/docker-registry-browser部署可视化仓库管理。

生成密码文件

可参考文章【htpasswd密码文件生成】生成,并将密码文件放在目录./auth中用于映射到容器中。

容器部署

使用docker-compose方式进行部署,需提前创建名为app_network的docker桥接网络。

version: "3"

services:
  registry:
    image: registry:2.8.2
    container_name: registry
    restart: always
    volumes:
      - ./data/registry:/var/lib/registry
      - ./auth:/auth
      # 配合下方:开启TLS时使用,为访问域名SSL证书文件,也是下方PUBLIC_REGISTRY_URL的域名SSL证书文件
#      - /path/xxx/cert:/cert
    ports:
      - "6001:5000"
    environment:
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
      # 配置需要验权,读取密码文件
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      # 如果开启,需要nginx配置转发时到https://localhost...
#      REGISTRY_HTTP_TLS_CERTIFICATE: /cert/server.crt
#      REGISTRY_HTTP_TLS_KEY: /cert/server.key
      TZ: Asia/Shanghai
    networks:
      - app_network

  registry-ui:
    image: klausmeyer/docker-registry-browser
    container_name: registry-ui
    restart: always
    ports:
      - "6101:8080"
    environment:
      - DOCKER_REGISTRY_URL=http://registry:5000/v2
      # 复制PULL命令的地址,改为自己的IP/域名和宿主机端口号
      - PUBLIC_REGISTRY_URL=xxx.xxx.com
      # 改为自己的密钥
      - SECRET_KEY_BASE=123456
      # 是否显示删除镜像按钮
      - ENABLE_DELETE_IMAGES=true
    networks:
      - app_network

networks:
  app_network:
    external: true

此时可通过编辑Docker配置,增加 "insecure-registries" ,将私有仓库地址添加到信任列表。

# 编辑Docker配置
vim /etc/docker/daemon.json
{
    "insecure-registries": [
        "IP:6001"
    ]
}

# 重启服务
systemctl restart docker

配置后可通过IP进行仓库的访问和操作。

# 登录(有鉴权的话)
docker login -u 用户名 -p 密码 IP:6001

# 镜像推送到私有仓库
docker push IP:6001/镜像:latest

可通过浏览器访问IP:6101可视化查看仓库文件。

域名SSL

可参考文章【自签名SSL证书】生成证书,用于多服务器间使用SSL域名进行访问registry。(也可以直接使用机构签发证书或者ALLinSSL可跳过此步骤直接使用域名访问)

# 创建域名目录,替换xxx.xxx.com为实际域名
sudo mkdir -p /etc/docker/certs.d/xxx.xxx.com

# 复制证书文件到域名目录
sudo cp server.crt /etc/docker/certs.d/xxx.xxx.com/server.crt
sudo cp server.key /etc/docker/certs.d/xxx.xxx.com/server.key

# 配置registry使用SSL时,需要该文件
sudo cp /etc/docker/certs.d/xxx.xxx.com/server.crt /etc/docker/certs.d/xxx.xxx.com/server.cert

# 重启以保证生效
sudo systemctl restart docker

将以上文件同步到其他服务器即可在其他服务器上通过域名操作镜像仓库。

配置说明:

  1. /etc/docker/certs.d/Docker 守护进程(daemon) 用来查找 私有容器镜像仓库(Private Container Registry)TLS/SSL 证书 的标准目录。

  2. 它的主要作用是在 Docker 客户端(docker pull, docker push, docker login 等命令)与一个使用 HTTPS 但使用自签名证书或由私有证书颁发机构(CA)签名的证书的私有镜像仓库通信时,告诉 Docker 信任哪个证书。

  3. 该目录下包含以镜像仓库服务器地址(通常是域名或 IP 地址)命名的子目录,通常还会带上端口号(如果仓库不使用标准的 443 端口)。如:/etc/docker/certs.d/xxx.xxx.com。

  4. 在每个以仓库地址命名的子目录下,你需要放置证书文件。关键文件是:ca.crt。client.cert 和 client.key是可选的,仅在私有仓库需要客户端证书认证(双向 TLS) 时才需要提供。client.cert 是客户端的证书,client.key 是客户端的私钥。

配置后可通过域名进行仓库的访问和操作。

# 登录(有鉴权的话)
docker login -u 用户名 -p 密码 域名xxx.xxx.com

# 镜像推送到私有仓库
docker push 域名xxx.xxx.com/镜像:latest