1.單體項目是否需要采用docker進行部署?
2.如果采用docker部署是否有必要采用docker-compose進行服務編排千贯?
答案是也許有必要新思,也許沒必要亿扁,docker的優(yōu)勢很多武鲁,但是對于垂直架構的項目優(yōu)勢未必那么明顯,總之一句你需要根據(jù)自己的項目情況去考慮头滔。筆者之所以會寫這篇文章怖亭,大概率是基于省事的目的去部署一些小的項目。同時也是提供一種前后端分離的項目的部署方案(但絕對不是最有方案),以及在這種模式下的docker如何去工作才能達到我們的目的坤检。
然而最終的目的是為了偷懶兴猩,省事。讓前后端分離項目的部署方式變的簡單早歇。就也許在這種模式下倾芝,你只需要5分鐘就可以實現(xiàn)部署,或許吧箭跳,不妨把這個當作一個目標晨另。
本文目標:
- 環(huán)境說明。
- 部署流程說明谱姓。
1.環(huán)境
1.1 項目情況
- springboot+maven
- redis
- mysql
- nginx
- vue(后臺web admin)
- uni-app(H5)
1.2 本地環(huán)境
- docker 19.03.2
- 其他開發(fā)必備(因為關聯(lián)不大借尿,所以不交代)
1.3 服務器環(huán)境
- 1臺 ubuntu 18.04 (基于Centos差異,在后續(xù)文章會進行交代)
- docker
- docker-compose
- 當前服務器docker上部署mysql,redis,nginx,java,admin,h5
1.4 鏡像倉庫
- 阿里云容器鏡像服務(免費屉来,個人覺得挺好用的路翻,有需要也可以去試一下)
2 部署流程
上圖將部署流程分為三部分,本地開發(fā)環(huán)境茄靠,阿里云容器鏡像服務茂契,以及l(fā)inux服務器。下面分成三個部分對上圖進行說明慨绳,工欲善其事掉冶,必先利其器真竖。先進行說明,后面才能對每部分做的工作比較清晰厌小。
2.1 本地開發(fā)環(huán)境
本地開發(fā)環(huán)境分成三個項目
- pitaya-java (springboot+maven)
- pitaya-h5(uni-app)
- pitaya-admin(vue)
三個項目分別打包成三個鏡像恢共,對應到阿里云中的是那個鏡像倉庫,三個鏡像名字分別為 - pitaya-java
- pitaya-h5
- pitaya-admin
然而我們版本迭代就設計到了不同的版本問題,對應了鏡像不同標簽tag召锈。
例如 pitaya-java:1.0.o 就說明是后臺1.o.0的版本旁振,版本保留在鏡像倉庫,這樣對于我們后期需要回滾版本也非常好做涨岁!
本地環(huán)境需要做的事情是需要打包鏡像并且推送到鏡像倉庫
這一點是大家需要記住的拐袜,這就是為什么一定要在這里寫這么多廢話來說明,至于怎樣打包鏡像推送梢薪,在下一片文章會講到蹬铺,此處大家只需要記住,鏡像是從開發(fā)環(huán)境推送過去的(或者也可以采用jenkins進行推送秉撇,如果有需要也可以在后面再去開專題寫用jenkins做持續(xù)集成)
2.2 阿里云容器鏡像服務說明
先解釋一下圖中的相關名詞
- 命名空間:阿里云容器服務的命名空間我習慣當成一個項目來用甜攀,例如我們開發(fā)一個crm項目,crm這個項目就相當于我們的命名空間琐馆。
- 鏡像倉庫:鏡像倉庫屬于命名空間规阀,一個命名空間有多個鏡像倉庫,就相當于我們一個crm項目有后臺java端的鏡像(如果微服務瘦麸,就可能拆分出更多的服務谁撼,我們可以把每個服務都當成一個鏡像倉庫),前端項目等滋饲。鏡像倉庫就對應我們每個服務打包的鏡像厉碟,他存儲著這些鏡像不同的版本。
- tag: tag其實本身是docker鏡像的概念屠缭,我們可以理解為一個鏡像的不同版本箍鼓。例如1.0.0,1.0.1等呵曹。
針對當前需要完成的目標來說款咖,相當于pitaya-java,pitaya-h5, pitaya-admin都分別擁有自己的鏡像倉庫奄喂,都屬于pitaya這個命名空間之剧。
容器鏡像服務,分門別類的存儲我們的鏡像
砍聊。這個是鏡像服務的唯一用途,就相當于maven的倉庫是一樣的贰军。
我們也可以搭建自己的私服倉庫玻蝌,例如開源的harbor等蟹肘,都非常好用,在企業(yè)中用私服會比較多俯树。
2.3 Linux服務器
首先我們需要在linux服務器上搭建Docker環(huán)境帘腹,也就是我們在linux上有一個docker。再將我們的鏡像運行在docker上许饿。
從上圖我們發(fā)現(xiàn)在docker上運行這很多容器阳欲,mysql,redis陋率,nginx球化,pitaya-java,pitaya-admin,pitaya-h5.
然而我們的容器是需要通信的,例如:大家都知道pitaya-java是一個springboot的項目瓦糟,他需要訪問mysql進行數(shù)據(jù)存儲服務筒愚,需要訪問redis緩存我們的令牌信息等。
也就是說菩浙,我們運行的這些容器之間是要相互能通信的巢掺。所以我們在docker上創(chuàng)建了一個內部網絡叫做pitaya-network,他在172.2.0.0這個網段劲蜻,我們需要我們的容器都加入pitaya-network這個網絡陆淀,并且分配固定的IP地址,指定固定端口。
為什么需要分配固定IP地址先嬉,指定固定端口?
因為我們的容器也可能會和服務器一樣轧苫,會掛掉,如果隨機分配的話坝初,創(chuàng)建新的容器浸剩,IP地址可能會變,我們容器間不能通信鳄袍,例如java服務訪問不了mysql绢要,這樣我們的線上就無法提供客戶正常服務了。
3 總結
本文我們做一個大概的概述拗小,針對上面的結構以下問題是我們急需解決的重罪?
- 1.如何制作鏡?
- 2.是否制作的鏡像可以不受環(huán)境影響哀九,例如數(shù)據(jù)庫鏈接等是可以在運行的時候指定的剿配?
- 3.如何推送鏡像到阿里云容器鏡像服務或者你的私服?
其實針對java項目和vue項目制作鏡像方式不同阅束,但是原理一樣呼胚,原理無非就是基于docker build這個命令制作鏡像,但是java的鏡像制作和推送可能更加簡單息裸,只需要一條命令即可蝇更,因為maven提供了制作鏡像的插件沪编。這些內容在下一篇文章都會涉及到!
3.1 其他想說的話
想要表達清楚一鍵事情是非常不容易的事情年扩,特別是通過文字蚁廓,既不想廢話連篇,又想表達清楚真的很難厨幻,因為細節(jié)比較多相嵌!然而我覺得弄清楚大方向是非常必要的,然后再進行分解况脆,希望能說的明白饭宾,我會加油的,如果寫的不好也希望大家原諒漠另!