極簡Docker持續(xù)集成微服務(wù)架構(gòu)-收關(guān)

前言

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)看上去是這樣的:

image.png
  1. Git Server:這個肯定少不了
  2. Jenkins server:CI 較成熟的工具赡茸,暫時沒找著替代品
  3. 應(yīng)用服務(wù)器宿主機集群:這里部署的都是應(yīng)用層的服務(wù)缎脾,對外做負載均衡方案,方案有很多占卧,就不細說遗菠。
  4. 微服務(wù)宿主機集群:因為不用做負載均衡方案,宿主機其實可以是分散的华蜒,相互之前可以沒什么關(guān)系辙纬。
  5. 消息服務(wù):適合使用比較穩(wěn)定的云服務(wù),也可以自己搭集群叭喜。
  6. 若干工作站

所有的宿主機采用的是相同配置和方案贺拣,這樣復(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)起來菲语。

我先講講整個機制:

  1. 工作站提交代碼到github
  2. github通過配置的webhook通知到j(luò)enkins服務(wù)器
  3. jenkins發(fā)起構(gòu)建任務(wù):克隆最新的代碼,npm 安裝擴展惑灵,Rsync同步代碼到宿主機谨究。
  4. 第一次部署:宿主機通過代碼目錄(/var/www)的docker-compose up,啟動Docker 實例泣棋,Docker實例內(nèi)部使用PM2管理node進程胶哲,并開啟代碼監(jiān)聽。
  5. 再次部署:不需要再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

image.png

增加構(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實例有些變化:

image.png

可以看到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ù)寫下去褐着,有些東西之前一直停留在腦子里坷澡,還需要沉淀下。

福兮禍之所伏含蓉,禍兮福之所倚。

收工项郊,睡覺馅扣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市着降,隨后出現(xiàn)的幾起案子差油,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蓄喇,死亡現(xiàn)場離奇詭異发侵,居然都是意外死亡,警方通過查閱死者的電腦和手機妆偏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門刃鳄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钱骂,你說我怎么就攤上這事叔锐。” “怎么了见秽?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵愉烙,是天一觀的道長。 經(jīng)常有香客問我解取,道長步责,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任禀苦,我火速辦了婚禮勺择,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伦忠。我一直安慰自己省核,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布昆码。 她就那樣靜靜地躺著气忠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赋咽。 梳的紋絲不亂的頭發(fā)上旧噪,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音脓匿,去河邊找鬼淘钟。 笑死,一個胖子當(dāng)著我的面吹牛陪毡,可吹牛的內(nèi)容都是我干的米母。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼毡琉,長吁一口氣:“原來是場噩夢啊……” “哼铁瞒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起桅滋,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤慧耍,失蹤者是張志新(化名)和其女友劉穎身辨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芍碧,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡煌珊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了泌豆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片定庵。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖践美,靈堂內(nèi)的尸體忽然破棺而出洗贰,到底是詐尸還是另有隱情,我是刑警寧澤陨倡,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布敛滋,位于F島的核電站,受9級特大地震影響兴革,放射性物質(zhì)發(fā)生泄漏绎晃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一杂曲、第九天 我趴在偏房一處隱蔽的房頂上張望庶艾。 院中可真熱鬧,春花似錦擎勘、人聲如沸咱揍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煤裙。三九已至,卻和暖如春噪漾,著一層夾襖步出監(jiān)牢的瞬間硼砰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工欣硼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留题翰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓诈胜,卻偏偏與公主長得像豹障,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耘斩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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