自己構建的Docker鏡像,默認存儲在本機中,Docker有提供某些方式分享這些鏡像,但不是主流的鏡像分享方式,也有違於開源社區的共享精神。
本文介紹如何使用GitHub托管Dockerfile;使用DockerHub關聯GitHub托管的Dockerfile,進行自動化構建,並托管構建后的鏡像。
GitHub地址:https://github.com。
DockerHub地址:https://hub.docker.com。
Dockerfile及鏡像構建的相關知識可參考我之前寫的幾篇博文:
准備工作
注冊GitHub和DockerHub。GitHub主要是用於托管源代碼(即托管Dockerfile文件);DockerHub主要用於構建和托管鏡像。
兩個平台都是免費的,但是因為服務器在國外,訪問不是很穩定,原因大家都懂。
使用GitHub托管Dockerfile
參考本人的一個Tomcat Dockerfile倉庫:https://github.com/dfengwei/docker-tomcat
主要步驟:
- 新建一個倉庫(
New repository),例如命名為:docker-tomcat。 - 通過git提交(或直接通過界面編輯)源碼,目錄結構可以參考我的倉庫,也可參考一些官方倉庫。
- 編寫
README.md文件(強烈建議)。
GitHub是個很常用的平台,具體操作這里就不細講了,網上資料也很多。
使用DockerHub構建並托管鏡像
參考本人的一個Tomcat鏡像倉庫:https://hub.docker.com/r/dfengwei/docker-tomcat
主要步驟
- 新建一個自動構建(
Create Automated Build),關聯並驗證GitHub賬戶。再選擇GitHub賬戶中的一個倉庫,也就是剛才創建的docker-tomcat倉庫。 - 打開
Build Settings選項卡,進行構建細節的配置。構建配置因為比較復雜和重要,我們下面再細講,這里不展開。配置好后DockerHub會自動根據配置構建鏡像並托管。當然你也可以手動觸發構建。 - 打開
Repo Info選項卡,編寫Short Description和Full Description。Short Description是個簡介,Full Description是詳細介紹,建議復制GitHub中的README.md內容。 - 通過
Repo Info選項卡中的Docker Pull Command中顯示的命令即可獲取本鏡像(該命令沒指明版本號,請按需添加)。
DockerHub構建配置
主要配置界面

配置自動構建
勾選 When active, builds will happen automatically on pushes. 復選框。當GitHub中對應的文件變動后,會自動推送給DockerHub,DockerHub會自動重新構建鏡像。
添加Trigger
先解釋下各列的含義(可以點擊界面上的 Show more 按鈕查看英文版的簡單說明):
| 字段 | 說明 |
|---|---|
| Type | 指GitHub中的Dockerfile的版本,可以是Branch或Tag。Branch和Tag是git中的概念,不明白的請自行百度。 |
| Name | 如果Type選的是Branch,請固定使用 master 作為值;如果Type選的是Tag,請使用一個正則表達式做為值,用於匹配tag。 |
| Dockerfile Location | Dockerfile路徑,這個估計大家都理解。/ 對應的是GitHub中倉庫的根路徑。例如我的Tomcat8.5 Dockerfile路徑為:/8.5/jre8/Dockerfile |
| Docker Tag Name | 鏡像版本標簽。標簽的命名雖然沒有標准,但也請遵循一定的規律。最好是先參考官方的一些鏡像標簽。 |
DockerHub提供的這種配置和構建方式十分靈活,多個標簽其實可以使用同一個Dockerfile文件。構建歷史可以通過 Build Details 選項卡查看。
添加Repository Links
該功能的主要作用是監控其他鏡像倉庫的變動,觸發本倉庫的自動構建。建議添加父鏡像所在的倉庫。此后,父鏡像所在的倉庫的變動都將觸發本倉庫的自動構建。例如父鏡像緊急修復了一個BUG並重新構建了鏡像,那么我們的鏡像也會跟着重新構建。當然,如果我們鏡像已經被某個用戶在使用了,那么除非該用戶update這個鏡像,否則該鏡像不會自動更新至最新版本。
Build Triggers
DockerHub提供Http接口供有需要的用戶觸發構建。例如你有個自動化腳本想要觸發倉庫的自動化構建,就可以通過本功能實現。
使用其他倉庫托管鏡像
除了DockerHub外,還有很多平台提供鏡像托管服務,比如我使用的阿里雲容器Hub:https://dev.aliyun.com。
參考本人在阿里雲開發者平台上托管的一個Tomcat鏡像倉庫:https://dev.aliyun.com/detail.html?spm=5176.1972343.2.2.599c57159oCWBq&repoId=50185。
獲取這個平台的鏡像時,必須帶上平台域名,例如:
$ docker pull registry.cn-hangzhou.aliyuncs.com/dfengwei/docker-tomcat
第三方平台的鏡像倉庫的配置方式大多都和DockerHub類似,源碼托管(Dockerfile托管)的方式也有多種。為了不重復勞動,我在阿里雲容器Hub上關聯的是上面配置的GitHub倉庫。也就是說,我用同一份Dockerfile會生成兩份鏡像,一份在DockerHub上,一份在阿里雲容器Hub上,兩份鏡像的內容其實是一樣的,不過pull的方式略有不同。
當然,Dockerfile源碼托管的方式除了GitHub外,也有很多選擇余地,這里不再展開。
