微服務-將Spring boot服務docker化
1.
什麼是docker
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。
我的理解上docker與虛擬機器相比更加輕量,方便部署,佔用資源更少,但是與其他容器共享核心,是作業系統級別的虛擬機器而不是硬體級別的虛擬機器。
2.
為什麼要使用docker
主要原因是微服務將原來的單體架構服務拆分成數十個微服務,在這種情況下,數十個服務的環境配置-運維成本巨大。同時如果不將執行環境隔離的話,可能會有一個服務出問題拖所有服務下水的問題。
3.
將現有服務docker化
Step1.下載docker並安裝
Window10可以選擇 Docker Desktop,win7則只能使用docker toolbox,toolbox大概就是裝了一個虛擬機器,透過虛擬機器模擬liunx環境,然後在這種虛擬機器上執行docker。
Step2.docker打包
Dockerfile是docker打包映象時依據的元資料,docker會一步步執行dockerfile中 的指令,生成中間映象,並用中間映象進一步打包直至完成最終的映象輸出。Docker的規範可以參考官網:
https://docs。docker。com/engine/reference/builder/。
以下為目前使用的dockerfile:
FROM openjdk:8-jre
MAINTAINER Gzd<378687380@qq。com>
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo ‘Asia/Shanghai’ >/etc/timezone
COPY target/maneger。jar /manager-service。jar
CMD java $JAVA_OPTS -jar /manager-service。jar -Xmx=512m -Xms=512m -Xmn=128m -XX:PermSize=128m
如上,from openjdk表示這一映象的基礎映象是jdk,當然spring-boot專案需要在jdk環境下執行;隨後的兩個run指令設定了映象的執行時區;COPY指令將target資料夾中已經打包的jar包移動到容器中的相對路徑中,為什麼不在容器中打包?因為打包需要maven,沒必要額外引入;CMP指令是在執行時執行的指令,也就是java -jar執行spring-boot包。
Step3.docker打包
Docker build -t manager-service:test
該指令會執行上面dockerfile中定義的命令,打出映象名為manger-service,標籤為test的映象,此時映象的位置在docker虛擬機器中。
4.
搭建docker私庫及docker上傳
為什麼要搭建私庫?因為公庫在國外很難連,私庫相對快和安全一些。
Step1.在伺服器安裝docker
省略
Step2.在伺服器安裝docker私庫
伺服器能連線公網,所以直接從公庫上下載docker私庫在執行即可。
下載指令:
docker pull registry
執行指令:
docker run -d ——name registry -p 8087:5000 -v /opt/registry:/var/lib/registry registry
如上,-d表示後臺執行,-name表示容器名,-p 8087:5000表示將伺服器的8087埠對映到容器的5000埠,也就是私庫監聽的埠,-v指令則是將伺服器中的資料夾與容器中的資料夾進行對映,因為容器使用的檔案並不會在容器刪除後儲存,所以需要以這種形式保證上傳到私庫的映象不丟失。這樣我們就在8087埠部署了一個docker私庫。
Step3.映象上傳
docker tag manager-service:test 192。168。101。72:8087/petra/manager-service:0。0。2
如上,我們給映象一個與私庫掛鉤的別名,並將其tag改為0。0。2
docker push 192。168。101。72:8087/petra/manager-service:0。0。2
這條指令用於將docker映象上傳到容器,為了繞過安全檢驗(至少目前不需要),我們還需要將以下指令放到docker配置檔案中:
——insecure-registry 192。168。101。72:8087
5.
執行docker映象
關於docker映象與容器的關係可以參看:10張圖帶你深入理解Docker容器和映象 - DockOne。io
按照上文,專案打包成映象——-只讀檔案層,容器則是映象+讀寫檔案層,執行態容器是可讀寫的統一檔案系統加上隔離的程序空間和包含其中的程序。所謂的執行docker映象就是將這個映象加上讀寫層,然後放入隔離程序空間中執行的過程。
指令如下:
docker pull localhost:8087/manager-service:0。02
docker run -d -p 8088:8080 localhost:8087/manager-service:0。02
透過這一指令,我們將上文上傳到私庫的docker映象下載,並建立一個docker容器執行這一映象,順便還把容器的埠暴露在宿主機的8088埠上了
如上,透過這些步驟,我們成功的完成了服務的docker化。
Tips:Docker清理指令:
docker rmi -f $(docker images -a | grep “none” | awk ‘{print $3}’)