Docker部署Web單體應(yīng)用

前言

本文中描述的是一個(gè)典型的Web單體應(yīng)用部署場景,不涉及任何業(yè)務(wù)系統(tǒng)谆扎,在具體項(xiàng)目中使用此部署方案時(shí)矿瘦,針對所部署產(chǎn)品的不同,各個(gè)環(huán)節(jié)都存在可能的優(yōu)化點(diǎn)稻轨。

目標(biāo)

  • 降低產(chǎn)品運(yùn)維的復(fù)雜度,提升運(yùn)維效率
  • Build once雕凹,Run anywhere殴俱;Configure once,Run anything
  • 集群高可用枚抵,無單點(diǎn)故障
  • 適用于中小規(guī)模的單體Web后端服務(wù)系統(tǒng)的典型部署場景
  • 向微服務(wù)架構(gòu)體系轉(zhuǎn)型過程中线欲,將Docker融入遺留單體架構(gòu)的系統(tǒng),先將已有產(chǎn)品“容器化”汽摹,再逐步將產(chǎn)品“微服務(wù)化”

典型Web應(yīng)用部署視圖

典型Web應(yīng)用部署視圖

環(huán)境說明

  • 系統(tǒng)
    基于Linux Kernel 3.10以上的64位發(fā)行版李丰,本文采用CentOS-7.3.1611-x86_64-Minimal,默認(rèn)內(nèi)核3.10.0-514.el7.x86_64
  • Docker
    要求docker 1.12以上的版本
    由swarm管理的docker集群中逼泣,每臺物理機(jī)中需要安裝相同版本的docker
    Docker的安裝詳見附錄中的"安裝Docker"章節(jié)
  • 物理機(jī)(2臺)
hostname ip interface
HostA 10.0.0.1 ens33
HostB 10.0.0.2 ens33

在兩臺主機(jī)中分別安裝CentOS系統(tǒng)趴泌,并在系統(tǒng)中安裝Docker

  • Docker鏡像中心
    使用私有鏡像中心保存業(yè)務(wù)系統(tǒng)鏡像
    鏡像中心地址:10.0.0.222:5000

  • Docker鏡像

鏡像名稱 鏡像說明
10.0.0.222:5000/web-app:v1.0 可運(yùn)行的應(yīng)用系統(tǒng)
10.0.0.222:5000/custom-nginx:v1.0 自定義的Nginx

關(guān)于鏡像的制作,請參考附錄中的相關(guān)章節(jié)

  • 系統(tǒng)設(shè)置
    為了便于演示拉庶,對操作系統(tǒng)進(jìn)行了如下操作:
    在生產(chǎn)環(huán)境中嗜憔,只需開啟相關(guān)端口即可

關(guān)閉防火墻

#查看防火墻狀態(tài)

firewall-cmd --state

停止防火墻

systemctl stop firewalld.service

禁止防火墻開機(jī)啟動

systemctl disable firewalld.service

關(guān)閉SELINUX

setenforce 0
vi /etc/sysconfig/selinux

編輯/etc/sysconfig/selinux文件,將SELINUX設(shè)置為disabled

操作步驟

1砍的、安裝Linux系統(tǒng)

2痹筛、在系統(tǒng)中安裝Docker

步驟1和步驟2可參考環(huán)境說明章節(jié)中的相關(guān)操作

3莺治、部署高可用集群(可選)

在需要部署高可用的集群主機(jī)中廓鞠,使用keepalived+ipvsadm,將多臺物理機(jī)通過虛擬IP谣旁,提供給使用者一個(gè)唯一的IP地址床佳,同時(shí)通過keepalived實(shí)現(xiàn)“單機(jī)房”內(nèi)的高可用。多機(jī)房(異地多活)部署榄审,建議增加域名解析

  • 安裝 ipvsadm 和 keepalived.
yum -y install ipvsadm keepalived
#開啟IP數(shù)據(jù)包轉(zhuǎn)發(fā)
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
#開啟ipvsadm
touch /etc/sysconfig/ipvsadm
systemctl start ipvsadm
systemctl enable ipvsadm
  • 配置keepalived
    集群中的每臺物理主機(jī)均需配置keepalived.conf 每臺主機(jī)的配置文件僅state和priority參數(shù)不同砌们,其余配置均相同
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.org
vi /etc/keepalived/keepalived.conf

