Docker 實戰系列(二):在 Docker Hub 上分享自己的 image

Larry Lu
Larry・Blog
Published in
3 min readDec 11, 2017

--

You can find the English version at Pushing Your Docker Images to Docker Hub: A Step-by-Step Guide.

看完上一篇一步一步帶你 dockerize 你的應用之後,我已經會寫 Dockerfile 也知道怎麼 build 出自己的 image 了,但是我要怎麼把 image 分享出去給別人使用呢?沒錯,這就是這篇要講的

Docker Registry

Docker Hub 是官方提供的 Docker Registry,所謂的 Docker Registry 就是一個讓大家可以 pull(下載)或是 push(上傳)image 的地方,把 image 上傳到 Docker Registry 後大家就可以直接 pull 下來用,不用再根據 Dockerfile 自建出 image

官方 VS 非官方 image

在 Docker Hub 上的 image 有分成官方跟非官方兩種,像 ubuntumysql 這種就是官方的,在安全性跟品質上也比較有保證,要使用就直接 docker pull <image> 就可以了

那像 larry850806/nodejs-workspace 這個是我自己 build 出來的 image,前面就會有我的 username,如果要 pull 下來的話就要 docker pull larry850806/nodejs-workspace

Build And Push To Docker Hub

這次要教大家在 Docker Hub 上分享自己的 image,如果還沒有 Docker Hub 帳號的可以先去申請一個,這次也會用 simple-express-server 當做範例,如果你有其他專案可以 build 出 image 也可以拿來試試看

Build From Dockerfile

因為要上傳到 Docker Hub 上面,所以在 build 時要加上自己的 username,像我就是 docker build -t larry850806/simple-express-server .,build 完會多一個叫做 larry850806/simple-express-server 的 image,這個 image 總共是 677 MB(么壽好肥)

Login

在 push 之前必須先跑 docker login 登入,如果有申請帳號的話應該是不會有什麼問題,打打帳號密碼就 ok 了,另外如果你之前已經登入過就不用再次登入囉~ docker 會幫你把 credential 存起來

Push To Docker Hub

登入完就直接跑 docker push larry850806/simple-express-server 把 image push 上去,但你可能會想,這個 image 有 677MB 欸,這樣不就要 push 超久嗎?就像是要傳一個超~大的檔案上去 server 一樣

其實不會,還記得之前說過 image 是一層一層疊加起來的嗎,現在這個 image 是 based on node:9.2.0,你在 push 的時候他只會上傳你新增的幾層,至於底下沒變更的那幾層就不需要 push,直接沿用 node:9.2.0

可以看到很多層都是 Mounted from library/node,真正需要 push 的只有最上面的兩層,所以還滿快的,push 完到 Docker Hub 上面就可以看到自己發佈的 image 了~因為是公開的所以別人也可以使用

但每次更新了 source code 或是 Dockerfile 之後,都要自己 build 再 push 上去,這樣很麻煩欸,有沒有工具可以自動幫我做這些事阿?

Automated Build

Automated Build 是 Docker Hub 提供的功能,他可以在你的 Github repo 有更新時就馬上根據 Dockerfile 幫你 build 一個新的 image,要使用這個功能首先到 Docker Hub 右上角點選 Create Automated Build

接著選 Github 或是 Bitbucket 告訴他你想幫哪個 repo 建立 Automated Build,我這邊是選我自己的 simple-express-server,因為 build 需要 Dockerfile,如果你現在手上沒有任何專案有 Dockerfile 的話,可以 fork 我的專案跟著做做看

給他一個 image 名字跟簡短的說明就可以了

設定觸發時機

新增完到 Build Settings 裡面看一下,現在有兩條規則:

  1. 每次 master 有新的 commit 時就自動 build 一個 image:latest
  2. 每次某個 branch 有新的 commit 時自動 build 一個 image:<branch name>

基本上不需要去改他,除非你要做更進階的設定

Push 新版本到 Github 上

Automated Build 已經設定完了,實際 push 一個新的 commit 到 Github 上,會看到 Build Details 裡面多了一個正在 build 的 image,之前說過只要有一樣的 Dockerfile,不管在哪裡 build 結果都會是一樣的,現在就是在 Docker 官方的主機上 Build

設定通知

如果在 build 的過程中發生了錯誤,那你應該會想收到通知吧?可以到通知這邊設定一下,發生錯誤的時候就會寄信跟你說

整個都設定完了之後就輕鬆了~以後只要有任何新的 code push 到 Github repo 上,Docker Hub 就會馬上 build 出一個新的 image,如果要在 server 上部屬的話直接從 Docker Hub 把它 pull 下來跑就可以了

題外話

雖然 Docker Hub 上的 Automated Build 看起來很猛很方便 XD,但也是有缺點的,在 Docker Hub 上最多只能有一個私人專案,超過就不能再建立了

但也不可能因此把私人或公司專案設公開,因為裡面有你的 code 還有 API_KEY 等等敏感資料,所以只能乖乖花錢買私人專案的額度,或是用其他免費的 docker registery 像是 canister 或是 treescale,如果考量安全性的話也可以自己架,但就會稍微麻煩一點

總結

這是系列文的第二篇,講了如何 push image 到 Docker Hub 上還有建立 Automated Build,如果是自己的專案想要方便部屬可以考慮用用看,或是要自己 build 一個像是 php + mysql 之類的環境回饋給社群也很不錯XD

下一篇講的是怎麼在 container 內跟本機共用檔案,有興趣的人歡迎追蹤我,謝謝大家~

下一篇:Docker 實戰系列(三):使用 Volume 保存容器內的數據

--

--

我是 Larry 盧承億,傳說中的 0.1 倍工程師。我熱愛技術、喜歡與人分享,專長是 JS 跟 Go,平常會寫寫技術文章還有參加各種技術活動,歡迎大家來找我聊聊~