docker 推送到本地倉庫_Docker 倉庫
技術標籤:docker 推送到本地倉庫
Docker
如果還未了解過 Docker, 建議先閱讀上一篇文章 初識 Docker。
倉庫(Repository)就是存放映象的地方。類似於 Node 的 npm; Python 的 PyPi。
註冊伺服器(Registry)的概念比較容易與倉庫混淆。實際上註冊伺服器是用來管理倉庫的伺服器,一個伺服器上可以存在多個倉庫,而每個倉庫下可以有多個映象。
例如對於倉庫地址 hub.dockerpool.com/nginx 來說,hub.dockerpool.com 是註冊伺服器的地址,nginx 是倉庫名。
Docker Hub
目前 Docker 官方維護的一個公共倉庫,大部分需求我們都可以從 Docker Hub 中直接下載映象來實現。
註冊
我們可以在 hub.docker.com/ 註冊一個 Docker 賬號。
登入
可以通過 docker login 命令在終端輸入使用者名稱及密碼來完成 Docker Hub 的登入。
我們也可以通過 docker logout 退出登入。
映象分類
通過上一篇文章可以知道,使用 docker search 搜尋映象時,搜尋出來可以看到下面的映象列表。
$ docker search nginxNAME DESCRIPTION STARS OFFICIAL AUTOMATEDnginx Official build of Nginx. 12036 [OK]jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1671 [OK]richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 742 [OK]linuxserver/nginx An Nginx container, brought to you by LinuxS… 78bitnami/nginx Bitnami nginx Docker Image 71 [OK]tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 56 [OK]nginxdemos/hello NGINX webserver that serves a simple page co… 28 [OK]jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 24 [OK]jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 24nginx/nginx-ingress NGINX Ingress Controller for Kubernetes 22privatebin/nginx-fpm-alpine PrivateBin running on an Nginx, php-fpm & Al… 18 [OK]schmunk42/nginx-redirect A very simple container to redirect HTTP tra… 17 [OK]blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 12 [OK]複製程式碼
根據是否是官方提供,可以將映象分為兩類。
一類是類似 nginx 這樣的映象,被稱為基礎映象或跟映象。這些基礎映象由 Docker 公司建立、驗證、支援、提供。這樣的映象往往使用單個單詞作為名字。
還有一種型別,比如 feiben/nginx 映象,它是由 Docker Hub 的註冊使用者建立並維護的,往往帶有使用者名稱稱字首。可以通過字首 username/ 來指定使用某個使用者提供的映象,比如 feiben 使用者。
推送映象
使用者登入後可以通過 docker push 命令來把自己的映象推送到 Docker Hub,例如將 nginx 映象改成我們自己的映象,然後推送到 Docker Hub。
首先通過 docker pull nginx 將 nginx 映象下載到本地。
給 nginx 新增標籤 docker tag nginx feiben/nginx:1.17.5
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEfeiben/nginx 1.17.5 f949e7d76d63 2 weeks ago 126MBnginx latest f949e7d76d63 2 weeks ago 126MB複製程式碼
將自己的映象推送到 Docker Hub
$ docker push feiben/nginx:1.17.5The push refers to repository [docker.io/feiben/nginx]509a5ea4aeeb: Mounted from library/nginx3bb51901dfa3: Mounted from library/nginx2db44bce66cd: Mounted from library/nginx1.17.5: digest: sha256:066edc156bcada86155fd80ae03667cf3811c499df73815a2b76e43755ebbc76 size: 948複製程式碼
稍等片刻,我們就可以搜尋出推送的映象了
$ docker search feibenNAME DESCRIPTION STARS OFFICIAL AUTOMATEDfeiben/nginx 0複製程式碼
自動構建
我們可以通過 Docker Hub 指定跟蹤一個目標網站(支援 GitHub 或 BitBucket)上的專案,專案一旦有新的提交或者建立了新標籤,將會觸發 Docker Hub 自動構建映象並推送到 Docker Hub中。
設定自動構建的步驟如下:
- 登入 Docker Hub
- 點選頭像,選擇 Account Setting 再選擇 Linked Accounts 管理賬號
- 在 Docker Hub 中新建或選擇已有的倉庫,在 Builds 選項卡中選擇 Configure Automated Builds
- 選取一個目標網站中的專案(需要含 Dockerfile)和分支
- 指定 Dockerfile 的位置,並儲存
完成自動構建配置之後,指定的分支一旦提交程式碼就會觸發自動構建,我們可以在倉庫頁面的 Timeline 選項卡中檢視每次構建的狀態。
除了 Docker Hub 的自動構建外,我們也可以使用 Travis CI 等持續整合工具來實現自動構建。
私有倉庫
公司的專案一般不予許我們上傳到 Docker Hub 這類的公共倉庫中,所有學會建立一個私有倉庫也是非常必要的。
容器執行
我們可以通過獲取官方的 registry 映象來執行。
$ docker run -d -p 5000:5000 --restart=always --name registry registry複製程式碼
這將使用官方提供的 registry 映象來啟動私有倉庫。預設情況下,倉庫會被建立在容器的 /var/lib/registry 目錄下。我們可以通過 -v 引數將映象檔案存放在本地的指定路徑。
$ docker run -d > -p 5000:5000 > -v /opt/data/registry:/var/lib/registry > --restart=always > registry複製程式碼
這時我們可以通過瀏覽器訪問 http://domain:5000/v2/_catalog 檢視倉庫是否啟動成功。
- 其中 domain 是你的域名或 ip 地址,下文中的 domain 同理。
在私有倉庫搜尋、上傳、下載映象
上傳映象
首先使用 docker tag 將本地的 nginx 映象新增標籤
$ docker tag nginx:latest domain/nginx:latest複製程式碼
接下來就可以使用 docker push 命令將映象推送到我們的私有倉庫中
$ docker push domain/nginx:latestThe push refers to repository [domain/nginx]Get https://domain/v2/: EOF複製程式碼
出現上面的提示時,說明推送失敗了。因為 Docker 預設使用 HTTPS 的方式推送映象。我們可以通過 Docker 的配置來取消這個限制。
對於 Linux 系統,我們可以在 /etc/docker/deamon.json (deamon.josn 檔案不存在則新建該檔案)新增下面的配置
{ "insecure-registries": ["domain:5000"] }複製程式碼
對於桌面版,我們可以在 Docker 的設定 Daemon 選項中的 Insecure registries 中加上 domain:5000。
【注】如果倉庫主機是遠端伺服器的話,需要將伺服器與本地的 docker 配置進行修改
設定完成後再使用上面的命令進行推送。除了上面這種方式外,我們也可以將私有倉庫的地址配置成支援 HTTPS 訪問的,本文就不作展開了。
$ docker push domain:5000/nginx:latestThe push refers to repository [domain:5000/nginx]509a5ea4aeeb: Pushed3bb51901dfa3: Pushed2db44bce66cd: Pushedlatest: digest: sha256:066edc156bcada86155fd80ae03667cf3811c499df73815a2b76e43755ebbc76 size: 948複製程式碼
當看到上面的資訊時,說明已經推送成功了。我們可以再次訪問 http://domain:5000/v2/_catalog 進行驗證
$ curl http://domain:5000/v2/_catalog{"repositories":["nginx"]}複製程式碼
看到這個說明上傳成功了。
搜尋映象
搜尋私有倉庫的映象並不能用 docker search 命令, 只能通過 http://domain:5000/v2/image_name/tags/list 檢視指定映象存在的 tag 列表
$ curl domain:5000/v2/nginx/tags/list{"name":"nginx