zoukankan      html  css  js  c++  java
  • CentOS 8搭建Docker镜像私有仓库-registry

    简介

    本文主要讲述在CentOS 8上面搭建Docker镜像仓库的步骤。

    在实际项目过程中,项目产生的镜像需要部署至目标服务器,镜像和目标服务器之间需要使用一个镜像仓库作为镜像的存储中介,提供镜像的上传、下载、保存。

    下面介绍搭建本地Docker镜像仓库的步骤。

    安装Docker

    本文使用的Docker版本为19.03.12,使用国内的相关安装镜像包安装,这里使用的时阿里云的镜像站点。

    添加docker yum源

    # 安装必要依赖
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    # 添加aliyum docker-ce yum源
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    # 重建yum缓存
    yum makecache
    

    安装docker

    # 安装指定版本docker,这里以19.03.12为例说明
    yum install -y docker-ce-19.03.12-3.el7
    
    # 执行此命令后可能会出现错误如下:
    Last metadata expiration check: 0:01:15 ago on Wed 26 Aug 2020 06:00:10 PM PDT.
    Error: 
     Problem: package docker-ce-3:19.03.12-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
      - conflicting requests
      - package containerd.io-1.2.10-3.2.el7.x86_64 is filtered out by modular filtering
      - package containerd.io-1.2.13-3.1.el7.x86_64 is filtered out by modular filtering
      - package containerd.io-1.2.13-3.2.el7.x86_64 is filtered out by modular filtering
      - package containerd.io-1.2.2-3.3.el7.x86_64 is filtered out by modular filtering
      - package containerd.io-1.2.2-3.el7.x86_64 is filtered out by modular filtering
      - package containerd.io-1.2.4-3.1.el7.x86_64 is filtered out by modular filtering
      - package containerd.io-1.2.5-3.1.el7.x86_64 is filtered out by modular filtering
      - package containerd.io-1.2.6-3.3.el7.x86_64 is filtered out by modular filtering
    (try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
    
    # 错误原因:需要安装高版本的containerd.io
    
    # 解决措施:可以安装最新的containerd.io,但是使用官方的下载安装时比较慢,可以使用迅雷等下载工具将此安装包下载后上传至服务器安装
    # 这里使用xshell连接服务器为例执行,具体命令如下:
    yum install lrzsz
    mkdir software
    cd software/
    rz
    yum localinstall -y containerd.io-1.2.6-3.3.el7.x86_64.rpm
    
    # 重新执行安装docker命令,安装成功
    yum install -y docker-ce-19.03.12-3.el7
    

    确保网络模块开机自动加载

    由于需要使用远程访问,因此需要使用网络模块,并且要保证此模块开机自动启动。

    lsmod | grep overlay
    lsmod | grep br_netfilter
    

    若上面的命令无返回值输出或提示文件不存在,需要执行以下命令:

    cat > /etc/modules-load.d/docker.conf <<EOF
    overlay
    br_netfilter
    EOF
    
    modprobe overlay
    modprobe br_netfilter
    

    使桥接流量对iptables可见

    cat > /etc/sysctl.d/k8s.conf <<EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    
    sysctl --system
    
    # 验证是否生效,下面两个命令结果需均返回 1
    sysctl -n net.bridge.bridge-nf-call-iptables
    sysctl -n net.bridge.bridge-nf-call-ip6tables
    

    配置docker

    mkdir /etc/docker
    
    # 修改cgroup驱动为systemd[k8s官方推荐]、限制容器日志量、修改存储类型,最后的docker根目录可修改
    # 下面文件中第一行insecure-registries的值需要修改为对应机器的IP地址
    cat > /etc/docker/daemon.json <<EOF
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2",
      "storage-opts": [
        "overlay2.override_kernel_check=true"
      ],
      "registry-mirrors": ["https://7uuu3esz.mirror.aliyuncs.com"],
      "data-root": "/data/docker"
    }
    EOF
    
    # 添加开机自启动,立即启动
    systemctl enable --now docker
    

    验证docker是否正常

    # 查看docker信息,判断是否与配置一致
    docker info
    
    # hello-docker测试
    docker run --rm hello-world
    
    # 删除测试的image
    docker rmi hello-world
    

    添加用户到docker组

    非root用户,无需sudo即可使用docker命令。

    # 添加用户到docker组,此处zgs为其他账号信息
    usermod -aG docker zgs
    
    # 当前会话立即更新docker组
    newgrp docker
    

    至此,Docker已经安装完成,下面配置Docker镜像仓库。

    搭建Docker私有仓库

    使用registry镜像类配置我们的私有仓库,即搭建私有仓库使用的组件也是一个docker镜像。

    下载registry镜像

    这里使用registry的版本为2,拉取对应镜像,也可以从hub.daocloud.io站点上查看对应的版本并获取对应镜像。

    # 拉去registry仓库
    docker pull registry:2
    
    # 查看镜像拉取结果
    docker images
    
    # 拉取的镜像
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    registry            2                   2d4f4b5309b1        2 months ago        26.2MB
    

    启动registry镜像

    启动registry镜像时需要注意下面几点:

    • 开机启动,设置restart属性为always
    • 目录挂载,默认上传的镜像文件是存放在registry镜像运行是container的内部,如果容器消亡,对应的文件也消失,因此要将其目录映射到宿主机的目录上面
    • 端口映射,映射宿主机的5000端口到容器的5000端口
    # 在宿主机创建挂在目录
    cd ~
    mkdir data
    cd data/
    mkdir docker
    cd docker/
    mkdir registry
    cd registry
    pwd
    
    # 启动registry镜像
    docker run -d -v /root/data/docker/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2
    
    # 查看启动的容器
    docker ps
    
    # registry已启动
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
    8e6516273466        registry:2          "/entrypoint.sh /etc…"   4 seconds ago       Up 2 seconds        0.0.0.0:5000->5000/tcp   registry
    

    验证是否部署成功

    访问http://192.168.43.131:5000/v2/地址,如果出现下面的结果证明私有仓库部署成功。

    {}
    

    可以访问http://192.168.43.131:5000/v2/_catalog地址查看仓库中的镜像信息,目前我们的仓库中没有镜像,显示结果如下:

    {"repositories":[]}
    

    镜像的上传与下载

    镜像上传

    使用另外一台宿主机,将其nginx的镜像,上传至镜像仓库测试,并确认上传后的结果。

    # 下载nginx镜像,实际需要使用自己打包好的镜像文件
    docker pull daocloud.io/library/nginx:1.7.8
    
    # 重新给镜像打标签,注意:更新后的镜像标签一定要以镜像仓库的IP地址和端口号作为前缀,是否可以使用域名代替IP地址需要验证
    docker tag daocloud.io/library/nginx:1.7.8 192.168.43.131:5000/test:v01
    
    # 镜像列表如下
    REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
    192.168.43.131:5000/test             latest              a343d51dff65        5 years ago         91.7MB
    daocloud.io/library/nginx            1.7.8               a343d51dff65        5 years ago         91.7MB
    
    
    # 将镜像上传至镜像仓库
    docker push 192.168.43.131:5000/test
    
    # 返回结果如下,出现了错误,错误信息如下
    The push refers to repository [192.168.43.131:5000/test]
    Get https://192.168.43.131:5000/v2/: http: server gave HTTP response to HTTPS client
    
    # 解决方法请参考下面的章节
    

    解决之后,重新执行推送镜像命令,结果如下:

    # 推送镜像,可以在镜像名称后面添加版本号:v1,默认为latest
    docker push 192.168.43.131:5000/test
    
    # 推送镜像执行结果
    The push refers to repository [192.168.43.131:5000/test]
    5f70bf18a086: Pushed 
    242390e67cbf: Pushed 
    fc521005216a: Pushed 
    6f0124c2157c: Pushed 
    5a29dcc5d0b4: Pushed 
    6607e4d8ecb7: Pushed 
    8b116ab6d885: Pushed 
    latest: digest: sha256:5e3e9ea21051fcb23c6ede0b2c59b950bea07701db6360cff5e556636d3d48f2 size: 3012
    

    可以通过域名地址验证镜像是否推送成功。

    # 查看镜像列表
    http://192.168.43.131:5000/v2/_catalog
    
    # 执行结果
    {"repositories":["test"]}
    
    # 查看指定镜像的各个版本
    http://192.168.43.131:5000/v2/{镜像名称}/tags/list
    http://192.168.43.131:5000/v2/test/tags/list
    
    # 执行结果
    {"name":"test","tags":["latest"]}
    

    解决http: server gave HTTP response to HTTPS client

    由于docker镜像拉取与推送服务使用的是https协议,但是仓库服务器上面没有配置https证书,可以修改客户端的配置,使用http协议进行通信。

    # 修改/etc/docker下的daemon.json配置文件,添加服务端的IP和端口配置,在文件中添加下面的命令:
    "insecure-registries": ["192.168.43.131:5000"]
    
    # 修改后de daemon.json文件如下所示:
    {
      "insecure-registries": ["192.168.43.131:5000"],
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2",
      "storage-opts": [
        "overlay2.override_kernel_check=true"
      ],
      "registry-mirrors": ["https://7uuu3esz.mirror.aliyuncs.com"],
      "data-root": "/data/docker"
    }
    

    重新启动客户端docker服务即可。

    systemctl restart docker
    

    镜像下载

    先将我们本地的192.168.43.131:5000/testdaocloud.io/library/nginx 先删除掉。

    docker rmi 192.168.43.131:5000/test:latest
    docker rmi daocloud.io/library/nginx:1.7.8
    

    查看本地的镜像列表中已经没有对应镜像,使用下面命令从镜像服务器上下载镜像。

    # 从镜像服务器上下载镜像
    docker pull 192.168.43.131:5000/test:latest
    
    # 执行结果
    latest: Pulling from test
    4f4fb700ef54: Pull complete 
    9a1209a4c986: Pull complete 
    95a23bb7571d: Pull complete 
    3f6b880dd9d0: Pull complete 
    08f502ddc2a2: Pull complete 
    5db29f58d80d: Pull complete 
    acf00ce452a6: Pull complete 
    Digest: sha256:5e3e9ea21051fcb23c6ede0b2c59b950bea07701db6360cff5e556636d3d48f2
    Status: Downloaded newer image for 192.168.43.131:5000/test:latest
    192.168.43.131:5000/test:latest
    

    查看本地镜像列表中已经存在对应镜像。

    # 查看镜像列表
    docker images
    
    # 执行结果
    REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
    192.168.43.131:5000/test             latest              a343d51dff65        5 years ago         91.7MB
    

    结束

    至此,Docker镜像仓库服务器已经搭建完成。

  • 相关阅读:
    所有蚂蚁掉下来前的最后一刻
    最长有效括号
    n的第k个因子--leetcode1492
    删掉一个元素以后全为1的最长子数组。
    public class和class的区别
    数据库中的乐观锁和悲观锁以及实现方式
    HashMap底层实现原理 扩容机制
    jvm 内存泄漏现象和处理方案
    Django模板标签语法
    Django图片的上传与下载
  • 原文地址:https://www.cnblogs.com/zhang-guansheng/p/13570840.html
Copyright © 2011-2022 走看看