建置一個開發Web服務用的Docker環境 (II)

建置一個開發Web服務用的Docker環境 (I)一文中我們提到建置客製化Image的需求
是因為Docker Hub之類的服務,雖然公開Repository是免費的
不過我們需要Private的,然而免費的只能有一個Repository,不敷使用
自己建置Repository Server又有需要權限管理、安全管理的問題
所以就選擇0金錢與維護成本的Dockerfile + 資料備份還原的方式來建立Image
讓協同開發者都有相同的開發與建置環境
我們將以Jenkins為例,完成客製化的Jenkins Image
(一)、在全新的Jenkins容器逐步進行相關設定
(二)、建置好一個專案,進行打包備份
(三)、透過Dockerfile與備份檔,將備份的資料移至全新容器,做一個新的Jenkins Image
  1. 必須做好Jenkin容器共用的配置
    才能確保Jenkins Build後,能直接佈署在WildFly Server上
    請參考Docker Container 檔案共享
  2. 以下的步驟如果已經閱讀過這篇文章則可以快速看過去,這邊只是講得更詳細一點
  1. 開啟全新的Jenkins容器,打開首頁會看到要輸入啟動密碼
  2. 可以取得啟動密碼的方式有很多,cat /var/jenkins_home/secrets/initialAdminPassword
    或是啟動時會看到console有跑出來下列資訊,再把資訊複製貼上即可(每次都會不同)
  3. 因為我們還要裝Nodejs套件,選擇「Select plugins to install」
  4. 搜尋並勾選Nodejs Plugin
  5. 點擊「Install」就會開始安裝
    有時候可能會因為網路環境安裝失敗,Retry就可以了
  6. 建立有管理者權限的使用者資訊
  7. 會看到成功訊息與Jenkins首頁 (沒有特別設定,但Jenkins似乎會自己抓語系,所以有中文介面)
  8. 點選「新增作業」
  9. 根據先前的情境,我們是bitBucket
    輸入專案名稱並選擇「建置 Free-Style 軟體專案」
  10. 專案設置頁面
    首先我們要先設定git的 repository,指向bitbucket的某個專案
    並選擇「Add」
  11. 配置ssh key
    將這些設定之後設定好之前,先確認是否已經將 id_rsa 與 id_rsa.pub
    放置於Jenkins容器內的 /var/jenkins_home/.ssh/ 裡
    這邊有兩點要特別注意
    1. 如果擁有者(Owner)是root會因權限不足而無法讀取
      Jenkins服務在該容器的執行身分是jenkins
      所以要確保Owner是jenkins:jenkins
    2. id_rsa產生時,按照預設的權限是600
      但這樣的權限會導致 Build image時權限不足而無法加到容器內
      所以要記得特別將id_rsa權限改成跟public key id_rsa.pub一樣的644
      加進去之後再把容器內的權限改回來即可
      切記,這組Key我們僅拿來Read Repository,不要做為其他用途
    進入jenkins容器的指令:
    bash -c "clear && docker exec -it jenkins bash"
    
  12. 設定Credential Key,如果當初建ssh key沒有密碼就不用輸入
    username填上跟public key一樣的信箱即可

    設定好後jenkins會立刻拿key去試,沒有警告訊息就可以繼續往下設定
    要確認bitbucket已經有把access key加入這個public key
  13. 建置觸發程序與建置環境設定

    這個Token,主要是用來之後可以用Shell script或Webhook觸發用的,觸發範例如下
    # USER_TOKEN可以在個人的管理頁面找到,也可以更新以確保Token的有效期限
    curl http://localhost:18080/job/devAngular/build?token=WebBuild --user jenkins_admin:<USER_TOKEN>
    
    設定好要給人呼叫的Token後
    會發現建置環境那的「NodeJS Installation」沒有選項可選
    是因為我們只裝Plugin,並沒指定要使用哪一版本的Node
    我們先儲存專案,回到首頁
  14. 管理Jenkins → Global Tool Configuration
  15. 安裝 Nodejs

    往下到NodeJS,我們選擇 NodeJS 8.9.3
    全域的Package我們輸入 npm@lastest @angular/cli
    確保npm的版本是最新的用意是
    可能會有非預期的錯誤,其實是npm的bug這類情況發生
    但這類bug被提報後,通常很快會修掉
    因此盡可能是新的才不會解到舊問題
    當然也可以安裝你認為穩定的指定版本
    安裝好後,回到剛剛專案設置的頁面
  16. 建置環境與建置設定
    建置環境選擇對應的Nodejs版本
    接著再建置選擇執行Shell,並輸入以下指令
    npm install 
    ng build
    rm -f /angular-dist/
    cp dist/* /angular-dist/ #看你們佈署在哪個目錄下
    
完成後,假設我們已經進入開發,建置數次
我們開發中歷經了幾次成功與失敗,目前的頁面長的像這樣
覺得差不多可以讓其他人加入開發了,於是參考這篇
備份完成我們的資料,有了 yt-backup.tar.gz 在 DockerProject/Jenkins/ 目錄下
還原的部分則是在Dockerfile下撰寫
  1. Jenkins Dockerfile 如下
    第4、5行是共用容器的配置
    第10、11行則是我們將我們所需的檔案,備份檔與ssh key放到 /usr/share/jenkins/ref/
    根據文件,所有想要最後Build出來放在 /var/jenkins_home/ 底下的檔案都要放那裡
    如果我們直接在Dockerfile 建置image的階段,先放入 /var/jenkins_home/ 是無效的
    第13行,就是到該目錄解壓縮並把壓縮檔刪除
    最後,第15、16行是將要裝的plugins放入並在build image時安裝
  2. 在 /DockerProject/Jenkins/ 下,輸入
    docker build --force-rm -t jenkins/jenkins:ytTest .
    
  3. 在 /DockerProject/ 下,輸入
    docker-compose up
    
這樣子,跑起來的Jenkins
會有jenkins_admin管理者資訊與有建置過的devAngular job
其他的開發者,就不需要進行步驟 1-17
只需要拿我們提供的ssh key跟備份檔案
就可以快速使用Jenkins並建置
也因此大大減少每個開發人員為了建置環境的時間成本
不僅如此,未來主機或VM損壞了,只要這些相關檔案都在
因為容器化的特性,可以很快的另起爐灶
未來如果連網路設定都設定好,可以對外服務
更能確保穩定性與一致性

留言