本文是《Docker必知必會系列》第三篇,原文發佈於個人博客:悟塵紀。
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 存儲庫。
設置自動構建允許用戶通過 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
推送成功。在本地倉庫即可看到新推送的鏡像: