1. 程式人生 > 其它 >docker 推送到本地倉庫_Docker 倉庫

docker 推送到本地倉庫_Docker 倉庫

技術標籤:docker 推送到本地倉庫

5d327706f21ad7c2449dca54390b0877.png

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中。

設定自動構建的步驟如下:

  1. 登入 Docker Hub
  2. 點選頭像,選擇 Account Setting 再選擇 Linked Accounts 管理賬號
  3. 在 Docker Hub 中新建或選擇已有的倉庫,在 Builds 選項卡中選擇 Configure Automated Builds
  4. 選取一個目標網站中的專案(需要含 Dockerfile)和分支
  5. 指定 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