<b>keepalived.conf 配置文件示例</b>(注意注釋中需要修改的地方)

global_defs {
    router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    #一個(gè)MASTER,其它節(jié)點(diǎn)為BACKUP
    state MASTER
    #根據(jù)實(shí)際情況修改
    interface ens33
    #集群標(biāo)識(確保在局域網(wǎng)內(nèi)與其它集群不同),數(shù)值范圍(0,255)
    virtual_router_id 123
    #優(yōu)先級(確保相同集群中priority值的高低不同)
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass inspur
    }
    virtual_ipaddress {
        #虛擬IP
        10.0.0.100/16
    }
}
#虛擬IP
virtual_server 10.0.0.100 8090 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.0.0
    persistence_timeout 0
    protocol TCP
    real_server 127.0.0.1 8090 {
        weight 100
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 8090
        }
    }
}
  • 設(shè)置keepalived啟動并默認(rèn)開機(jī)啟動
systemctl start keepalived
systemctl enable keepalived

@烁小N敉贰!如果您是在本地虛擬機(jī)中部署影兽,并且真實(shí)部署環(huán)境使用的虛擬機(jī)揭斧,現(xiàn)在可以上傳至真實(shí)運(yùn)行環(huán)境了,后面的配置會涉及到主機(jī)的IP

4峻堰、部署Docker集群

若使用私有鏡像中心讹开,且鏡像中心不支持HTTPS,則需要做如下修改

# 在pull主機(jī)中的”/etc/docker/“目錄下捐名,創(chuàng)建”daemon.json“文件旦万。在文件中寫入
{ "insecure-registries":["10.0.0.222:5000"] }
# 保存退出后,重啟docker
systemctl restart docker

物理機(jī)集群中選擇需要搭建Docker集群主機(jī)镶蹋,使用Swarm對當(dāng)前物理機(jī)集群中安裝Docker的主機(jī)集群化成艘。加入Swarm管理的Docker主機(jī)節(jié)點(diǎn),將受Swarm調(diào)度贺归、編排狰腌。
本示例中使用一個(gè)Swarm管理節(jié)點(diǎn)(Manager)和一個(gè)Swarm工作節(jié)點(diǎn)(Worker),在實(shí)際使用中牧氮,可以建立多個(gè)Manager節(jié)點(diǎn)琼腔,Manager同時(shí)也是Worker,Worker后期也可以動態(tài)指定為Manager

  • 初始化
    選擇一個(gè)主機(jī)踱葛,啟動Swarm模式丹莲,保存初始化后打印的Token,因?yàn)樵诠?jié)點(diǎn)加入時(shí)要使用Token作為通訊的密鑰
    這里要注意的是IP地址尸诽,如果你的worker節(jié)點(diǎn)部署在遠(yuǎn)程的VPS上甥材,那么你應(yīng)該給個(gè)遠(yuǎn)程的外網(wǎng)可以訪問的IP地址,在多網(wǎng)卡的機(jī)器上需要注意這個(gè)問題
    如果你的機(jī)器只有一個(gè) IP 地址性含,可以省略--adbertise-addr選項(xiàng)洲赵,docker 會自動選擇正確的 IP
docker swarm init --advertise-addr 10.0.0.1
  • 將其它物理機(jī)節(jié)點(diǎn)加入到Swarm集群
docker swarm join \
--token SWMTKN-11m0u46krm5khxd7a46ugyxbsg16nqse8r8r0fdprv1zkvm99kj2sq8vm12ho9gqi3hwowbunugw \
10.0.0.1:2377
#此處IP為Swarm管理節(jié)點(diǎn)的IP
  • 在manager節(jié)點(diǎn)查看節(jié)點(diǎn)列表
docker node ls

5、部署應(yīng)用

  • 創(chuàng)建Docker內(nèi)部網(wǎng)絡(luò)
    創(chuàng)建一個(gè)名字為"myoverlay"的內(nèi)部Docker網(wǎng)絡(luò)商蕴,用于Docker容器間通訊叠萍,運(yùn)行時(shí),指定相同overlay網(wǎng)絡(luò)的容器之間可以互相連通绪商,容器內(nèi)可以使用服務(wù)運(yùn)行時(shí)指定的名稱進(jìn)行訪問(Docker內(nèi)部DNS)
