當一個公司越做越大的時候,公司的系統應用也會隨著不斷增加的新業務變得越來越復雜和越來越臃腫,這個時候就需要將這些復雜臃腫的應用拆分成一個個的微服務,分而治之。微服務是現在企業級應用開發中流行的一個概念,涉及很多地方,下面我們從其中的一個小方面,微服務的封裝,來做一個實踐。
-
選型
docker。 docker的大名大家應該都如雷貫耳了,用docker封裝微服務可以省去運維上的麻煩,沒有復雜的操作手冊,無需一遍又一遍的執行一些繁瑣的shell命令,也不會出現諸如“在我電腦上是沒問題的啊”這種說不清楚的問題,用docker來封裝微服務,操作簡單,省時省力。
springboot。被封裝的微服務樣例使用springboot來搭建。
ubuntu。服務器環境。下面的例子中的ubuntu環境運行在我本地的虛擬機中。
centos。微服務的運行環境。
-
安裝docker
在Ubuntu環境中運行一下命令即可
apt install docker.io
-
獲取centos鏡像
centos是目前主流的服務器linux的發行版,占用資源少,且穩定。我們先從docker的鏡像庫中搜索centos,并根據獲取到本地
- 搜索centos鏡像
docker search centos
- 根據搜索到的NAME參數,獲取鏡像到本地,不加版本號的情況下,默認拉取的是最新版本
docker pull centos
- 查看本地鏡像
docker images
-
制作自己的鏡像,這一步中需要將已經編寫好并導出的springboot應用jar包復制到centos鏡像中,并且在鏡像中配置好jdk
-
將要上傳的jar包和上傳到ubuntu的目錄
4.jpg - 啟動centos容器
-
docker run -i -t -v /home/kuzz/software/:/mnt/software/ ff426288ea90 /bin/bash
這條命令比較長,我們稍微分解一下,其實包含以下三個部分:docker run <相關參數> <鏡像 ID> <初始命令>
其中,相關參數包括:
-i:表示以“交互模式”運行容器
-t:表示容器啟動后會進入其命令行
-v:表示需要將本地哪個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄>
假設我們的所有安裝程序都放在了宿主機的/root/software/目錄下,現在需要將其掛載到容器的/mnt/software/目錄下。
也就是說:/root/software/是本來虛擬機的真實目錄,其對應的容器中的目錄為:/mnt/software/。
那么虛擬機中/home/kuzz/software/下存放的文件信息,到容器的/mnt/software/能對應的看到文件信息。
-
解壓jdk
將jdk壓縮包解壓到指定目錄,我在centos的鏡像中創建了一個/app/java的目錄,并解壓在這個目錄中
6.jpg -
將應用jar包復制到指定目錄,我放在了/app/simpleboot目錄中
7.jpg這里這個jar就是需要被封裝的微服務,功能比較簡單,就是在獲取到http請求時,打印一段文字,名字叫simpleboot.jar
- 退出容器
exit
- 找到剛剛編輯過的容器id
docker ps -a
- 提交更改,將更改保存為一個新鏡像,這里我將新鏡像命名為kuzz/simpleboot,版本號為0.1
docker commit d5803e784667 kuzz/simpleboot:0.1
- 此時輸入命令查看鏡像,本地已經有了新保存的鏡像
docker images
-
編輯Dockerfile文件
在ubuntu目錄中新建一個Dockerfile文件,內容如下,其中FROM指定基礎鏡像,ENV為啟動時的環境變量,ENTRYPOINT為啟動時運行的命令。
11.jpg
- 根據Dockerfile編譯生成新鏡像,命令中-t 指定新鏡像名字,命令最后的 . 表示Dockerfile所在的目錄
docker build -t newboot .
此時查看本地鏡像,可以發現新生成的鏡像newboot也在其中了
- 啟動新容器,其中-d 表示以守護進程的方式啟動,-p綁定宿主機和容器的端口,下面18080位宿主機ubuntu的端口,8080為容器中的端口
docker run -d -p 18080:8080 newboot
-
此時在瀏覽器中輸入unbuntu的ip和18080端口,就可以訪問被封裝的服務了
14.jpg
-
操作過程中可能遇到的一些問題
由于上面整個過程是在虛擬機中完成的,所以當最后在本地電腦中訪問虛擬機ubuntu的18080端口時訪問不了,原因是ubuntu的防火墻禁止訪問了這個端口。執行以下命令可開啟端口
ufw allow 18080
若ubuntu中未安裝 ufw,可用以下命令安裝
apt-get install ufw
若用ufw開啟端口后仍不能訪問,可試著刪除防火墻后,再安裝ufw
apt-get remove iptables
-
后記
實際上上面的操作也略顯繁瑣了,在正常的可以訪問外網的服務器上,我們完全可以直接將centos作為基礎包,即Dockerfile中的FROM參數,然后再將上傳jdk和jar包的動作配置在Dockerfile中完成,但考慮到真實的部署場景可能服務器并不能訪問外網,需要將centos,還有jdk等都先配置好,在將鏡像傳到生產服務器上運行啟動,所以選擇了先拉取外網鏡像庫中的centos,再創建一個本地的鏡像這樣的做法。
docker的功能強大,能做的事情遠不止與此,配置也可以有很多其他靈活的方法,以上的實踐純屬拋磚引玉,歡迎一起探討。