美文网首页CICD搭建
CICD搭建之 docker私服搭建

CICD搭建之 docker私服搭建

作者: 行走的记忆 | 来源:发表于2020-10-03 14:34 被阅读0次

    在开发中搭建cicd时docker私服是必不可少的,这里记录一下笔者的私服搭建过程

    版本及说明
    registry是docker的私服
    docker pull registry:2.7.1
    docker的私服ui
    docker pull konradkleine/docker-registry-frontend:v2

    1、部署registry

    [root@localhost wxd]# docker run -d -p 7500:5000 --restart always --name registry registry:2.7.1
    30e772fb522c4d15143f6024aaf3dc0316e0f098954aa5d3804f87556b325159
    

    浏览器访问ip+7500/v2,如下图访问正常


    image.png

    2、部署registry-ui

    下面要通过registry-ui访问私服,启动脚本需要配置registry的pod的ip和端口,先查看一下registry在docker中的ip,用容器id,命令如下

    [root@localhost wxd]# docker inspect 30e772fb522c4d |grep IPAddress
                "SecondaryIPAddresses": null,
                "IPAddress": "172.17.0.2",
                        "IPAddress": "172.17.0.2",
    

    查询后得到registry的ip为172.17.0.2,根据前的registry启动脚本可以看到私服在docker中的端口为5000,因此启动命令如下

    [root@localhost wxd]# docker run -d \
    >   -e ENV_DOCKER_REGISTRY_HOST=172.17.0.2 \
    >   -e ENV_DOCKER_REGISTRY_PORT=5000 \
    >   -e ENV_MODE_BROWSE_ONLY=true \
    >   -p 9080:80 --restart always --name registry-ui konradkleine/docker-registry-frontend:v2
    a23aba177b87d37bf335265bb3852daebfa97e8d0bdc20f462c241eb8b5d91b6
    

    私服ui启动完毕,用浏览器访问ip+9080


    image.png

    3、推送镜像

    现在我们上传一个镜像到私服上看看,先拉取一个用来测试的镜像(不指定tag默认是latest)

    [root@localhost wxd]# docker pull redis
    Using default tag: latest
    latest: Pulling from library/redis
    d121f8d1c412: Pull complete 
    2f9874741855: Pull complete 
    d92da09ebfd4: Pull complete 
    bdfa64b72752: Pull complete 
    e748e6f663b9: Pull complete 
    eb1c8b66e2a1: Pull complete 
    Digest: sha256:1cfb205a988a9dae5f025c57b92e9643ec0e7ccff6e66bc639d8a5f95bba928c
    Status: Downloaded newer image for redis:latest
    docker.io/library/redis:latest
    

    修改镜像的名(这里我们的私服是启动在本机上的,映射到宿主机的端口是7500,所以命名为localhost:7500/redis,tag省略了默认latest)

    [root@localhost wxd]# docker tag redis localhost:7500/redis
    

    推送到私服

    [root@localhost wxd]# docker push localhost:7500/redis
    The push refers to repository [localhost:7500/redis]
    2e9c060aef92: Pushed 
    ea96cbf71ac4: Pushed 
    47d8fadc6714: Pushed 
    7fb1fa4d4022: Pushed 
    45b5e221b672: Pushed 
    07cab4339852: Pushed 
    latest: digest: sha256:02d2467210e76794c98ae14c642b88ee047911c7e2ab4aa444b0bfe019a41892 size: 1572
    

    推送成功,访问一下,如图


    image.png

    不部署registry-ui也是可以的,通过registry的http接口访问,registry-ui只是套了一层皮肤,通过web浏览方便些

    [root@localhost wxd]# curl localhost:7500/v2/_catalog
    {"repositories":["redis"]}
    [root@localhost wxd]# curl localhost:7500/v2/redis/tags/list
    {"name":"redis","tags":["latest"]}
    

    4、拉取镜像

    先删除本地docker中的镜像

    [root@localhost wxd]# docker rmi localhost:7500/redis
    Untagged: localhost:7500/redis:latest
    Untagged: localhost:7500/redis@sha256:02d2467210e76794c98ae14c642b88ee047911c7e2ab4aa444b0bfe019a41892
    

    删除后可以验证一下本地是否已经删除,命令如下

    docker images
    

    拉取私服localhost:7500上的镜像

    [root@localhost wxd]# docker pull localhost:7500/redis
    Using default tag: latest
    latest: Pulling from redis
    Digest: sha256:02d2467210e76794c98ae14c642b88ee047911c7e2ab4aa444b0bfe019a41892
    Status: Downloaded newer image for localhost:7500/redis:latest
    localhost:7500/redis:latest
    

    拉取成功

    5、一个小实验

    docker私服都是独立的,只要地址不同就不会冲突,我们可以验证一下,再启一个registry,然后推送一个镜像(要注意我们是同一台宿主机,因此宿主机的端口和docker中的name需要修改一下,跟前一个registry不能冲突)

    [root@localhost wxd]# docker run -d -p 7501:5000 --restart always --name registry-1 registry:2.7.1
    62f2a7302dd67d71cbb6833ac334d38578e4230541a039187058e43cbb9d5983
    [root@localhost wxd]# docker tag redis localhost:7501/redis
    [root@localhost wxd]# docker push localhost:7501/redis
    The push refers to repository [localhost:7501/redis]
    2e9c060aef92: Pushed 
    ea96cbf71ac4: Pushed 
    47d8fadc6714: Pushed 
    7fb1fa4d4022: Pushed 
    45b5e221b672: Pushed 
    07cab4339852: Pushed 
    latest: digest: sha256:02d2467210e76794c98ae14c642b88ee047911c7e2ab4aa444b0bfe019a41892 size: 1572
    

    6、持久化

    到目前为止,我们上传的到私服的镜像都是在registry的容器中,容器重启镜像就全没了,所以我们得把数据持久化到宿主机的磁盘上。
    网上有些资料通过设置环境变量或者配置文件来实现持久化,尝试了几种都没有成功,简单例举几个

    阿里云
    上图是阿里云的
    官方的
    按理说官方的应该是没问题,但是我下载的这个镜像配置文件跟官方好像不一样,改天用官方的源码编译打包一个镜像再试试。
    根据多次尝试未成功后,还是自己看看registry:2.7.1镜像的信息才找到解决办法。如下:
    [root@localhost ~]# docker ps |grep registry
    2ab3e9f9d35e        registry:2.7.1 
    [root@localhost ~]# docker inspect 2ab3e9f9d35e
    
    执行docker inspect 2ab3e9f9d35e后的截图

    根据图中信息,可以看出registry的配置文件路径是"/etc/docker/registry/config.yml",registry中存储镜像的路径是/var/lib/registry。
    于是,我们有2种解决办法
    1.通过cmd命令让registry读取自定义的配置文件
    2.将镜像存储路径映射到宿主机磁盘

    方案一

    我们先来尝试第一种,为了大家不走弯路,我直接将镜像中配置文件原样copy出来,只修改镜像存储路径将 /var/lib/registry修改为/opt/docker-image。
    通过以下命令,进入registry的容器,然后查看配置文件

    [root@localhost ~]# docker exec -it  2ab3e9f9d35e sh
    / # cat /etc/docker/registry/config.yml
    version: 0.1
    log:
      fields:
        service: registry
    storage:
      cache:
        blobdescriptor: inmemory
      filesystem:
        rootdirectory: /var/lib/registry
    http:
      addr: :5000
      headers:
        X-Content-Type-Options: [nosniff]
    health:
      storagedriver:
        enabled: true
        interval: 10s
        threshold: 3
    / # 
    

    修改后的配置文件

    version: 0.1
    log:
      fields:
        service: registry
    storage:
      cache:
        blobdescriptor: inmemory
      filesystem:
        rootdirectory: /opt/docker-image
    http:
      addr: :5000
      headers:
        X-Content-Type-Options: [nosniff]
    health:
      storagedriver:
        enabled: true
        interval: 10s
        threshold: 3
    

    将文件保存到提前建好的宿主机的目录下
    /home/wxd/cicd/registry/registry-config/config.yml
    准备用来存储镜像的目录
    /home/wxd/cicd/registry/docker-image
    启动脚本

    docker run -d -p 7501:5000 \
    -v /home/wxd/cicd/registry:/opt \
    --restart always --name registry-1 registry:2.7.1 \
    "/opt/registry-config/config.yml"
    

    启动后用刚才的命令push一个镜像
    docker push localhost:7501/redis
    执行完毕后,看看宿主机目录下是否后数据生成。

    [root@localhost docker-image]# ll
    总用量 0
    drwxr-xr-x. 3 root root 22 10月  4 03:25 docker
    

    可以看到有数据生成,详细的可以自己导docker目录下去看
    然后重启一下容器,验证一下registry中的数据有没有丢失,可以使用上文介绍的方法验证redis进行是否存在(可以通过ui或者registry的http接口http://192.168.56.102:7501/v2/_catalog)

    方案二

    停掉刚才启动的容器,记得把宿主机的docker-image目录下的文件清理掉。
    脚本如下

    docker run -d -p 7501:5000 \
    -v /home/wxd/cicd/registry/docker-image:/var/lib/registry \
    --restart always --name registry-1 registry:2.7.1 
    

    启动完毕后,验证方法同方案一,先push镜像,然后检查宿主机目录下是否有数据,重启registry,看镜像是否还在

    相关文章

      网友评论

        本文标题:CICD搭建之 docker私服搭建

        本文链接:https://www.haomeiwen.com/subject/sbgiuktx.html