前言
本文中描述的是一個(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)用部署視圖
環(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:5000Docker鏡像
鏡像名稱 | 鏡像說明 |
---|---|
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)容