鏡像倉庫
-
鏡像從倉庫下載下來,鏡像保存在倉庫中,而倉庫存在於Registry中,一個Registry可以存放多個倉庫,倉庫可以被認為是一個具體的項目或目錄。默認的Registry是由Docker公司運營的公共Registry服務,即Docker Hub
-
Docker運行容器前需要本地存在對應的鏡像。如果鏡像不存在,Docker會嘗試從默認鏡像倉庫中下載(Docker Hub 公共注冊服務器中的倉庫),用戶也可以通過配置使用自定義的鏡像倉庫
-
常見的倉庫
-
docker鏡像生命周期
命令操作
-
獲取鏡像。下載的過程中可以看出,鏡像文件一般由若干層組成,行首的
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
-
列出鏡像
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]
-
搜索鏡像
-
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]
-
-
刪除鏡像
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
:強制刪除鏡像,而不進行提示確認
-
上傳鏡像
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
-
Docker Registry也叫Docker倉庫,倉庫主要用來下載和上傳鏡像的,倉庫分為公有倉庫和私有倉庫,Registry是注冊服務器,一個注冊服務器存放多個倉庫,每個倉庫下又有多個鏡像。
-
Docker已經將Registry開源了,同時在Docker Hub上也有官方的鏡像registry
-
搭建步驟
$ 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
-
測試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
Harbor簡介與安裝
-
Harbor是一個用於存儲和分發Docker鏡像的企業級Registry服務器,通過添加一些企業必需的功能特性,例如安全、標識和管理等,擴展了開源Docker Distribution。作為一個企業級私有Registry服務器,Harbor提供了更好的性能和安全。提升用戶使用Registry構建和運行環境傳輸鏡像的效率。Harbor支持安裝在多個Registry節點的鏡像資源復制,鏡像全部保存在私有Registry中, 確保數據和知識產權在公司內部網絡中管控。另外,Harbor也提供了高級的安全特性,諸如用戶管理,訪問控制和活動審計等。
-
Harbor特性
-
基於角色的訪問控制 :用戶與Docker鏡像倉庫通過“項目”進行組織管理,一個用戶可以對多個鏡像倉庫在同一命名空間(project)里有不同的權限。
-
鏡像復制 : 鏡像可以在多個Registry實例中復制(同步)。尤其適合於負載均衡,高可用,混合雲和多雲的場景。
-
圖形化用戶界面 : 用戶可以通過瀏覽器來瀏覽,檢索當前Docker鏡像倉庫,管理項目和命名空間。
-
AD/LDAP 支持 : Harbor可以集成企業內部已有的AD/LDAP,用於鑒權認證管理。
-
審計管理 : 所有針對鏡像倉庫的操作都可以被記錄追溯,用於審計管理。
-
國際化 : 已擁有英文、中文、德文、日文和俄文的本地化版本。更多的語言將會添加進來。
-
RESTful API : RESTful API 提供給管理員對於Harbor更多的操控, 使得與其它管理軟件集成變得更容易。
-
部署簡單 : 提供在線和離線兩種安裝工具, 也可以安裝到vSphere平台(OVA方式)虛擬設備。
-
-
組件
-
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,供日后進行分析。
-
安裝
-
下載並解壓
$ 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/
-
修改配置文件
$ 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
-
創建自簽名證書key文件
openssl genrsa -out /usr/local/harbor/ca.key 2048
-
創建自簽名證書crt文件,
/CN=harbor
修改為自己的域名,這里是harboropenssl req -x509 -new -nodes -key /usr/local/harbor/ca.key \ -subj "/CN=harbor" -days 500000 -out /usr/local/harbor/ca.crt
-
安裝
$ /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.----
-
卸載
$ docker-compose down $ rm -rf /usr/local/harbor $ rm -rf /data/
客戶端配置
-
客戶端需要創建證書文件存放的位置,並且把服務端創建的證書拷貝到該目錄下,然后重啟客戶端docker。我們這里創建目錄為:
/etc/docker/certs.d/harbor
$ mkdir -p /etc/docker/certs.d/harbor
-
把服務端crt證書文件拷貝到客戶端,例如我這的客戶端主機名為:master
$ scp /usr/local/harbor/ca.crt root@master:/etc/docker/certs.d/harbor/
-
重啟客戶端docker
$ systemctl daemon-reload && systemctl restart docker
-
可以也可以使用http方式訪問
$ cat > /etc/docker/daemon.json << EOF { "insecure-registries":["harbor"] } EOF $ systemctl daemon-reload && systemctl restart docker
-
登錄測試
$ docker login harbor -u admin -p Harbor12345 瀏覽器訪問,默認是80端口 https://harbor/
-
查看錯誤日志
$ cd /var/log/harbor $ grep "ERROR" *