天天看點

三、基于 Docker-registry/Nexus3 搭建本地倉庫

本文是《Docker必知必會系列》第三篇,原文釋出于個人部落格:悟塵紀。

上一篇:Docker必知必會系列(二):基于 Dockerfile 建構并運作鏡像

Docker 鏡像倉庫

Repository(倉庫)是集中存放鏡像的地方。一個 Docker Registry 中可以包含多個 Repository(倉庫),每個倉庫可以包含多個 Tag(标簽),每個标簽對應一個 Image(鏡像)。

最常使用的 Registry 公開服務是官方的 Docker Hub,這也是預設的 Registry。使用者也可以建立本地倉庫友善内部使用。

1、官方公共倉庫 Docker Hub

目前 Docker 官方維護了一個公共倉庫 Docker Hub,其中已經包括了數量超過 2,650,000 的鏡像。大部分需求都可以通過在 Docker Hub 中直接下載下傳鏡像來實作。

你可以在 https://hub.docker.com 免費注冊一個 Docker 賬号。通過執行

docker login

指令互動式的輸入使用者名及密碼來完成在指令行界面登入 Docker Hub。

推送鏡像

使用者可以在登入後通過

docker push

指令來将自己的鏡像推送到 Docker Hub。

以下指令中的

lxl823

請替換為你的 Docker 賬号使用者名。

docker tag nginx lxl823/nginx:1.17.9
docker image ls
REPOSITORY       TAG            IMAGE ID            CREATED             SIZE
nginx            latest          6678c7c2e56c        6 days ago          127MB
lxl823/nginx     1.17.9          6678c7c2e56c        6 days ago          127MB

docker push lxl823/nginx:1.17.9
           

登入 hub.docker.com ,可以看到鏡像已經釋出到倉庫中。

三、基于 Docker-registry/Nexus3 搭建本地倉庫

自動建構

Docker Hub 可以自動從外部存儲庫中的源代碼建構鏡像,并将生成的鏡像自動推送到您的 Docker 存儲庫。

設定自動建構允許使用者通過 Docker Hub 指定跟蹤一個目标網站(支援 GitHub)上的項目,一旦項目發生新的送出 (commit)或者建立了新的标簽(tag),Docker Hub 會自動建構鏡像并推送到 Docker Hub 中。

要配置自動建構,包括如下的步驟:

  • 登入 Docker Hub;
  • 在 Docker Hub 點選右上角頭像,在賬号設定(Account Settings)中關聯(Linked Accounts)目标網站;
  • 在 Docker Hub 中建立或選擇已有的倉庫,在

    Builds

    頁籤中選擇

    Configure Automated Builds

  • 選取一個目标網站中的項目(需要含

    Dockerfile

    )和分支;
  • 指定

    Dockerfile

    的位置,并儲存。

之後,可以在 Docker Hub 的倉庫頁面的

Timeline

頁籤中檢視每次建構的狀态。

進一步了解:Set up automated builds

2、基于 docker-registry 搭建本地倉庫

docker-registry

是官方提供的工具,可以用于建構私有的鏡像倉庫。本文内容基于

docker-registry

v2.x 版本。

安裝運作 docker-registry

你可以通過擷取官方

registry

鏡像來運作。

docker run -d -p 5000:5000 --restart=always --name registry registry
           

這将使用官方的

registry

鏡像來啟動私有倉庫。預設情況下,倉庫會被建立在容器的

/var/lib/registry

目錄下。你可以通過

-v

參數來将鏡像檔案存放在本地的指定路徑。

建立好私有倉庫之後,就可以使用

docker tag

來标記一個鏡像,然後使用

docker push

推送它到倉庫。

3、基于 Nexus3 搭建本地倉庫

在企業中把内部的一些工具包放入 Nexus 中是比較常見的做法。 Nexus 不僅能夠用于建立 Maven 私服,還可以用來建立 yum、pypi、npm、nuget、rubygems 等各種私有倉庫。而且,Nexus 從 3.0 版本也開始支援建立 Docker 鏡像倉庫了!

拉取并啟動 nexus 容器

docker run -d \
    --name nexus \
    -p 8085:8081 \
    -p 8086:8086 \
    -v nexus_data:/nexus-data \
    sonatype/nexus3:latest
           

等待 3-5 分鐘,如果

nexus

容器沒有異常退出,就可以使用浏覽器打開

http://localhost:8085

通路 Nexus 了。

建立本地倉庫

建立一個私有倉庫的方法:

Repository -> Repositories

點選右邊菜單

Create repository

選擇

docker (hosted)

  • Name:倉庫的名稱
  • HTTP:倉庫單獨的通路端口,如

    8086

  • Hosted -> Deployment pollcy:請選擇 Allow redeploy 否則無法上傳 Docker 鏡像。

還可以建立一個 docker (proxy) 類型的倉庫連接配接到 DockerHub 上。再建立一個 docker (group) 類型的倉庫把剛才的 hosted 與 proxy 添加在一起。主機在通路的時候預設下載下傳私有倉庫中的鏡像,如果沒有将連接配接到 DockerHub 中下載下傳并緩存到 Nexus 中。

添加通路權限

菜單

Security -> Realms

把 Docker Bearer Token Realm 移到右邊的框中儲存。

添加使用者規則:菜單

Security->Roles

->

Create role

Privlleges

選項搜尋 docker 把相應的規則移動到右邊的框中然後儲存。

Nginx 加密代理

部署 Nginx 時,我們先需要獲得 SSL 證書。目前提供免費證書的雲服務商很多,也可以使用

openssl

自行簽發證書。我們還還需要 2 個域名,一個用來展示 nexus 前台,另一個用做 docker 倉庫。Nginx 配置如下:

server {
    listen 80;
    server_name nexus3.lixl.cn;  # nexus 前台

    location / {
        proxy_pass http://local.lixl.cn:8085;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Via "nginx";
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

server {
    listen 443 ssl;
    server_name nexus.lixl.cn;  # docker 倉庫

    ssl_certificate /etc/nginx/certs/nexus.lixl.cn.crt;
    ssl_certificate_key /etc/nginx/certs/nexus.lixl.cn.key;

    ssl_session_timeout  5m;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;

    location / {
        proxy_pass http://local.lixl.cn:8086;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Via "nginx";
        client_max_body_size 1024M;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

server {
    listen 80;
    server_name nexus.lixl.cn;  # docker 倉庫

    return 301 https://$server_name$request_uri;
}
           

登入本地倉庫并推送鏡像

使用

docker login

進行測試,使用者名密碼與 Nexus 賬号一緻。

docker login https://nexus.lixl.cn
Username: admin
Password:
Login Succeeded
           

通過

docker push

指令将自己的鏡像推送到 Nexus:

docker tag nginx nexus.lixl.cn/nginx:20200326
docker image ls
REPOSITORY             TAG             IMAGE ID            CREATED             SIZE
nginx                  latest          6678c7c2e56c        6 days ago          127MB
nexus.lixl.cn/nginx    20200326        6678c7c2e56c        6 days ago          127MB

docker push nexus.lixl.cn/nginx:20200326
           

推送成功。在本地倉庫即可看到新推送的鏡像:

三、基于 Docker-registry/Nexus3 搭建本地倉庫

相關文章

  • 上一篇:Docker必知必會系列(二):基于 Dockerfile 建構并運作鏡像
  • 下一篇:Docker必知必會系列(四):Docker 網絡原理、分類及容器互聯配置