主頁(yè) > 知識(shí)庫(kù) > 在生產(chǎn)環(huán)境如何使用Docker部署應(yīng)用

在生產(chǎn)環(huán)境如何使用Docker部署應(yīng)用

熱門標(biāo)簽:電銷行業(yè) 電話外呼服務(wù) Win7旗艦版 太平洋壽險(xiǎn)電話營(yíng)銷 AI人工智能 電話銷售團(tuán)隊(duì) 網(wǎng)站建設(shè) 話術(shù)

Docker現(xiàn)在越來(lái)越流行,但是真正在生產(chǎn)環(huán)境部署Docker還是個(gè)比較新的概念,還沒(méi)有一個(gè)標(biāo)準(zhǔn)的流程。作者是ROR的程序員,作者結(jié)合平時(shí)的部署經(jīng)驗(yàn),聯(lián)系Docker的特點(diǎn),向大家分享了其在生產(chǎn)環(huán)境使用Docker部署應(yīng)用程序的一個(gè)實(shí)踐。

Docker是現(xiàn)在開(kāi)發(fā)應(yīng)用程序的不錯(cuò)選擇;因?yàn)閷?duì)于一個(gè)研發(fā)組來(lái)說(shuō),部署一個(gè)應(yīng)用再也不用像以前那樣繁瑣的修改、設(shè)置配置文件了;因?yàn)閷?duì)于Docker來(lái)說(shuō)它“屏蔽”了應(yīng)用程序的運(yùn)行環(huán)境,不管你使用Mac、Linux還是Windows都能用相同的方式運(yùn)行。

但是,當(dāng)你使用Docker將應(yīng)用部署到生產(chǎn)環(huán)境時(shí),你會(huì)覺(jué)得Docker還是有些“弱”,至少?gòu)腞uby On Rails(ROR)的角度出發(fā)是這樣的。當(dāng)我查找與測(cè)試了很多不同的部署方法與Docker鏡像后發(fā)現(xiàn):確實(shí)沒(méi)有一個(gè)確切而且標(biāo)準(zhǔn)的部署方案。在這篇文章中我會(huì)分享一種生產(chǎn)環(huán)境部署ROR應(yīng)用的最佳實(shí)踐。

標(biāo)準(zhǔn)

在實(shí)際操作之前,我們列舉生產(chǎn)環(huán)境部署應(yīng)用的標(biāo)準(zhǔn):

1.易于使用:部署應(yīng)用本身應(yīng)該十分簡(jiǎn)單,不然部署新程序的過(guò)程會(huì)變得十分“恐怖”。

2.零服務(wù)中斷:讓我們面對(duì)它——零服務(wù)中斷部署ROR應(yīng)用程序已經(jīng)成為當(dāng)今的標(biāo)準(zhǔn)。

3.自動(dòng)化部署:我更習(xí)慣把代碼推送到代碼倉(cāng)庫(kù),然后使用Codeship這樣的工具自動(dòng)測(cè)試,測(cè)試通過(guò)后自動(dòng)將代碼部署到生產(chǎn)環(huán)境的服務(wù)器。我希望Docker能完成相同的工作。
## 操作就像之前我說(shuō)過(guò)的,我希望部署過(guò)程越簡(jiǎn)單越好。如果你看過(guò)Docker:Part4這個(gè)視頻,可能對(duì)以下命令有所熟悉,它啟動(dòng)了一個(gè)叫db的容器(跑postgres數(shù)據(jù)庫(kù)),之后又啟動(dòng)了一個(gè)叫web的容器,最后將容器“web”跟容器“db”連接起來(lái)。

$ docker run -d --name db training/postgres
$ docker run -i -t --name web --link db:db -p 45000:80

當(dāng)然如果你照著這么做來(lái)部署程序,當(dāng)你敲了很多次這樣的命令后,而且保證不遺漏的敲了很多次這種命令后,你會(huì)發(fā)現(xiàn)這是個(gè)“坑爹的”噩夢(mèng)。這就是為什么會(huì)有Fig的原因。

FIG

如果你用Dockerfile來(lái)定義如何生成你的容器,那么Fig則可以幫你定義整個(gè)容器的運(yùn)行框架。Fig將“添加數(shù)據(jù)卷(add volumes)”、“連接容器”(link container)與“映射端口”等操作都封裝到一個(gè)YAML的描述文件中;如同前面提到的CodeTV中描述的那個(gè)操作在Fig中簡(jiǎn)化成如下形式:

web:
build: .
ports:
- "80:80"
links:
- db

db:
image: postgres
ports:
- "5432"

volumes:
- /etc/postgresql
- /var/log/postgresql
- /var/lib/postgresql

我在YAML中定義了兩個(gè)容器:web與db;容器web生成自當(dāng)前文件夾下的Dockerfile,向外暴露了80號(hào)端口,同時(shí)鏈接到了容器db。容器db生成自DockerHub的PostgreSQL鏡像,向外暴露5432號(hào)端口。使用此YAML配置文件,fig可以用以下命令生成容器,然后依照配置文件的意圖啟動(dòng)它們。

