三、基於 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 hub 鏡像倉庫

自動構建

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 rolePrivlleges 選項搜索 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

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

本地倉庫新推送的鏡像

相關文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章