Docker笔记-04 仓库
文章目錄
- 1 DockerHub公共鏡像市場
- 1.1 登錄
- 1.2 基本操作
- 1.3 自動創建
- 2 第三方鏡像市場
- 2.1 查看鏡像
- 2.2 下載鏡像
- 3 搭建本地私有倉庫
- 3.1 使用registry鏡像創建私高倉庫
- 3.2 管理私有倉庫
- 3.2.1 上傳鏡像到本地倉庫
- 3.2.2 搜索本地倉庫鏡像
- 3.2.3 下載本地倉庫鏡像
- 3.2.4 配置非https倉庫地址
- 3.3 私有倉庫高級配置
- 3.3.1 準備站點證書
- 3.3.2 配置私有倉庫
- 3.3.3 測試私有倉庫功能
- 3.4 Nexus3
- 3.4.1 啟動Nexus容器
- 3.4.2 創建倉庫
- 3.4.3 添加訪問權限
- 3.4.4 重啟nexus服務,開放5000端口
- 3.4.5 測試
- 3.4.6 docker登錄倉庫
- 3.4.7 操作鏡像
- 3.4.8 服務端啟動方式改進,將Nexus3注冊成系統服務
- 3.4.9 改nexus倉庫的http為https
倉庫(Repository)是集中存放鏡像的地方,又分公共倉庫和私有倉庫。
有時候容易把倉庫與注冊服務器(Registry)混淆 。 實際上注冊服務器是存放倉庫的具體服務器,一個注冊服務器上可以有多個倉庫,而每個倉庫下面可以有多個鏡像。
從這方面來說,倉庫可以被認為是一個具體的項目或目錄。 例如對于倉庫地址private-docker.com/ubuntu來說,private-docker.com是注冊服務器地址,ubuntu是倉庫名。
1 DockerHub公共鏡像市場
Docker Hub是Docker官方提供的最大的公共鏡像倉庫,目前包括了超過100000的鏡像,地址為https://hub.docker.com。 大部分對鏡像的需求,都可以通過在Docker Hub中直接下載鏡像來實現。
1.1 登錄
可以通過命令行執行docker login命令來輸入用戶名、密碼和郵箱來完成注冊和登錄。
注冊成功后,本地用戶目錄下會自動創建.docker/config.jon文件,保存用戶的認證信息。登錄成功的用戶可以上傳個人制作的鏡像到Docker Hub。
1.2 基本操作
用戶無須登錄即可通過docker search命令來查找官方倉庫中的鏡像,并利用docker [image] pull命令來將它下載到本地。
(base) pang@pang-HP:~$ sudo docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 7191 [OK] centos/systemd systemd enabled base container. 108 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 95 kasmweb/centos-7-desktop CentOS 7 desktop for Kasm Workspaces 21 centos/mongodb-36-centos7 MongoDB NoSQL database server 8 kasmweb/core-centos-7 CentOS 7 base image for Kasm Workspaces 3 continuumio/centos5_gcc5_base 3 couchbase/centos7-systemd centos7-systemd images with additional debug… 1 [OK] spack/centos7 CentOS 7 with Spack preinstalled 1 spack/centos-stream 0 couchbase/centos-72-jenkins-core 0 fnndsc/centos-python3 Source for a slim Centos-based Python3 image… 0 [OK] couchbase/centos-72-java-sdk 0 couchbase/centos-69-sdk-nodevtoolset-build 0 couchbase/centos-70-sdk-build 0 datadog/centos-i386 0 spack/centos6 CentOS 6 with Spack preinstalled 0 starlingx/stx-centos StarlingX centos 0 ibmcom/fhe-toolkit-centos-amd64 The IBM Fully Homomorphic Encryption (FHE) T… 0 ibmcom/fhe-toolkit-centos The IBM Fully Homomorphic Encryption (FHE) T… 0 apache/couchdbci-centos Apache CouchDB CI CentOS 0 silintl/openldap OpenLDAP base image on Centos 6 0 [OK] bitnami/centos-extras-base 0 bitnami/centos-base-buildpack Centos base compilation image 0 [OK] couchbase/centos-69-sdk-build 0 (base) pang@pang-HP:~$根據是否為官方提供,可將這些鏡像資源分為兩類:
- 一種是類似于centos這樣的基礎鏡像,也稱為根鏡像。這些鏡像是由Docker公司創建、驗證、支持、提供 ,這樣的鏡像往往使用單個單詞作為名字;
- 另一種類型的鏡像,比如ansible/centos7-ansible鏡像,是由Docker用戶ansible創建并維護的,帶有用戶名稱為前綴,表明是某用戶下的某倉庫。 可以通過用戶名稱前綴"user_name/鏡像名"來指定使用某個用戶提供的鏡像。
用戶也可以在登錄后通過docker push命令來將本地鏡像推送到Docker Hub。
1.3 自動創建
2021年7月26日之后,該項功能僅限付費用戶使用。
自動創建( Automated Builds)是Docker Hub提供的自動化服務,這一功能可以自動跟隨項目代碼的變更而重新構建鏡像 。
例如,用戶構建了某應用鏡像,如果應用發布新版本,用戶需要手動更新鏡像。 而自動創建則允許用戶通過Docker Hub指定跟蹤一個目標網站(目前支持GitHub或BitBucket)上的項目,一旦項目發生新的提交,則自動執行創建。
要配置自動創建,包括如下的步驟:
之后,可以在Docker Hub的“自動創建”頁面中跟蹤每次創建的狀態 。
2 第三方鏡像市場
國內不少云服務商都提供了Docker鏡像市場包括騰訊云、網易云、阿里云等。下面以時速云為例,介紹如何使用這些市場。
2.1 查看鏡像
訪問https://hub.tenxcloud.com,即可看到己存在的倉庫和存儲的鏡像,包括Ubuntu、Java、Mongo、MySQL、Nginx等熱門倉庫和鏡像。 時速云官方倉庫中的鏡像會保持與DockerHub中官方鏡像的同步。
以MongoDB倉庫為例,其中包括了2.6、3.0和3.2等鏡像。
2.2 下載鏡像
下載鏡像也是使用docker pull命令,但是要在鏡像名稱前添加注冊服務器的具體地址。格式為index.tenxcloud.com/<namespace>/<repository>:<tag>。
例如,要下載Docker官方倉庫中的node:latest鏡像,可以使用如下命令 :
$ docker pull index.tenxcloud.com/docker_library/node:latest正常情況下,鏡像下載會比直接從Docker Hub下載快得多。通過docker images命令來查看下載到本地的鏡像:
$ docker images REPOSITORY TAG IMAGE ID CREATED S 工 ZEindex tenxcloud.com/docker_library/node latest e79fe5711c94 4 weeks ago 660 7 MB下載后,可以更新鏡像的標簽,與官方標簽保持一致,方便使用:
$ docker tag index.tenxcloud.com/docker_library/node:latest node:latest除了每次在pull中填寫注冊地址外,也可以如第1章2.2.4節說明的,配置加速服務。
另外,除了使用這些公共鏡像服務外,還可以搭建本地的私有倉庫服務器,將在下一節介紹。
3 搭建本地私有倉庫
有時候使用Docker Hub這樣的公共倉庫可能不方便,用戶可以創建一個本地倉庫供私人使用。
3.1 使用registry鏡像創建私高倉庫
docker-registry是官方提供的工具,可以用于構建私有的鏡像倉庫。本節內容基于docker-registry v2.x版本。
安裝Docker后,可以通過官方提供的registry鏡像來簡單搭建一套本地私有倉庫環境:
$ docker run -d -p 5000:5000 registry:2這將自動下載井啟動一個registry容器,創建本地的私有倉庫服務。
例如:
(base) pang@pang-HP:~$ sudo docker run -d -p 5000:5000 registry:2 Unable to find image 'registry:2' locally 2: Pulling from library/registry 2408cc74d12b: Pull complete ea60b727a1ce: Pull complete c87369050336: Pull complete e69d20d3dd20: Pull complete fc30d7061437: Pull complete Digest: sha256:bedef0f1d248508fe0a16d2cacea1d2e68e899b2220e2258f1b604e1f327d475 Status: Downloaded newer image for registry:2 557793dbfb9533ec8559bc8b0a88e882d4e4ed1638f13835a7b375012e76f425 (base) pang@pang-HP:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE python 3 763642b839b7 2 days ago 55.4MB debian stretch-slim a88d8e7bd33c 2 weeks ago 55.4MB registry 2 773dbf02e42e 3 weeks ago 24.1MB hello-world latest feb5d9fea6a5 8 months ago 13.3kB centos 7 eeb6ee3f44bd 9 months ago 204MB (base) pang@pang-HP:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 557793dbfb95 registry:2 "/entrypoint.sh /etc…" 44 minutes ago Up 44 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp wonderful_shannon 98bbce6f5691 centos:7 "/bin/bash" 24 hours ago Up 24 hours reverent_morse (base) pang@pang-HP:~$默認情況下,倉庫會被創建在容器的/var/lib/registry目錄下。可以通過-v參數來將鏡像文件存放在本地的指定路徑 。
例如下面的例子將上傳的鏡像放到/opt/data/registry目錄:
$ docker run -d -p 5000 5000 -v /opt/data/registry:/var/lib/registry registry:2此時,在本地將啟動一個私有倉庫服務,監聽端口為5000。
3.2 管理私有倉庫
私有倉庫可以通過registry提供的api來操作,可以參考官網的api文檔,鏈接如下:https://docs.docker.com/registry/spec/api/#detail
3.2.1 上傳鏡像到本地倉庫
- 先在本機查看已有的鏡像。
- 使用docker tag將python:3這個鏡像標記為127.0.0.1:5000/python:3,語法格式docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
- 使用docker push上傳標記的鏡像
- 用curl查看倉庫中的鏡像
這里可以看到 {“repositories”:[“python”]},表明鏡像已經被成功上傳了。
3.2.2 搜索本地倉庫鏡像
- 查詢本地倉庫有哪些鏡像
- 獲取某個鏡像的標簽列表
3.2.3 下載本地倉庫鏡像
先刪除已有鏡像,再嘗試從私有倉庫中下載這個鏡像。
(base) pang@pang-HP:~$ sudo docker rmi 127.0.0.1:5000/python:3 Untagged: 127.0.0.1:5000/python:3 Untagged: 127.0.0.1:5000/python@sha256:c001da366c3e68619a8bcd8a61b6a888b7e1bb3a293ac30382d865d0fad3789f (base) pang@pang-HP:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE python 3 763642b839b7 2 days ago 55.4MB debian stretch-slim a88d8e7bd33c 2 weeks ago 55.4MB registry 2 773dbf02e42e 3 weeks ago 24.1MB hello-world latest feb5d9fea6a5 8 months ago 13.3kB centos 7 eeb6ee3f44bd 9 months ago 204MB (base) pang@pang-HP:~$ sudo docker pull 127.0.0.1:5000/python:3 3: Pulling from python Digest: sha256:c001da366c3e68619a8bcd8a61b6a888b7e1bb3a293ac30382d865d0fad3789f Status: Downloaded newer image for 127.0.0.1:5000/python:3 127.0.0.1:5000/python:3 (base) pang@pang-HP:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE 127.0.0.1:5000/python 3 763642b839b7 2 days ago 55.4MB python 3 763642b839b7 2 days ago 55.4MB debian stretch-slim a88d8e7bd33c 2 weeks ago 55.4MB registry 2 773dbf02e42e 3 weeks ago 24.1MB hello-world latest feb5d9fea6a5 8 months ago 13.3kB centos 7 eeb6ee3f44bd 9 months ago 204MB (base) pang@pang-HP:~$3.2.4 配置非https倉庫地址
如果不想使用127.0.0.1:5000作為倉庫地址,比如想讓本網段的其他主機也能把鏡像推送到私有倉庫。就得把例如192.168.199.100:5000這樣的內網地址作為私有倉庫地址,這時會發現無法成功推送鏡像。
這是因為Docker默認不允許非HTTPS方式推送鏡像。我們可以通過Docker的配置選項來取消這個限制。
- Ubuntu 16.04+, Debian 8+, centos7等使用systemd的系統
請在 /etc/docker/daemon.json 中寫入如下內容(如果文件不存在請新建該文件)
- 重啟docker服務:
3.3 私有倉庫高級配置
前面搭建了一個具有基礎功能的私有倉庫,更安全的方式是使用自簽名證書,具體可以參考docker官網介紹
本小節我們來使用Docker Compose搭建一個擁有權限認證、TLS的私有倉庫。這種方式可以在測試環境中使用,因為可信的證書頒發機構都需要有一個可用的域名,我們在內網部署的時候不一定是有域名的,可能就是一個內網IP地址。
- 在docker registry的server上新建一個文件夾,以下步驟均在該文件夾中進行。
3.3.1 準備站點證書
這里我們假設沒有互聯網域名,所以這里使用openssl自行簽發證書(如果擁有一個域名,可以使用國內各大云服務商均提供免費的站點證書)。
假設我們將要搭建的私有倉庫地址為docker.domain.com,下面我們介紹使用openssl自行簽發docker.domain.com的站點SSL證書。
- 第一步創建CA私鑰。
- 第二步利用私鑰創建CA根證書請求文件。
以上命令中-subj參數里的/C表示國家,如CN;/ST表示省;/L表示城市或者地區;/O表示組織名;/CN通用名稱。
- 第三步配置CA根證書,新建root-ca.cnf。
第四步簽發根證書。
$ openssl x509 -req -days 3650 -in "root-ca.csr" \-signkey "root-ca.key" -sha256 -out "root-ca.crt" \-extfile "root-ca.cnf" -extensions \root_ca- 第五步生成站點SSL私鑰。
- 第六步使用私鑰生成證書請求文件。
- 第七步配置證書,新建site.cnf文件。
- 第八步簽署站點SSL證書。
這樣已經擁有了docker.domain.com的網站SSL私鑰docker.domain.com.key和SSL證書docker.domain.com.crt及CA根證書root-ca.crt。
新建ssl文件夾并將docker.domain.com.key、docker.domain.com.crt、root-ca.crt這三個文件移入,刪除其他文件。
3.3.2 配置私有倉庫
私有倉庫默認的配置文件位于容器內的/etc/docker/registry/config.yml,我們先在本地編輯config.yml,之后掛載到容器中。
version: 0.1 log:accesslog:disabled: truelevel: debugformatter: textfields:service: registryenvironment: staging storage:delete:enabled: truecache:blobdescriptor: inmemoryfilesystem:rootdirectory: /var/lib/registry auth:htpasswd:realm: basic-realmpath: /etc/docker/registry/auth/nginx.htpasswd http:addr: :443host: https://docker.domain.comheaders:X-Content-Type-Options: [nosniff]http2:disabled: falsetls:certificate: /etc/docker/registry/ssl/docker.domain.com.crtkey: /etc/docker/registry/ssl/docker.domain.com.key health:storagedriver:enabled: trueinterval: 10s threshold: 3- 生成http認證文件
將上面的 username password 替換為你自己的用戶名和密碼。
- 編輯docker-compose.yml
- 修改hosts,編輯/etc/hosts
這樣我們就搭建好了一個具有權限認證、TLS的私有倉庫,接下來我們測試其功能是否正常。
3.3.3 測試私有倉庫功能
由于自行簽發的CA根證書不被系統信任,所以我們需要將CA根證書ssl/root-ca.crt移入/etc/docker/certs.d/docker.domain.com文件夾中。
$ sudo mkdir -p /etc/docker/certs.d/docker.domain.com$ sudo cp ssl/root-ca.crt /etc/docker/certs.d/docker.domain.com/ca.crt登錄到私有倉庫。
$ docker login docker.domain.com嘗試推送、拉取鏡像。
$ docker pull ubuntu:18.04$ docker tag ubuntu:18.04 docker.domain.com/username/ubuntu:18.04$ docker push docker.domain.com/username/ubuntu:18.04$ docker image rm docker.domain.com/username/ubuntu:18.04$ docker pull docker.domain.com/username/ubuntu:18.04如果我們退出登錄,嘗試推送鏡像。
$ docker logout docker.domain.com$ docker push docker.domain.com/username/ubuntu:18.04no basic auth credentials發現會提示沒有登錄,不能將鏡像推送到私有倉庫中。
3.4 Nexus3
使用Docker官方的Registry創建的倉庫面臨一些維護問題。比如某些鏡像刪除以后空間默認是不會回收的,需要一些命令去回收空間然后重啟Registry。在企業中把內部的一些工具包放入Nexus中是比較常見的做法,最新版本Nexus3.x 全面支持Docker的私有鏡像。所以使用Nexus3.x一個軟件來管理Docker,Maven,Yum,PyPI等是一個明智的選擇。
3.4.1 啟動Nexus容器
$ docker run -d --name nexus3 --restart=always \-p 8081:8081 \--mount src=nexus-data,target=/nexus-data \sonatype/nexus3首次運行需等待3-5分鐘,你可以使用docker logs nexus3 -f查看日志:
$ docker logs nexus3 -f2021-03-11 15:31:21,990+0000 INFO [jetty-main-1] *SYSTEM org.sonatype.nexus.bootstrap.jetty.JettyServer - -------------------------------------------------Started Sonatype Nexus OSS 3.30.0-01-------------------------------------------------如果你看到以上內容,說明Nexus已經啟動成功,你可以使用瀏覽器打開http://YourIP:8081訪問Nexus了。例如:http://10.30.185.122:8081/
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Nx0jnLRP-1655689956680)(https://note.youdao.com/yws/res/25638/WEBRESOURCEea1c7e91e13c438d318aa0c9acd07a6d)]
其數據目錄為:
root@pang-HP:/var/lib/docker/volumes/nexus-data# ll 總用量 12 drwx-----x 3 root root 4096 6月 17 14:41 ./ drwx-----x 4 root root 4096 6月 17 14:41 ../ drwxr-xr-x 15 200 200 4096 6月 17 16:09 _data/ root@pang-HP:/var/lib/docker/volumes/nexus-data#首次運行請通過以下命令獲取初始密碼:
$ docker exec nexus3 cat /nexus-data/admin.password9266139e-41a2-4abb-92ec-e4142a3532cb首次啟動Nexus的默認帳號是admin,密碼則是上邊命令獲取到的,點擊右上角登錄,首次登錄需更改初始密碼。
登錄之后可以點擊頁面上方的齒輪按鈕按照下面的方法進行設置。
3.4.2 創建倉庫
創建一個私有倉庫的方法:Repository->Repositories點擊右邊菜單Create repository選擇docker (hosted)
- Name: 倉庫的名稱
- HTTP: 倉庫單獨的訪問端口(例如:5000)
- Hosted -> Deployment pollcy: 請選擇Allow redeploy否則無法上傳Docker鏡像。
其它的倉庫創建方法請各位自己摸索,還可以創建一個docker (proxy) 類型的倉庫鏈接到DockerHub上。再創建一個 docker (group) 類型的倉庫把剛才的hosted與proxy添加在一起。主機在訪問的時候默認下載私有倉庫中的鏡像,如果沒有將鏈接到DockerHub中下載并緩存到Nexus中。
3.4.3 添加訪問權限
菜單Security->Realms把Docker Bearer Token Realm移到右邊的框中保存。
添加用戶規則:菜單Security->Roles->Create role在Privlleges選項搜索docker把相應的規則移動到右邊的框中然后保存。
添加用戶:菜單Security->Users->Create local user在Roles選項中選中剛才創建的規則移動到右邊的窗口保存。
3.4.4 重啟nexus服務,開放5000端口
(base) pang@pang-HP:~$ sudo docker stop nexus3 nexus3 (base) pang@pang-HP:~$ sudo docker rm nexus3 nexus3 (base) pang@pang-HP:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 98bbce6f5691 centos:7 "/bin/bash" 3 days ago Up 3 days reverent_morse (base) pang@pang-HP:~$ (base) pang@pang-HP:~$ sudo docker run -d --name nexus3 --restart=always \-p 8081:8081 \-p 5000:5000 \--mount src=nexus-data,target=/nexus-data \sonatype/nexus3 9a102684ab20514cad0e84617f4f4185120a23b306d76f12f920152c6c0acb6f (base) pang@pang-HP:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a102684ab20 sonatype/nexus3 "sh -c ${SONATYPE_DI…" 9 seconds ago Up 9 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp, 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp nexus3 98bbce6f5691 centos:7 "/bin/bash" 3 days ago Up 3 days reverent_morse (base) pang@pang-HP:~$ ss -tan State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ... LISTEN 0 4096 0.0.0.0:5000 0.0.0.0:* ... LISTEN 0 4096 0.0.0.0:8081 0.0.0.0:* ... (base) pang@pang-HP:~$3.4.5 測試
- curl命令
3.4.6 docker登錄倉庫
(base) pang@pang-HP:~$ sudo docker login http://10.30.185.122:5000 Username: pang Password: Error response from daemon: Get "https://10.30.185.122:5000/v2/": http: server gave HTTP response to HTTPS client (base) pang@pang-HP:~$nexsu倉庫開的是http,docker要走https。參考3.2.4節處理。處理后重新登錄:
(base) pang@pang-HP:/etc/docker$ sudo docker login http://10.30.185.122:5000 Authenticating with existing credentials... Login did not succeed, error: Error response from daemon: Get "http://10.30.185.122:5000/v2/": dial tcp 10.30.185.122:5000: connect: connection refused Username (admin): pang Password: Error response from daemon: Get "http://10.30.185.122:5000/v2/": dial tcp 10.30.185.122:5000: connect: connection refused (base) pang@pang-HP:/etc/docker$此時發現,創建的賬戶pang無法登錄(無法登錄原因未解決 ???)。重新使用admin登錄成功:
(base) pang@pang-HP:/etc/docker$ sudo docker login http://10.30.185.122:5000 Username: admin Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded (base) pang@pang-HP:/etc/docker$3.4.7 操作鏡像
- 上傳鏡像到Nexus3中
- 檢查Nexus3中鏡像結果
3.4.8 服務端啟動方式改進,將Nexus3注冊成系統服務
- 編寫Linux文件 vim /etc/systemd/system/nexus.service
- 停止和刪除命令行啟動的nexus服務
用systemd啟動服務
# systemctl daemon-reload # systemctl start nexus # systemctl enable nexus # systemctl status nexus3.4.9 改nexus倉庫的http為https
前面我們用docker容器搭建nexus服務,創建了一個的鏡像倉庫,倉庫端口為5000,協議為http,不是https。nexsu倉庫開的是http,dockr 要走https,我們是通過在客戶端添加倉庫信任解決的。
那么,有沒有更符合最佳實踐的方式呢?有!用nexus-https鏡像,nexus官方鏡像的改進版
具體可以參考:【nexus】用nexus3.x 官方鏡像搭建docker私有鏡像倉庫
總結
以上是生活随笔為你收集整理的Docker笔记-04 仓库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell - 循环的2种方式
- 下一篇: 学习OpenCV3——图像旋转算法实现