docker network create -d overlay myoverlay
  • 部署api-portal
    在Swarm Manager節(jié)點(diǎn)部署公共接口服務(wù)苛谷,服務(wù)數(shù)量為4個(gè),指定名字為“backend”(注意:此處名字與自定義的nginx的default.conf配置中的proxy_pass對應(yīng))格郁,指定運(yùn)行在myoverlay網(wǎng)絡(luò)中腹殿,可以不公布端口至宿主機(jī)(此處為了方便演示独悴,加上了--publish 8081:8080參數(shù),公布了容器內(nèi)部的tomcat端口)
docker service create --replicas 4 --name backend --network myoverlay --publish 8081:8080  10.0.0.222:5000/web-app:v1.0
  • 部署Nginx
    在manager節(jié)點(diǎn)部署nginx服務(wù)锣尉,服務(wù)數(shù)量為2個(gè)刻炒,指定名字為“iNginx”,指定運(yùn)行在myoverlay網(wǎng)絡(luò)中自沧,公開指定端口是8090映射容器80落蝙,使用自定義的nginx鏡像
docker service create --replicas 2 --name iNginx --network myoverlay --publish 8090:80  10.0.0.222:5000/custom-nginx:v1.0

6、Enjoy

訪問10.0.0.100:8090/api-portal/暂幼,請求將會負(fù)載均衡在兩臺物理機(jī)中的2個(gè)Nginx實(shí)例筏勒,Nginx將請求轉(zhuǎn)發(fā),負(fù)載均衡至4個(gè)backend中旺嬉。

后續(xù)運(yùn)維

使用Docker Swarm可以支持如下運(yùn)維場景:

  • 服務(wù)健康監(jiān)測管行。服務(wù)掛掉后,Swarm將根據(jù)設(shè)定的服務(wù)數(shù)量邪媳,自動在集群內(nèi)將服務(wù)恢復(fù)至設(shè)定值捐顷。
  • 使用命令擴(kuò)展或縮減服務(wù),增加負(fù)載
docker service scale iNginx=3
  • 服務(wù)滾動升級雨效,失敗自動回滾
  • 待發(fā)現(xiàn)……

附錄

安裝Docker

使用官方安裝步驟迅涮,摘錄如下:
下列摘錄為Docker最初的文檔版本,適用于測試環(huán)境中安裝Docker徽龟,現(xiàn)在官網(wǎng)中看到的文檔叮姑,增加了對生產(chǎn)環(huán)境的相關(guān)安裝及操作步驟

You can install Docker CE on CentOS in just three steps.
Prerequisites
Docker CE is supported on CentOS 7.3 64-bit.
1. Set up the repository
Set up the Docker CE repository on CentOS:

sudo yum install -y yum-utils
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
sudo yum makecache fast

2. Get Docker CE
Install the latest version of Docker CE on CentOS:

sudo yum -y install docker-ce

Start Docker:

sudo systemctl start docker
sudo systemctl enable docker

3. Test your Docker CE installation
Test your installation:

sudo docker run hello-world

關(guān)于本文所涉及鏡像的制作

10.0.0.222:5000/custom-nginx:v1.0

<b>default.conf 配置文件示例</b>(注意注釋中需要修改的地方)

server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://backend:8080;
        #此處backend對應(yīng)創(chuàng)建Swarm服務(wù)時(shí)(docker service create)指定的名稱
        #8080端口對應(yīng)所創(chuàng)建的Swarm服務(wù)內(nèi)部容器的服務(wù)端口
    }
}

操作步驟

#運(yùn)行Nginx官方鏡像
docker run -it nginx:1.12 /bin/bash
#修改Nginx的default.conf配置文件
cd /etc/nginx/conf.d/
mv default.conf default.conf.bak
touch default.conf
#寫入配置文件
echo "server {" >> default.conf
echo "listen 80;" >> default.conf
echo "server_name localhost;" >> default.conf
echo "location / {" >> default.conf
echo "proxy_pass http://backend:8080;" >> default.conf
echo "}" >> default.conf
echo "}" >> default.conf
#退出容器
exit
#制作鏡像
docker commit <容器ID> 10.0.0.222:5000/custom-nginx:v1.0
#上傳鏡像至私有鏡像中心
docker push 10.0.0.222:5000/custom-nginx:v1.0

