jannal(无名小宝)

没有失败,只有缓慢的成功

导航

Docker之镜像仓库

镜像仓库

  1. 镜像从仓库下载下来,镜像保存在仓库中,而仓库存在于Registry中,一个Registry可以存放多个仓库,仓库可以被认为是一个具体的项目或目录。默认的Registry是由Docker公司运营的公共Registry服务,即Docker Hub

  2. Docker运行容器前需要本地存在对应的镜像。如果镜像不存在,Docker会尝试从默认镜像仓库中下载(Docker Hub 公共注册服务器中的仓库),用户也可以通过配置使用自定义的镜像仓库

  3. 常见的仓库

  4. docker镜像生命周期

命令操作

  1. 获取镜像。下载的过程中可以看出,镜像文件一般由若干层组成,行首的a330b6cecb98:这样的数字代表各层的ID。下载过程中会获取并输出镜像的各层信息。层(Layer)其是AUFS(联合文件系统)中的重要概念,是实现增量保存与更新的基础。

    1. 如果不指定TAG,则默认会选择latest标签,即下载仓库中最新版本的镜像(仓库中最新的)
    $ docker pull name[:TAG]
    
    2. 案例
    $ docker pull redis
    
    3. docker pull redis 相当于以下命令
    $ docker pull registry.hub.docker.com/redis:latest
    docker pull redis
    Using default tag: latest
    latest: Pulling from library/redis
    a330b6cecb98: Pull complete 
    14bfbab96d75: Pull complete 
    8b3e2d14a955: Pull complete 
    5da5e1b21a2f: Pull complete 
    6af3a5ca4596: Pull complete 
    4f9efe5b47a5: Pull complete 
    Digest: sha256:e595e79c05c7690f50ef0136acc9d932d65d8b2ce7915d26a68ca3fb41a7db61
    Status: Downloaded newer image for redis:latest
    docker.io/library/redis:latest
    
  2. 列出镜像

    1. 查看镜像列表
    $  docker images
    来自于哪个库		镜像标签信息  镜像ID          创建时间           大小
    REPOSITORY     TAG        IMAGE ID       CREATED           SIZE
    redis          latest     02c7f2054405   11 days ago       105MB
    
    2. 查看镜像详细信息,包括该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等:
    $ docker inspect 02c7f2054405
    
    [
        {
            "Id": "sha256:02c7f2054405dadaf295fac7281034e998646996e9768e65a78f90af62218be3",
            "RepoTags": [
                "redis:latest"
            ],
            "RepoDigests": [
                "redis@sha256:e595e79c05c7690f50ef0136acc9d932d65d8b2ce7915d26a68ca3fb41a7db61"
            ],
            "Parent": "",
            "Comment": "",
            "Created": "2021-09-03T13:26:48.395038582Z",
            "Container": "3627b30c1a4cf3ef703e0516beee6428efe1b08a5314f5f106b84250635809cb",
            "ContainerConfig": {
                "Hostname": "3627b30c1a4c",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": false,
                "AttachStderr": false,
                "ExposedPorts": {
                    "6379/tcp": {}
                },
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                    "GOSU_VERSION=1.12",
                    "REDIS_VERSION=6.2.5",
                    "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.5.tar.gz",
                    "REDIS_DOWNLOAD_SHA=4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae"
                ],
                "Cmd": [
                    "/bin/sh",
                    "-c",
                    "#(nop) ",
                    "CMD [\"redis-server\"]"
                ],
                "Image": "sha256:332cd8bceec776c2152877041d9e60cbaf4ba95504335e888311bcc1444155a7",
                "Volumes": {
                    "/data": {}
                },
                "WorkingDir": "/data",
                "Entrypoint": [
                    "docker-entrypoint.sh"
                ],
                "OnBuild": null,
                "Labels": {}
            },
            "DockerVersion": "20.10.7",
            "Author": "",
            "Config": {
                "Hostname": "",
                "Domainname": "",
                "User": "",
                "AttachStdin": false,
                "AttachStdout": false,
                "AttachStderr": false,
                "ExposedPorts": {
                    "6379/tcp": {}
                },
                "Tty": false,
                "OpenStdin": false,
                "StdinOnce": false,
                "Env": [
                    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                    "GOSU_VERSION=1.12",
                    "REDIS_VERSION=6.2.5",
                    "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.5.tar.gz",
                    "REDIS_DOWNLOAD_SHA=4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae"
                ],
                "Cmd": [
                    "redis-server"
                ],
                "Image": "sha256:332cd8bceec776c2152877041d9e60cbaf4ba95504335e888311bcc1444155a7",
                "Volumes": {
                    "/data": {}
                },
                "WorkingDir": "/data",
                "Entrypoint": [
                    "docker-entrypoint.sh"
                ],
                "OnBuild": null,
                "Labels": null
            },
            "Architecture": "amd64",
            "Os": "linux",
            "Size": 105408201,
            "VirtualSize": 105408201,
            "GraphDriver": {
                "Data": {
                    "LowerDir": "/var/lib/docker/overlay2/f63351e421b4a4d9115edac8011bf02c16a5bef9b65e6abc17a0a798111212f2/diff:/var/lib/docker/overlay2/8e81b7565c1bc82df23db2120104b3d6186762dc2bf7a451afdb81d6588c3656/diff:/var/lib/docker/overlay2/43b3859fd03894353c96c258a263418e52b01f4a6c521575a8565d34b3943782/diff:/var/lib/docker/overlay2/36f941dcdf39c34844ddeae3792d832255d8cd6f534e318e4d01c258e6cf262d/diff:/var/lib/docker/overlay2/a9915ad9e4ec11e3bd59ea066b4a48702d324e43f840f9629afe5f44ae5898bc/diff",
                    "MergedDir": "/var/lib/docker/overlay2/0ed2a4da5492feb1a9c1d13db169bf5b56b1ea2b37235f82c5f0bc7d578efbb4/merged",
                    "UpperDir": "/var/lib/docker/overlay2/0ed2a4da5492feb1a9c1d13db169bf5b56b1ea2b37235f82c5f0bc7d578efbb4/diff",
                    "WorkDir": "/var/lib/docker/overlay2/0ed2a4da5492feb1a9c1d13db169bf5b56b1ea2b37235f82c5f0bc7d578efbb4/work"
                },
                "Name": "overlay2"
            },
            "RootFS": {
                "Type": "layers",
                "Layers": [
                    "sha256:d000633a56813933cb0ac5ee3246cf7a4c0205db6290018a169d7cb096581046",
                    "sha256:bdad86443e47c5665683ac41c1f24f28479d830d7e3cc47d0a337ee5166c7714",
                    "sha256:6a7992ac480029d82b7dbb757d16fe5d023aa283ed32b52267cd1fe9e6b73c49",
                    "sha256:be43d2475cf809c0f2ec31950e849d0f888f3121970fd99196a11a903f8c3820",
                    "sha256:be5818ef2907adfe19be14bf66647b5fb5a2029143f9297f8ce1ff1fd1d35753",
                    "sha256:c54e0c16ea22fa873c12f6a7f3fb4e021bb58d67c292156a6ce6e08637458b7c"
                ]
            },
            "Metadata": {
                "LastTagTime": "0001-01-01T00:00:00Z"
            }
        }
    ]
    
    3. 只获取其中一部分信息
    $. docker inspect -f {{".Architecture"}} cd645f5a4769
    amd64
    $ docker inspect -f {{".Config.Env"}} cd645f5a4769
    [PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]
    
  3. 搜索镜像

    • docker search 搜索远端仓库中共享的镜像,默认搜索Docker Hub官方仓库中的镜像。通过docker search --help

      • --automated=false 仅显示自动化构建的镜像
      • --help=false Print usage
      • --no-trunc=false 输出信息不截断显示
      • --s,--stars=0 指定仅显示评价为执行星级以上的镜像
    • 显示信息:[名字] [描述] [星级] [是否官方创建] [是否自动创建]

      $ docker search mysql
      NAME        DESCRIPTION                                     STARS     OFFICIAL  AUTOMATED
      mysql       MySQL is a widely used, open-source relation…   11412     [OK]      
      mariadb     MariaDB Server is a high performing open sou…   4336      [OK]      
      
  4. 删除镜像

    • docker rmi 镜像标签或者ID。如果一个镜像对应了多个tag,只有当最后一个tag被删除时,镜像才被真正删除
      • -f, -force:强制删除镜像,即使有容器依赖它
      • -no-prune:不要清理未带标签的父镜像
    • 不能删除一个正在被使用的镜像(被容器占用) ,推荐先删除掉对应的容器 docker rm xxx,然后再删除镜像,而不是使用-f选项强制删除
    • 批量删除none镜像docker images|grep none|awk '{print $3}'|xargs docker rmi
    • docker image prune删除遗留的临时镜像,以及没有被使用的镜像
      • -a, -all:删除所有无用镜像,不光是临时镜像;
      • -filter filter:只清理符合给定过滤器的镜像;
      • -f, -force:强制删除镜像,而不进行提示确认
  5. 上传镜像docker push name:tag (docker push <hub-user>/<repo-name>:<tag>)

    1. 登录docker hub(https://hub.docker.com)
    $ docker login 
    登录成功后的用户名和密码会保存~/.docker/config.json
    $ cat ~/.docker/config.json
    {
    	"auths": {
    		"https://index.docker.io/v1/": {
    			"auth": "amFubmFsOjEyM3F3ZTEyMw=="
    		},
    		"registry.cn-beijing.aliyuncs.com": {
    			"auth": "dXNhZ29vbGU6ampmQDI1ODQxMjg="
    		}
    	},
    	"HttpHeaders": {
    		"User-Agent": "Docker-Client/19.03.11 (linux)"
    	}
    }
    
    2. 登录其他镜像仓库
    $ docker login k8s.harbor 或者docker login k8s.harbor -u admin -p Harbor12345
    
    3. 添加一个标签,推送到自己的命名空间下,需要重命名
    $ docker tag  centos-sshd-base:6.6  jannal/centos6.6-sshd:latest     
    
    4. 推送镜像
    $ docker push jannal/centos6.6-sshd:latest 
    

搭建Registry

  1. Docker Registry也叫Docker仓库,仓库主要用来下载和上传镜像的,仓库分为公有仓库和私有仓库,Registry是注册服务器,一个注册服务器存放多个仓库,每个仓库下又有多个镜像。

  2. Docker已经将Registry开源了,同时在Docker Hub上也有官方的镜像registry

  3. 搭建步骤

    $ docker pull registry:2.1.1
    $ docker run -d -v /home/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2.1.1
    Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/home/registry目录挂载到该目录,即可实现将镜像保存到主机的/home/registry目录了。
    $ docker ps -a           
    CONTAINER ID        IMAGE               COMMAND                  PORTS                    NAMES
    b9ad37f6c17a        registry:2.1.1      "/bin/registry /etc/    0.0.0.0:5000->5000/tcp   registry   
    
    访问http://192.168.6.107:5000/v2
    
  4. 测试push一个镜像到私有仓库

    $ docker tag c6f9e0e6b1e8  192.168.6.107:5000/centos-ssd-base   
    $ docker push 192.168.6.107:5000/centos-ssd-base
    
    如果遇到https的错误
    
    $ cat > /etc/docker/daemon.json << EOF
    { "insecure-registries":["192.168.6.107:5000"] }
    EOF
    $ systemctl daemon-reload && systemctl restart docker
    
  5. 配置详见官方文档:https://docs.docker.com/registry/configuration/

Harbor简介与安装

  1. Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

  2. Harbor特性

    • 基于角色的访问控制 :用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。

    • 镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。

    • 图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。

    • AD/LDAP 支持 : Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。

    • 审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。

    • 国际化 : 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。

    • RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。

    • 部署简单 : 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。

  3. 组件

    • Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。

    • Registry: 负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。

    • Core services: 这是Harbor的核心功能,主要提供以下服务:

      UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。

      webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。

      token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。

      Database:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。

      Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。

      Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。

安装

  1. 下载并解压

    $ yum install -y docker-compose
    $ wget https://github.com/goharbor/harbor/releases/download/v2.3.2/harbor-offline-installer-v2.3.2.tgz
    $ tar -zxvf harbor-offline-installer-v2.3.2.tgz -C /usr/local/
    $ cd /usr/local/harbor/
    
  2. 修改配置文件

    $ cp harbor.yml.tmpl harbor.yml 
    $ vim harbor.yml 
    
    #修改以下配置
    hostname: harbor  # 当前主机名
    harbor_admin_password: Harbor12345 # 密码
    https:
      # https port for harbor, default is 443
      port: 443
      # The path of cert and key files for nginx
      certificate: /usr/local/harbor/ca.crt
      private_key: /usr/local/harbor/ca.key
    
  3. 创建自签名证书key文件

    openssl genrsa -out /usr/local/harbor/ca.key 2048 
    
  4. 创建自签名证书crt文件,/CN=harbor修改为自己的域名,这里是harbor

     openssl req -x509 -new -nodes -key /usr/local/harbor/ca.key  \
     -subj "/CN=harbor" -days 500000 -out /usr/local/harbor/ca.crt
    
  5. 安装

    $ /usr/local/harbor/install.sh
    ...省略...
    Creating harbor-db ... done
    Creating harbor-core ... done
    Creating network "harbor_harbor" with the default driver
    Creating nginx ... done
    Creating registry ... 
    Creating harbor-portal ... 
    Creating harbor-db ... 
    Creating redis ... 
    Creating registryctl ... 
    Creating harbor-core ... 
    Creating nginx ... 
    Creating harbor-jobservice ... 
    ✔ ----Harbor has been installed and started successfully.----
    
    
  6. 卸载

    $ docker-compose down
    $ rm -rf /usr/local/harbor
    $ rm -rf /data/
    

客户端配置

  1. 客户端需要创建证书文件存放的位置,并且把服务端创建的证书拷贝到该目录下,然后重启客户端docker。我们这里创建目录为:/etc/docker/certs.d/harbor

    $ mkdir -p /etc/docker/certs.d/harbor
    
  2. 把服务端crt证书文件拷贝到客户端,例如我这的客户端主机名为:master

    $ scp /usr/local/harbor/ca.crt root@master:/etc/docker/certs.d/harbor/
    
  3. 重启客户端docker

    $ systemctl daemon-reload && systemctl restart docker
    
  4. 可以也可以使用http方式访问

    $ cat > /etc/docker/daemon.json << EOF
    { "insecure-registries":["harbor"] }
    EOF
    $ systemctl daemon-reload &&  systemctl restart docker
    
  5. 登录测试

    $ docker login harbor -u admin -p Harbor12345
    
    浏览器访问,默认是80端口
    https://harbor/
    
  6. 查看错误日志

    $ cd /var/log/harbor
    $ grep "ERROR" * 
    

posted on 2021-12-26 11:13  jannal  阅读(2189)  评论(0编辑  收藏  举报