摘要:譯者按在本專欄的前面的文章中,我們已經提到過使用的基本方法,因此本次講解一下使用和腳本進行鏡像的自動化部署,原文僅供參考,因為對于鏡像,我們可以有更好的解決方案。我們使用標準輸入輸出流和管道進行操作。
背景譯者按:在本專欄的前面的文章中,我們已經提到過使用 Docker 的基本方法,因此本次講解一下 使用 SSH 和 shell 腳本進行 Docker 鏡像的自動化部署,原文僅供參考,因為對于 Docker 鏡像,我們可以有更好的解決方案:Docker Registry Hub。但是,本文仍然可以作為 shell 腳本的參考范例。
當我們將本站轉移到 Docker 容器內之后,我一直在尋求能進行自動化構建和部署鏡像的方法。毫無疑問,Docker 本身是一個非常完美的應用容器,但是 Docker 并沒有提供能夠自動化更新鏡像的標準方法。當然,我寫了一些 shell 腳本,實現了 Docker 容器鏡像的自動化部署。
我們假設基礎架構是一臺 Linux 宿主機和幾個獨立的 Docker 鏡像,沒有網站運行時產生的動態文件,例如用戶上傳的文件。
當然,要解決這些動態文件也非常簡單,本篇文章中的腳本只需要修改一小部分,然后加上 data only container 便可以完美解決動態文件的問題。
那么,我們開始進行自動化部署吧。
腳本腳本的初衷非常簡單:構建鏡像,上傳鏡像,使用新鏡像重啟容器。我們會分段講解腳本,當然你只需要把本文的腳本段落組合起來,便可以執行自動化部署了。
假設我們的 apache 文件在 apache/ 子目錄,一個監控程序在 monitoring/ 子目錄。
設置環境假設我們的腳本名稱為 deploy.sh,使用如下命令進行初始化:
#!/bin/bash set -e REMOTE_USERNAME="..." REMOTE_HOST="..." IMAGE_REPOSITORY="my_repository"
前面兩個變量并不需要解釋,后面上傳鏡像的時候用的到。
最后一個變量是 Docker 鏡像的名稱,你需要設置自己的鏡像名稱,在后面我們也會有這個名稱進行檢測。
再后文中我們會建立同一個名稱但是 tag 不同的兩個鏡像分別存儲 apache 和 monitor。
構建第一件要做的事情便是構建鏡像,構建過程和普通的 Docker 命令一樣。我們寫了一個函數專門用來構建鏡像:
function build_image { docker build -t $IMAGE_REPOSITORY:$1 $2 } build_image apache apache/ build_image monitoring monitoring/
我們使用上面的已經定義的 IMAGE_REPOSITORY 名稱命名鏡像,并且對我們的兩個 apache 和 monitoring 鏡像貼標簽。
上傳當然本專欄的前文中提到,鏡像可以輸出到文件,也可以由文件輸入。當然也可以從標準輸入輸出流進行輸入輸出。我們使用標準輸入輸出流和管道進行操作。這個輸入和上傳的操作很容易用一行 shell 語句寫出來。
docker save $IMAGE_REPOSITORY:$1 | bzip2 | pv | ssh $REMOTE_USERNAME@$REMOTE_HOST "bunzip2 | docker load"
當然,成熟的程序員都會寫個函數,順便做做重復性檢測,畢竟幾百 M 的文件呢,上傳都要好久,還能節省帶寬。尤其是有很多鏡像需要上傳的時候,萬一有幾個重復的呢。我們所需要的就是按照鏡像名稱和標簽列出本機和遠程服務器上的 Docker 容器的 ID,然后檢測他們的 ID 是否相同。
本節的 shell 腳本如下。
function upload_image_if_needed { if [[ $(ssh $REMOTE_USERNAME@$REMOTE_HOST "docker images $IMAGE_REPOSITORY | grep $1 | tr -s " " | cut -d " " -f 3") != $(docker images $IMAGE_REPOSITORY | grep $1 | tr -s " " | cut -d " " -f 3) ]] then echo "$1 image changed, updating..." docker save $IMAGE_REPOSITORY:$1 | bzip2 | pv | ssh $REMOTE_USERNAME@$REMOTE_HOST "bunzip2 | docker load" else echo "$1 image did not change" fi } upload_image_if_needed apache upload_image_if_needed monitoring更新容器
上面說的是更新鏡像,本節講的是更新容器。
現在是最后一步,我們需要使用新鏡像重啟容器。當然,和其他的語言一樣,我們可以將遠程主機上的命令寫成本機上的輸入形式:
ssh -tt $REMOTE_USERNAME@$REMOTE_HOST << EOF ... exit EOF
然后判斷容器是否存在,如果存在就結束容器。
docker rm -f ${IMAGE_REPOSITORY}_apache || true docker rm -f ${IMAGE_REPOSITORY}_monitoring || true
注:可能有讀者對 docker rm -f ${IMAGE_REPOSITORY}_apache 這條命令感到不解,在此解釋一下。原文作者使用制定名稱 ${IMAGE_REPOSITORY}_apache 對容器進行命名。
|| 是必需的,因為如果容器不存在的話,docker rm 命令便會返回一個錯誤。我們只需要刪除容器,并不去判斷他們是否存在。不存在的也就不用刪除,當然,刪除也沒問題。
下面一步便是啟動容器:
docker run -d --name ${IMAGE_REPOSITORY}_apache $IMAGE_REPOSITORY:apache docker run -d --name ${IMAGE_REPOSITORY}_monitoring $IMAGE_REPOSITORY:monitoring完整版本
為了便于閱讀,我特意整理了所有腳本的完全版,如下:
#!/bin/bash set -e REMOTE_USERNAME="..." REMOTE_HOST="..." IMAGE_REPOSITORY="my_repository" function upload_image_if_needed { if [[ $(ssh $REMOTE_USERNAME@$REMOTE_HOST "docker images $IMAGE_REPOSITORY | grep $1 | tr -s " " | cut -d " " -f 3") != $(docker images $IMAGE_REPOSITORY | grep $1 | tr -s " " | cut -d " " -f 3) ]] then echo "$1 image changed, updating..." docker save $IMAGE_REPOSITORY:$1 | bzip2 | pv | ssh $REMOTE_USERNAME@$REMOTE_HOST "bunzip2 | docker load" else echo "$1 image did not change" fi } function build_image { docker build -t $IMAGE_REPOSITORY:$1 $2 } build_image apache apache/ build_image monitoring monitoring/ upload_image_if_needed apache upload_image_if_needed monitoring ssh -tt $REMOTE_USERNAME@$REMOTE_HOST << EOF docker rm -f ${IMAGE_REPOSITORY}_apache || true docker rm -f ${IMAGE_REPOSITORY}_monitoring || true docker run -d --name ${IMAGE_REPOSITORY}_apache $IMAGE_REPOSITORY:apache docker run -d --name ${IMAGE_REPOSITORY}_monitoring $IMAGE_REPOSITORY:monitoring exit EOF結論
Docker 確實是容器中的佼佼者,而且有很好的命令行支持,但是目前還是缺少能便捷部署 Docker 容器的方式。當然,通過幾段簡單的腳本,我們便可以解決這個問題。我希望這些腳本也能幫助到你。
譯者的話本文對容器的操作比較簡單粗暴,使用 docker rm 命令進行強行刪除,可能會導致一段時間(一般不到半分鐘,視情況而定)的網站 403,404 或者 503。
除此之外,本文的 shell 操作可以當成是 shell 遠程執行命令的范例。
本專欄將繼續推出 Docker 系列文章,歡迎關注。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26409.html
摘要:目前我們正采取措施,通過逐步改善現有過程來實現持續部署。在這篇文章中,我們將看看如何使用和來改善此設計。通過使用,在未來我們可以輕松地將構建和部署任務集成起來,從而得到額外的好處。月日,北京海航萬豪酒店,容器技術大會即將舉行。 在這一系列文章的第一篇中,我們分享了只用Docker時我們開發的初步的工作流,如何創建一個基礎的構建和部署流水線。容器的部署方式不再是在登陸server的時候從...
摘要:宋體為了解決此類問題,開發了相關代碼,并被自動化構建鏡像工具的官方倉庫所采納。宋體宋體可以運行在常用的主流操作系統上,它不是等軟件的替代品,而是集成并使用這些自動化配置工具在鏡像上預裝軟件等。背景 云主機是用戶使用最高頻的云產品之一。隨著云主機數量的增多,如何在云主機中保證版本化部署的一致性,成為用戶常見的難題。在現有情況下,用戶首先需要手動或使用腳本連接主機,然后再進行部署安裝,操作...
摘要:數人云今天帶來的文章將分享如何用實現命令行程序的過程中整體思路以及需要注意哪些問題。月日,超越傳統運維之道的話題將在北京延續,四位業界大牛技術齊聚,結合傳統運維現狀及實踐案例,講述的超越之道。 數人云今天帶來的文章將分享如何用Docker實現PHP命令行程序的CI/CD過程中整體思路以及需要注意哪些問題。 6月10日,《DevOps&SRE超越傳統運維之道》的話題將在北京延續,四位業界...
摘要:數人云今天帶來的文章將分享如何用實現命令行程序的過程中整體思路以及需要注意哪些問題。月日,超越傳統運維之道的話題將在北京延續,四位業界大牛技術齊聚,結合傳統運維現狀及實踐案例,講述的超越之道。 數人云今天帶來的文章將分享如何用Docker實現PHP命令行程序的CI/CD過程中整體思路以及需要注意哪些問題。 6月10日,《DevOps&SRE超越傳統運維之道》的話題將在北京延續,四位業界...
摘要:只要的項目有提交,相關就根據來決定是否跑自動部署的命令。項目的自動部署添加執行的注冊命令,按照說明進行參數配置。至此,和服務都已經自動部署完成。 準備工作 說明 公司最近準備了一臺新的開發服務器,正好用以實踐docker的基本應用。docker的好處不再贅述,詳情可參考阮一峰的這篇入門。(關于Docker最好的中文介紹,沒有之一)。 公司目前主要使用了EggJs + ReactJS的技...
閱讀 3173·2023-04-25 17:19
閱讀 623·2021-11-23 09:51
閱讀 1345·2021-11-08 13:19
閱讀 783·2021-09-29 09:34
閱讀 1683·2021-09-28 09:36
閱讀 1500·2021-09-22 14:59
閱讀 2715·2019-08-29 16:38
閱讀 2058·2019-08-26 13:40