前言
Docker微服務(wù)架構(gòu)侣姆,已漸漸成為服務(wù)器架構(gòu)的主流 瞪浸。 但是對于Docker在生產(chǎn)環(huán)境的部署方案儒将,目前沒有一個明確的標(biāo)準(zhǔn)或者最佳實踐。筆者對比了很多方案对蒲,也實踐了不少钩蚊,發(fā)現(xiàn)要管理Docker的完整生命周期并非易事。最后經(jīng)過各種分析后齐蔽,發(fā)現(xiàn)Docker微服務(wù)的架構(gòu)两疚。只要消除一些看上去很必要的特性,其實可以很簡單含滴。
這些特性包括:
- 服務(wù)發(fā)現(xiàn)
- 私有docker倉庫
- 藍綠發(fā)布
- 鏡像更新诱渤,容器重啟
- 微服務(wù)負載均衡
- 服務(wù)于無法熱部署的服務(wù)器語言(如Java)
- 集中式的服務(wù)治理
- 等等
去掉這些特性之后,回歸Docker的優(yōu)勢谈况,其實就是應(yīng)用環(huán)境的隔離以及消除差異化勺美。
拋棄這些特性后递胧,剩下一些必要的東西,我的架構(gòu)看上去是這樣的:
- Git Server:這個肯定少不了
- Jenkins server:CI 較成熟的工具赡茸,暫時沒找著替代品
- 應(yīng)用服務(wù)器宿主機集群:這里部署的都是應(yīng)用層的服務(wù)缎脾,對外做負載均衡方案,方案有很多占卧,就不細說遗菠。
- 微服務(wù)宿主機集群:因為不用做負載均衡方案,宿主機其實可以是分散的华蜒,相互之前可以沒什么關(guān)系辙纬。
- 消息服務(wù):適合使用比較穩(wěn)定的云服務(wù),也可以自己搭集群叭喜。
- 若干工作站
所有的宿主機采用的是相同配置和方案贺拣,這樣復(fù)制起來比較簡單。
應(yīng)用服務(wù)和微服務(wù)只是定義上的差別捂蕴,實際上都是一樣的譬涡。
整套方案,連摸索帶調(diào)試啥辨,也就花了一個下午的時間涡匀。當(dāng)然前設(shè)是之前踩了不少坑。
實際上這套方案的實施委可,難點也不多渊跋。所以很容易既拿既用腊嗡。
構(gòu)建過程
1 準(zhǔn)備硬件環(huán)境
所有的工作都在一臺mac pro 上完成
在這臺mac pro上使用Vmware構(gòu)建了 幾臺CentOS 7 的虛擬機(Docker 3.x需要運行在至少CentOS 7 上 )
- Mac Pro :192.168.226.1, 工作站
- CentOS 7 Node1 :192.168.226.137 着倾,部署jenkins server
- CentOS 7 Node2 :192.168.226.138 ,微服務(wù)宿主機
- CentOS 7 Node3 :192.168.226.139 燕少,應(yīng)用服務(wù)宿主機
宿主機的配置都是一樣的卡者,可以選擇安裝完必要的服務(wù)后直接克隆(docker,docker-compose,rsync,后面會介紹)客们。
git server 直接使用github
2 安裝Docker
CentOS7 docker 的安裝可以看這篇文章:
https://yeasy.gitbooks.io/docker_practice/content/install/centos.html
按步驟安裝即可崇决,千萬別忘了更改docker鏡像地址。
Centos 7 安裝docker-compose:
curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
關(guān)于鏡像地址的獲得Docker的基礎(chǔ)使用底挫,以及mac下Docker的安裝恒傻,可以看實踐第一篇文章:
docker+consul基于服務(wù)發(fā)現(xiàn)的極簡web架構(gòu)實踐
現(xiàn)在你可以暫時忘記Docker了。
3 安裝jenkins
jenkins的安裝建邓,你可以按這篇文章:
https://hostpresto.com/community/tutorials/how-to-install-jenkins-on-centos-7/
需要注意的是盈厘,文章里有點格式錯誤
firewall-cmd --zone=public --permanent --add-port=8080/tcp firewall-cmd --reload
這個其實是兩行。
firewall-cmd --zone=public --permanent --add-port=8080/tcp
firewall-cmd --reload
4 啟動消息服務(wù)
Mac 上: docker run -d --name rabbit -p 5672:5672 rabbitmq
5 獲得演示代碼
Mac 上:
git clone https://github.com/luaxlou/micro-service-practice.git
該項目包含了一個NodeJs 微服務(wù)框架的演示代碼官边,其中分兩部分沸手。
seneca-listener:微服務(wù)
seneca-client: 應(yīng)用服務(wù)
關(guān)于seneca的詳細介紹外遇,可以看之前的第二篇實踐:
docker+jenkins+seneca構(gòu)建去集中化微服務(wù)架構(gòu)
6 安裝Rsync服務(wù)
在所有的宿主機上安裝Rsync服務(wù),關(guān)于服務(wù)的安裝契吉,可以看下面這篇文章:
http://www.cnblogs.com/zhangeamon/p/5724910.html
記得關(guān)閉所有的selinux跳仿。
7 開始配置自動集成
原理介紹
好了,所有必要的物件都準(zhǔn)備完畢捐晶,現(xiàn)在把他們串聯(lián)起來菲语。
我先講講整個機制:
- 工作站提交代碼到github
- github通過配置的webhook通知到j(luò)enkins服務(wù)器
- jenkins發(fā)起構(gòu)建任務(wù):克隆最新的代碼,npm 安裝擴展惑灵,Rsync同步代碼到宿主機谨究。
- 第一次部署:宿主機通過代碼目錄(/var/www)的docker-compose up,啟動Docker 實例泣棋,Docker實例內(nèi)部使用PM2管理node進程胶哲,并開啟代碼監(jiān)聽。
- 再次部署:不需要再docker-compose up潭辈,Rsync 同步最新的代碼到宿主機代碼目錄鸯屿,Docker 實例中的PM2監(jiān)聽到代碼的變化,重啟了node進程把敢。代碼更新到最新寄摆。
至此,完整的流程走完修赞。
配置jenkins
開始登入我們的Jenkins 虛擬機:
安裝必要的工具:git婶恼,rsync
進入Jenkins web:http://192.168.226.137:8080/
首先安裝NodeJS Plugin,不然NPM安裝會不可用。首先安裝上插件柏副,重啟jenkins勾邦。找到j(luò)enkins的系統(tǒng)配置,Global Tools Configure割择,然后 找到NodeJS選項眷篇,配置一個可以安裝的NodeJS版本。
創(chuàng)建 工作腳本
新建一個自由項目seneca-listener
git 配置:https://github.com/luaxlou/micro-service-practice.git
配置環(huán)境勾選上NodeJs
增加構(gòu)建步驟 Execute Shell:下面是代碼
cd seneca-listener
npm install
rsync -avz --password-file=/etc/rsyncd.secrets $WORKSPACE/seneca-listener src@192.168.226.138::srchome
/etc/rsyncd.secrets 是密碼文件
rsync 簡單說下 src@192.168.226.138::srchome是什么意思
src 是在Rsync服務(wù)端設(shè)置的賬戶
srchome 是在Rsync服務(wù)端設(shè)置的代碼目錄(/var/www)
詳細的服務(wù)端配置:
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# configuration example:
uid = www
gid = www
use chroot = no
read only = no
# max connections = 4
# pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
[srchome]
path = /var/www/
comment = hello then
auth users = src
secrets file = /etc/rsyncd.secrets
list=yes
配置完畢荔泳,點擊開始構(gòu)建蕉饼。
創(chuàng)建另一個工作腳本
這次要創(chuàng)建的是應(yīng)用服務(wù):seneca-client
新建seneca-client 選擇從seneca-listener克隆。
更改下構(gòu)建步驟就可以:
cd seneca-client
npm install
rsync -avz --password-file=/etc/rsyncd.secrets $WORKSPACE/seneca-client src@192.168.226.139::srchome
點擊開始構(gòu)建
8 測試執(zhí)行
進入 192.168.226.138玛歌,微服務(wù)宿主機:
cd /var/www/seneca-listener
docker-compose up -d
[root@localhost seneca-client]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c35623a763f senecalistener_agent "pm2-docker proces..." 4 hours ago Up 4 hours senecalistener_agent_1
順利啟動
進入 192.168.226.139昧港,應(yīng)用服務(wù)宿主機:
cd /var/www/seneca-listener
docker-compose up -d
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b23f3b32f71 senecaclient_client "pm2-docker proces..." 4 hours ago Up 6 seconds senecaclient_client_1
同樣順利啟動
我們可以看下是否順利工作:
[root@localhost seneca-client]# docker attach senecaclient_client_1
0|seneca-c | { id: 71,
0|seneca-c | message: 'Hello World!',
0|seneca-c | from: { pid: 22, file: 'index.js' },
0|seneca-c | now: 1507823144963 }
1|seneca-c | { id: 48,
1|seneca-c | message: 'Hello World!',
1|seneca-c | from: { pid: 28, file: 'index.js' },
1|seneca-c | now: 1507823145039 }
可以看到應(yīng)用服務(wù)已經(jīng)順利啟動,并且得到了微服務(wù)的反饋支子。
先別退出這個終端创肥,我們下面來個測試
9 看看CI是否工作
我們開始更改seneca-client下隨便一處的代碼,然后提交,為方便測試(可以fork我的項目)瓤的。
然后提交休弃。
jenkins 開始構(gòu)建(webhook的配置略,網(wǎng)上搜下很多)圈膏。
構(gòu)建完畢后塔猾,我們看到senecaclient_client_1實例有些變化:
可以看到PM2監(jiān)聽到變化,自動重啟了node進程稽坤,而沒有重啟docker實例丈甸。
總結(jié)
至此,對于Docker微服務(wù)的探索階段已經(jīng)結(jié)束尿褪。后面就是一些細化的工作睦擂,比如安全性加固,監(jiān)控杖玲,服務(wù)健康數(shù)據(jù)收集等顿仇。
這篇算是Docker微服務(wù)收關(guān)之作吧,如果需要交流摆马,可以加我臼闻,知無不言。已經(jīng)有很多年沒有正兒八經(jīng)寫過文章了囤采,文筆已經(jīng)大不如前述呐,勁量寫得不那么晦澀。
非常感謝簡書這么照顧蕉毯,上一篇文章直接給推薦到首頁了乓搬,好久沒感受到這樣的榮譽了。
因為失業(yè)的緣故代虾,時間有一大把进肯,可以把一些未完的研究做完。接下去還是會繼續(xù)寫下去褐着,有些東西之前一直停留在腦子里坷澡,還需要沉淀下。
福兮禍之所伏含蓉,禍兮福之所倚。
收工项郊,睡覺馅扣。