成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用 SSH 和 shell 腳本部署 Docker 鏡像

stormzhang / 3419人閱讀

摘要:譯者按在本專欄的前面的文章中,我們已經(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

相關(guān)文章

  • 如何使用DockerDocker-ComposeRancher搭建部署Pipeline(二)

    摘要:目前我們正采取措施,通過逐步改善現(xiàn)有過程來實(shí)現(xiàn)持續(xù)部署。在這篇文章中,我們將看看如何使用和來改善此設(shè)計(jì)。通過使用,在未來我們可以輕松地將構(gòu)建和部署任務(wù)集成起來,從而得到額外的好處。月日,北京海航萬豪酒店,容器技術(shù)大會即將舉行。 在這一系列文章的第一篇中,我們分享了只用Docker時我們開發(fā)的初步的工作流,如何創(chuàng)建一個基礎(chǔ)的構(gòu)建和部署流水線。容器的部署方式不再是在登陸server的時候從...

    LancerComet 評論0 收藏0
  • 使用Packer實(shí)現(xiàn)自動化構(gòu)建UCloud云主機(jī)鏡像

    摘要:宋體為了解決此類問題,開發(fā)了相關(guān)代碼,并被自動化構(gòu)建鏡像工具的官方倉庫所采納。宋體宋體可以運(yùn)行在常用的主流操作系統(tǒng)上,它不是等軟件的替代品,而是集成并使用這些自動化配置工具在鏡像上預(yù)裝軟件等。背景 云主機(jī)是用戶使用最高頻的云產(chǎn)品之一。隨著云主機(jī)數(shù)量的增多,如何在云主機(jī)中保證版本化部署的一致性,成為用戶常見的難題。在現(xiàn)有情況下,用戶首先需要手動或使用腳本連接主機(jī),然后再進(jìn)行部署安裝,操作...

    zorpan 評論0 收藏0
  • 如何用 Docker 實(shí)現(xiàn) PHP 命令行程序的 CI/CD

    摘要:數(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è)界...

    Pink 評論0 收藏0
  • 如何用 Docker 實(shí)現(xiàn) PHP 命令行程序的 CI/CD

    摘要:數(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è)界...

    stdying 評論0 收藏0
  • Node項(xiàng)目的Gitlab自動部署實(shí)踐(基于Docker

    摘要:只要的項(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的技...

    oysun 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<