Docker 倉庫

若是還未了解過 Docker, 建議先閱讀上一篇文章 初識 Dockerphp


倉庫(Repository)就是存放鏡像的地方。相似於 NodenpmPythonPyPihtml

註冊服務器(Registry)的概念比較容易與倉庫混淆。實際上註冊服務器是用來管理倉庫的服務器,一個服務器上能夠存在多個倉庫,而每一個倉庫下能夠有多個鏡像。前端

例如對於倉庫地址 hub.dockerpool.com/nginx 來講,hub.dockerpool.com 是註冊服務器的地址,nginx 是倉庫名。linux

Docker Hub

目前 Docker 官方維護的一個公共倉庫,大部分需求咱們均可以從 Docker Hub 中直接下載鏡像來實現。nginx

註冊

咱們能夠在 hub.docker.com/ 註冊一個 Docker 帳號。git

登陸

能夠經過 docker login 命令在終端輸入用戶名及密碼來完成 Docker Hub 的登陸。web

咱們也能夠經過 docker logout 退出登陸。docker

鏡像分類

經過上一篇文章能夠知道,使用 docker search 搜索鏡像時,搜索出來能夠看到下面的鏡像列表。npm

$ docker search nginx
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                             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…   78
bitnami/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…   24
nginx/nginx-ingress               NGINX Ingress Controller for Kubernetes         22
privatebin/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]
複製代碼

根據是不是官方提供,能夠將鏡像分爲兩類。json

一類是相似 nginx 這樣的鏡像,被稱爲基礎鏡像或跟鏡像。這些基礎鏡像由 Docker 公司建立、驗證、支持、提供。這樣的鏡像每每使用單個單詞做爲名字。

還有一種類型,好比 feiben/nginx 鏡像,它是由 Docker Hub 的註冊用戶建立並維護的,每每帶有用戶名稱前綴。能夠經過前綴 username/ 來指定使用某個用戶提供的鏡像,好比 feiben 用戶。

推送鏡像

用戶登陸後能夠經過 docker push 命令來把本身的鏡像推送到 Docker Hub,例如將 nginx 鏡像改爲咱們本身的鏡像,而後推送到 Docker Hub。

首先經過 docker pull nginxnginx 鏡像下載到本地。

nginx 添加標籤 docker tag nginx feiben/nginx:1.17.5

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
feiben/nginx        1.17.5              f949e7d76d63        2 weeks ago         126MB
nginx               latest              f949e7d76d63        2 weeks ago         126MB
複製代碼

將本身的鏡像推送到 Docker Hub

$ docker push feiben/nginx:1.17.5
The push refers to repository [docker.io/feiben/nginx]
509a5ea4aeeb: Mounted from library/nginx
3bb51901dfa3: Mounted from library/nginx
2db44bce66cd: Mounted from library/nginx
1.17.5: digest: sha256:066edc156bcada86155fd80ae03667cf3811c499df73815a2b76e43755ebbc76 size: 948
複製代碼

稍等片刻,咱們就能夠搜索出推送的鏡像了

$ docker search feiben
NAME                DESCRIPTION         STARS               OFFICIAL            AUTOMATED
feiben/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:latest
The push refers to repository [domain/nginx]
Get https://domain/v2/: EOF
複製代碼

出現上面的提示時,說明推送失敗了。由於 Docker 默認使用 HTTPS 的方式推送鏡像。咱們能夠經過 Docker 的配置來取消這個限制。

對於 Linux 系統,咱們能夠在 /etc/docker/deamon.jsondeamon.josn 文件不存在則新建該文件)添加下面的配置

{ "insecure-registries": ["domain:5000"] }
複製代碼

對於桌面版,咱們能夠在 Docker 的設置 Daemon 選項中的 Insecure registries 中加上 domain:5000

【注】若是倉庫主機是遠程服務器的話,須要將服務器與本地的 docker 配置進行修改

設置完成後再使用上面的命令進行推送。除了上面這種方式外,咱們也能夠將私有倉庫的地址配置成支持 HTTPS 訪問的,本文就不做展開了。

$ docker push domain:5000/nginx:latest
The push refers to repository [domain:5000/nginx]
509a5ea4aeeb: Pushed
3bb51901dfa3: Pushed
2db44bce66cd: Pushed
latest: 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","tags":["latest"]}
複製代碼

下載鏡像

首先咱們經過 docker rmi 將本地的鏡像刪除(取消標籤)。

$ docker rmi domain:5000/nginx
Untagged: domain:5000/nginx:latest
Untagged: domain:5000/nginx@sha256:066edc156bcada86155fd80ae03667cf3811c499df73815a2b76e43755ebbc76
複製代碼

再使用 docker images 確認 domain:5000/nginx 這個鏡像在本地不存在,接下來咱們就能夠從私有倉庫進行下載。

$ docker pull domain:5000/nginx:latest
複製代碼

除了使用官方提供的 Registry,咱們也可使用 Nexus3.x 來建立倉庫,關於如何使用 Nexus 版本的倉庫將放到下一篇文章中。固然你也能夠從 https://docker_practice.gitee.io/zh-cn/repository/nexus3_registry.html 學習。


若是你喜歡個人文章,但願能夠關注一下個人公衆號【前端develop】

前端develop
相關文章
相關標籤/搜索