$ fig build
$ fig up -d

Fig會(huì)先啟動(dòng)被鏈接的容器db,這樣容器web就不至于連不上數(shù)據(jù)庫(kù)。-d參數(shù)表示以后臺(tái)運(yùn)行的方式啟動(dòng)容器,這樣可以保證用戶登出操作系統(tǒng)后,容器任然在運(yùn)行。您可以登錄Fig的官方網(wǎng)站獲取更多的配置信息。

部署

現(xiàn)在我們可以很容易的啟動(dòng)一個(gè)Docker容器,但是怎么在生產(chǎn)環(huán)境下部署Docker容器呢?如果在生產(chǎn)環(huán)境下安裝了Fig與Docker,我們所有要做的就是克隆之前的容器鏡像,然后用相同的fig命令來(lái)啟動(dòng)容器。但是,現(xiàn)在的問(wèn)題是如何更新線上運(yùn)行的容器。

不幸的是,F(xiàn)ig可以非常優(yōu)雅的啟動(dòng)一個(gè)容器,但是它并不擅長(zhǎng)更新并重啟服務(wù)。當(dāng)然,你可以在代碼倉(cāng)庫(kù)拉取程序的更新,然后重新運(yùn)行以上的fig命令來(lái)達(dá)到這個(gè)目的;但是,在容器在更新代碼,重新啟動(dòng)的過(guò)程中,就不能對(duì)外提供服務(wù)了。為了應(yīng)對(duì)這種情況,我們使用原生的Docker命令,并引入Nginx做反向代理(注:軟負(fù)載)來(lái)解決這個(gè)問(wèn)題。

我們首先把容器監(jiān)聽(tīng)的端口修改掉,因?yàn)镹ginx需要監(jiān)聽(tīng)80號(hào)端口。我們這么修改:

web:
build: .
ports:
- "8080:80"
links:
- db
...

通過(guò)修改Fig的配置文件,我們的web容器修改成監(jiān)聽(tīng)8080號(hào)端口。而Nginx要配置成8080與8081端口的負(fù)載均衡;所以Nginx的配置如下:

upstream docker {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}

server {
listen 80;
location / {
proxy_pass http://docker;
}
}

重啟Nginx后,Nginx就開(kāi)始在8080與8081號(hào)端口之間做反向代理(軟負(fù)載);當(dāng)其中任何一個(gè)端口失效后,Nginx將請(qǐng)求自動(dòng)轉(zhuǎn)發(fā)到另一個(gè),直到失效后的端口恢復(fù)。這樣,我們就能從Git中拉取更新,然后運(yùn)行下面的命令將其啟動(dòng):

$ docker run -d --name web1 --link codetvjournal_db_1:db -p 8081:80 codetvjournal_web:latest

當(dāng)我們確定8081號(hào)端口的web1容器啟動(dòng)并服務(wù)正常后,我們就可以停止8080號(hào)端口的服務(wù)并開(kāi)始為8080號(hào)端口服務(wù)進(jìn)行更新了。我推薦使用原生的docker命令而不使用Fig來(lái)完成這個(gè)工作,因?yàn)檫@樣可以避免干擾到正在運(yùn)行的db容器(注:作者可能指的是之前寫好的YAML,里面包含了啟動(dòng)db容器的配置)

我們可以用上述方法創(chuàng)建很多個(gè)web容器,只要保證它們占用的端口與容器名不同即可;同時(shí)使用Nginx在它們前端做負(fù)載即可實(shí)現(xiàn)不掉線的程序升級(jí)。

自動(dòng)化

那么問(wèn)題又來(lái)了,怎么將上述的更新流程自動(dòng)化運(yùn)行呢?有兩個(gè)方式可以達(dá)到:

1.將容器更新、啟停、切換等操作封裝到一個(gè)單一的腳本中,這個(gè)腳本可以加入到傳統(tǒng)的上線流程(注:新代碼拉取,自動(dòng)測(cè)試,自動(dòng)部署的流程,作者稱之為deployment pipeline)之后執(zhí)行;

2.另一種方式是,使用類似Consul或者etcd等的發(fā)現(xiàn)服務(wù)來(lái)管理容器的更新,啟停,與發(fā)現(xiàn);這會(huì)更加“高大上”。

所以,使用Docker在生產(chǎn)環(huán)境中部署服務(wù)不像你想象中那么容易。我推薦大家試試上面所說(shuō)的方法;同時(shí)分享你自己的實(shí)踐經(jīng)驗(yàn)給大家,這會(huì)幫助大家一同使用Docker。Docker還是個(gè)很年輕的產(chǎn)品,同時(shí)又是個(gè)非常熱門的產(chǎn)品,它肯定會(huì)在未來(lái)不斷的演化升級(jí)。

標(biāo)簽:云南 普洱 寧夏 漯河 南昌 宿州 儋州 延安

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在生產(chǎn)環(huán)境如何使用Docker部署應(yīng)用》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266