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" * 
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM