zoukankan      html  css  js  c++  java
  • 详解docker实战之搭建私有镜像仓库

    1、实战目的

    搭建企业私有的镜像仓库,满足从开发环境推送和拉取镜像。当我们使用k8s来编排和调度容器时,操作的基本单位是镜像,所以需要从仓库去拉取镜像到当前的工作节点。本来使用公共的docker hub完全可以满足我们的需求,也非常方便,但是上传的镜像任何人都可以访问,其次docker hub的私有仓库又是收费的,所以从安全和商业两方面考虑,企业必须搭建自己的私有镜像仓库。

    2、搭建私有仓库

    2.1、生产证书

    为了保证镜像传输安全,从开发环境向私有仓库推送和拉取镜像时,一般使用https的方式(备注:对于普通的http方式请大家参考官方文档:https://docs.docker.com/registry/insecure/#deploy-a-plain-http-registry 自己下去实战。),所以我们需要提供一个可信任的、知名的SSL/TLS证书,可以向知名的第三方证书颁发机构购买证书,也可以使用Let’s Encrypt生产免费的证书,还可以自己生产一个自签名证书。
    由于没有购买真实的域名,无法和第三方证书颁发机构进行交互性验证,所以决定自己生产一个自签名证书,添加到私有仓库,然后让docker客户端信任此证书。
    创建一个用于存储证书和私钥的目录certs

    $ mkdir -p certs
    

    生产证书和私钥

    $ openssl req 
    -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key 
    -x509 -days 365 -out certs/domain.crt 
    

    注意提前想好域名(如:registry.wuling.com),并将其作为CN,整个过程如图所示:

    查看生成证书:

    2.2、运行容器,启动镜像仓库

    使用docker开源的Registry:2镜像,如图:

    执行下面命令:

    $ docker run -d 
      --restart=always 
      --name registry.wuling.com 
      -v `pwd`/certs:/certs 
      -e REGISTRY_HTTP_ADDR=0.0.0.0:443 
      -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt 
      -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key 
      -p 443:443 
      registry:2
    
    参数 说明
    -d 后台静默运行容器。
    -restart 设置容器重启策略。
    -name 命名容器。
    -v 挂载host的certs/目录到容器的/certs/目录。
    -e REGISTRY_HTTP_ADDR 设置仓库主机地址格式。
    -e REGISTRY_HTTP_TLS_CERTIFICATE 设置环境变量告诉容器证书的位置。
    -e REGISTRY_HTTP_TLS_KEY 设置环境变量告诉容器私钥的位置。
    -p 将容器的 443 端口映射到Host的 443 端口。

    如图所示:

    丛上图可以看到,服务端私有仓库已经正常运行起来了!!!

    3、实战(从服务器和开发环境分别推送和拉取镜像)

    3.1 服务器(私有仓库所在主机)

    3.1.1、下载并重命名镜像

    镜像的完整命名格式:[registry-host]:[port]/[username]/[imagename],当我们使用docker push的时候,docker会自动识别[registry-host]部分为容器镜像仓库地址。
    使用docker tag重命名镜像:

    docker pull justmine/helloworldapi:v2.2 
    docker tag justmine/helloworldapi:v2.2 registry.wuling.com/justmine/helloworldapi:v2.2
    

    3.1.2、推送镜像到私有仓库


    什么情况?哦哦哦!!!域名是我们杜撰的,需要将与IP映射关系写入hosts文件。

    再次推送,如下:

    x509: certificate signed by unknown authority
    又是什么情况?哦哦哦!!!原来系统不信任我们颁发的证书,好吧,不知名就不信任,那我们就主动宣布此证书是值得信任的!!!
    为docker client安装证书,命令如下:

    # 假如:仓库域名为=》registry.wuling.com,端口为=》8000,需要信任的证书地址为=》/root/certs/domain.crt
    # 1. 老版本docker
    $ mkdir -p /etc/docker/certs.d/registry.wuling.com
    $ cp /root/certs/domain.crt /etc/docker/certs.d/registry.wuling.com/ca.crt
    # 2. 新版本docker
    $ mkdir -p /etc/docker/certs.d/registry.wuling.com:8000
    $ cp /root/certs/domain.crt /etc/docker/certs.d/registry.wuling.com:8000/ca.crt
    

    备注:根据docker版本情况,大家按照这两种方法添加信任就行了。


    再次推送:

    成功了!!!

    3.1.3、通过浏览器查看仓库概况

    仓库镜像目录:

    https://registry.wuling.com/v2/_catalog
    


    镜像详情

    https://registry.wuling.com/v2/justmine/helloworldapi/tags/list
    

    3.2 其他宿主机(开发环境Windows主机)

    3.2.1 推送镜像到私有仓库

    docker push registry.wuling.com/justmine/healthchecksapi:v1.5
    


    同理:为了让当前Windows主机上运行的docker信任此证书,我们只需要在Windows主机上安装此证书,右键点击【安装证书】,选择【本地主机】,选择【受信任的根证书】,添加证书即可。同时将域名与私有仓库主机ip的映射关系写入到Windows主机的hosts文件。
    重启docker,再次推送:

    哎,终于成功了,不容易啊!!!

    3.2.2 拉取镜像

    docker pull registry.wuling.com/justmine/healthchecksapi:v1.5
    

    3.2.3、通过浏览器查看仓库概况

    仓库镜像目录:

    https://registry.wuling.com/v2/_catalog
    


    镜像详情

    https://registry.wuling.com/v2/justmine/healthchecksapi/tags/list
    

    到目前为止,能够满足企业需求的私有仓库正式搭建完成。

    下一篇,我们将实战k8s使用我们的私有仓库拉取镜像
    源码参考:https://github.com/justmine66/k8s.ecoysystem.apps

    做一个有底蕴的软件工作者
  • 相关阅读:
    第40次全国计算机等级考试监考
    [再寄小读者之数学篇](2014-07-27 打印错误吧)
    日积月累的名典[2014-10-7]
    2014年全球“高被引科学家”数学类名单
    年轻尼姑的19句话
    PostgreSQL的 initdb 源代码分析之十六
    PostgreSQL的 initdb 源代码分析之十五
    PostgreSQL的 initdb 源代码分析之十四
    PostgreSQL的 initdb 源代码分析之十三
    PostgreSQL的 initdb 源代码分析之十二
  • 原文地址:https://www.cnblogs.com/justmine/p/8666907.html
Copyright © 2011-2022 走看看