10.0.0.222:5000/web-app:v1.0

<b>Dockerfile 示例</b>

FROM tomcat:9.0.0.M21-jre8
MAINTAINER Zhaozy
COPY api-portal-1.0.0-SNAPSHOT.war /usr/local/tomcat/webapps/api-portal.war
  • 將Dockerfile文件和api-portal-1.0.0-SNAPSHOT.war包拷貝到某個(gè)目錄內(nèi),在目錄內(nèi)執(zhí)行
docker build -t 10.0.0.222:5000/web-app:v1.0 .
  • 上傳鏡像至私有鏡像中心
docker push 10.0.0.222:5000/web-app:v1.0

使用CI(持續(xù)集成)+ Docker Compose据悔,可以簡化業(yè)務(wù)系統(tǒng)的部署传透,后續(xù)再整理“使用容器、CI极颓、微服務(wù)等技術(shù)搭建適用于中小型研發(fā)團(tuán)隊(duì)的研發(fā)生態(tài)體系”相關(guān)的內(nèi)容

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朱盐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子菠隆,更是在濱河造成了極大的恐慌兵琳,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骇径,死亡現(xiàn)場離奇詭異躯肌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)既峡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門羡榴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碧查,“玉大人运敢,你說我怎么就攤上這事校仑。” “怎么了传惠?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵迄沫,是天一觀的道長。 經(jīng)常有香客問我卦方,道長羊瘩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任盼砍,我火速辦了婚禮尘吗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浇坐。我一直安慰自己睬捶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布近刘。 她就那樣靜靜地躺著擒贸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪觉渴。 梳的紋絲不亂的頭發(fā)上介劫,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音案淋,去河邊找鬼座韵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛踢京,可吹牛的內(nèi)容都是我干的回右。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼漱挚,長吁一口氣:“原來是場噩夢啊……” “哼翔烁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起旨涝,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蹬屹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后白华,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慨默,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年弧腥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厦取。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡管搪,死狀恐怖虾攻,靈堂內(nèi)的尸體忽然破棺而出铡买,到底是詐尸還是另有隱情,我是刑警寧澤霎箍,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布奇钞,位于F島的核電站,受9級特大地震影響漂坏,放射性物質(zhì)發(fā)生泄漏景埃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一顶别、第九天 我趴在偏房一處隱蔽的房頂上張望谷徙。 院中可真熱鬧,春花似錦驯绎、人聲如沸蒂胞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骗随。三九已至,卻和暖如春赴叹,著一層夾襖步出監(jiān)牢的瞬間鸿染,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工乞巧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涨椒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓绽媒,卻偏偏與公主長得像蚕冬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子是辕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前兩篇東西囤热,我們分別介紹了Mesos和Dockers的安裝和使用。在《Mesos實(shí)戰(zhàn)》這篇的結(jié)尾获三,我說過將會介紹如...
    燕京博士閱讀 1,332評論 0 2
  • Docker從2013年發(fā)布第一個(gè)版本以來旁蔼,已經(jīng)火遍全球,技術(shù)迭代也比較頻繁疙教,其周邊產(chǎn)品和技術(shù)也越來越豐富棺聊。Doc...
    歸海聽雪閱讀 12,285評論 7 44
  • 昨晚終于有了空閑時(shí)間,二話不說就和朋友相約去看口碑極好的《天才槍手》贞谓。開始時(shí)可樂喝的有點(diǎn)多限佩,想上洗手間,可硬是忍著...
    玎町閱讀 252評論 0 0
  • 空蕩蕩的大廳里裸弦,只有靠左的那個(gè)房間里點(diǎn)開了耀眼白織燈祟同,亮白的燈光透過玻璃墻射向走廊那邊的空場作喘,光線不夠長,可足夠亮...
    程景至閱讀 467評論 2 5
  • “釀”作為名詞時(shí)耐亏,指一門手藝徊都,是匠人制酒的過程沪斟;“釀”作為動詞時(shí)广辰,是對制酒過程的漫長等待; 一瓶純粹的醬酒主之,都要經(jīng)...
    酢客閱讀 648評論 1 2