使用registry镜像构建Docker本地私人镜像仓库

背景

DockerHub上为我们提供了许多官方镜像,我们可以从DockerHub中上传或者下载镜像,但是:

  • 由于网络的限制,会导致镜像的上传和下载速度较慢;

  • 生产使用的镜像中包含了许多隐私信息,若放到DockerHub上容易被外部人员获取。

    为解决上述问题,官方提供了registry镜像,用于搭建本地私人镜像仓库,在内网中搭建Docker私有仓库可以让镜像仅允许内网人员下载,并且上传与下载速度也较快。

优点

  • 可限制外部人员访问
  • 上传下载速度快,不受外网带宽影响
  • 支持仓库认证
  • ...

环境

  • 10.0.95.63 主机(暂时使用个人电脑作为私人镜像仓库服务器)KFDockerRegistry

  • 统一使用5566端口

注意

上传:

  • 需先登录到私有仓库:docker login 10.0.95.63:5566,然后输入账号密码;
  • 上传的镜像名称前需有私有仓库标识:10.0.95.63:5566,如10.0.95.63:5566/nginx:latest
  • 上传完成后需注销登录:docker logout

下载:

  • 下载的镜像名称前需有私有仓库标识:10.0.95.63:5566,如10.0.95.63:5566/nginx:latest

搭建私有仓库

  1. 拉取私有仓库镜像

    docker pull registry
    复制代码
  2. 修改Docker配置

    修改daemon.json文件:vi /etc/docker/daemon.json,添加以下内容,用于让Docker信任私有仓库地址(==需要访问私有仓库的Docker客户端都需配置以下内容==):

    {
        "insecure-registries": [
            "10.0.95.63:5566"
        ]
    }
    复制代码

    若没有配置,则可能出现以下错误:

    X509: cannot validate certificate for 10.0.95.63 because it does not contain any IP SANs
    Get https://10.0.95.63:5566/v2/: http: server gave HTTP response to HTTPS client
    复制代码
  3. 重新加载配置以及重启Docker服务

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    复制代码
  4. 重启完成后,即可运行私有仓库容器

    docker run -id -p 5566:5000 --name registry -v /media/mes/file2/docker_registry:/var/lib/registry registry
    复制代码

    其中:

    -d:后台运行容器;

    --name:为容器命名;

    -p:映射端口,将本地的5566端口映射到容器的5000端口;

    -v:将容器中的/var/lib/registry目录挂载到本地的/media/mes/file2/docker_registry目录;

  5. 使用浏览器访问路径:http://10.0.95.63:5566/v2/_catalog,浏览器显示{"repositories":[]}则为搭建成功

  6. 推送镜像到私有仓库

    使用tag命令给镜像设置标签:

    docker tag nginx:latest 10.0.95.63:5566/nginx:latest
    复制代码

    然后使用push命令推送至私有仓库

    docker push 10.0.95.63:5566/nginx:latest
    复制代码

    然后通过浏览器访问路径:http://10.0.95.63:5566/v2/_catalog,即可看到:

    image-20201221155248837

    也可以在挂载的目录上查看到上传的镜像信息:

    image-20201221155510351

配置私有仓库认证

为提高私有仓库安全性,设置一个安全认证证书

  1. 创建证书存储目录

    sudo mkdir -p /usr/local/registry/certs
    复制代码
  2. 生成证书

    sudo openssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/registry/certs/domain.key -x509 -days 365 -out /usr/local/registry/certs/domain.crt
    复制代码

    其中:

    openssl req:创建证书签名请求等功能;

    -newkey:创建CSR证书签名文件和RSA私钥文件;

    rsa:2048:指定创建的RSA私钥长度为2048;

    -nodes:对私钥不进行加密;

    -sha256:使用SHA256算法;

    -keyout:创建的私钥文件名称及位置;

    -x509:自签发证书格式;

    -days:证书有效期;

    -out:指定CSR输出文件名称及位置;

    image-20201221160455526

  3. 生成鉴权密码文件

    # 创建存储鉴权密码文件目录
    sudo mkdir -p /usr/local/registry/auth
    # 安装httpd,这里选择apache2
    sudo apt-get install apache2
    # 创建用户和密码
    sudo chmod -R 777 /usr/local/registry/auth
    sudo htpasswd -Bbn root mes_2020 > /usr/bin/registry/auth/htpasswd
    复制代码
  4. 运行私有仓库容器

    docker run -id --name registry -p 5566:5000 \
       -v /mydata/docker_registry:/var/lib/registry \
       -v /usr/local/registry/certs:/certs \
       -v /usr/local/registry/auth:/auth \
       -e "REGISTRY_AUTH=htpasswd" \
       -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
       -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
       -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
       -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
       registry
    复制代码
  5. 推送10.0.95.63:5566/nginx:latest到私有仓库会提示no basic auth credentials;

    image-20201221161433349

  6. 登录并上传

    通过docker login命令登录私有仓库:

    docker login 10.0.95.63:5566
    复制代码

    然后推送镜像到私有仓库:

    docker push 10.0.95.63:5566/nginx:latest
    复制代码
  7. 退出账号

    docker logout 10.0.95.63:5566
    复制代码

参考文档: