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