在微服務時代,服務數量及規模愈來愈大,服務的部署及運維的模式若是仍然採用傳統方式就會大大增長運維成本。因此微服務時代的運維方式必定是Devops模式,經過構建自動化運維發佈平臺來打通產品、開發、測試及運維流程,從而總體上提高研發效能,而這也是目前大部分公司正在作的事情。 java
隨着以Docker爲表明的容器化技術的普及,目前Devops實踐大多會採用容器(如Docker、K8s)這樣的方式來做爲微服務應用部署運行的載體,並經過容器的彈性擴展來實現快速擴容和縮容,從而更快地響應業務、更好地利用資源。 面試
目前Devops最流行的部署方案是基於K8s的集羣方案,可是它自己也是基於Docker容器技術的,因此在接觸K8s技術以前,先經過本文了解下Docker及基於Docker的容器化部署。 spring
Docker是一個開源的應用容器引擎,也是目前最流程的應用部署方式,經過它能夠把應用及其依賴打包到一個可移植的鏡像中,而後利用Docker提供的部署機制將其發佈至任意安裝了Docker容器的系統環境中。從使用角度主要須要理解一下幾個要點如圖所示:docker
如上圖所示,理解Docker的使用方式須要掌握如下幾個概念:springboot
Image(鏡像):它是一個可執行文件,包含應用代碼、依賴庫、運行環境(如JRE等)以及環境變量及配置等信息,經過鏡像能夠啓動一個應用,鏡像的構建過程經過Dockefile文件描述。 bash
Container(容器):使用Image啓動的一個進程實例,它與鏡像之間爲一對多的關係,一個鏡像能夠啓動多個容器實例。網絡
Service(服務):一組提供對外服務的Container,這些Container使用同一個Image鏡像,它與鏡像爲一對1、與容器爲一對多的關係,Service由docker-compose文件定義。 架構
爲了更進一步加深對上述概念的理解,這裏以一個Spring Boot應用爲例演示如何經過Docker部署一個Spring Boot服務。這裏能夠經過IDE建立一個簡單的Spring Boot應用並寫一個測試接口,以下圖所示:app
以上爲經過IDEA建立的一個最爲簡單的Spring Boot應用程序,運行後啓動服務能夠經過端口訪問測試接口,接下來使用Docker部署該服務,步驟以下:運維
建立Dockerfile文件構建Docker鏡像
按照前面Docker的介紹,若是要讓Spring Boot程序運行在Docker容器上,首先須要構建Docker鏡像,而構建的過程則須要經過Dockerfile文件來描述。例如在項目src/main/docker目錄建立Dockerfile文件,代碼以下:
FROM java:8 VOLUME /tmp RUN mkdir /app ADD springboot-1.0-SNAPSHOT.jar /app/springboot.jar ADD runboot.sh /app/ RUN bash -c 'touch /app/springboot.jar' WORKDIR /app RUN chmod a+x runboot.sh EXPOSE 9090 CMD /app/runboot.sh
上述Dockerfile文件定義了運行的基礎信息爲JDK1.八、容器運行的目錄爲/app、並添加了所需的Jar包等信息,最後定義了要執行的命令爲「/app/runboot.sh」腳本。runboot.sh腳本代碼以下:
sleep 10 java -Djava.security.egd=file:/dev/./urandom -jar /app/springboot.jar
這裏打包Spring Boot應用Docker鏡像的Dockerfile文件就定義好了,爲了能在Maven項目中執行Docker鏡像構建命令,還須要在項目pom.xml文件添加Maven Build插件信息,代碼以下:
<!--Docker Maven插件依賴--> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <configuration> <imageName>${project.name}:${project.version}</imageName> <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory> <skipDockerBuild>false</skipDockerBuild> <resources> <resource> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
接下來能夠經過Maven命令構建Spring Boot應用Docker鏡像,命令以下:
mvn clean package docker:build
運行成功能夠看到本地Docker倉庫中鏡像信息,命令以下:
這表示Spring Boot程序的Docker鏡像已打好,須要說明的是以上命令運行是須要你的系統已經安裝Docker容器運行環境。
建立docker-compose.yml文件
有了Docker鏡像,如何將鏡像做爲容器啓動以及該鏡像中啓動那些服務、它的資源限制及網絡使用什麼方式,這些都是docker-compose文件定義的,其代碼以下:
version: '3.2' services: springboot: image: springboot:1.0-SNAPSHOT hostname: springboot environment: - SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE:-debug} ports: - "9999:9090" networks: - mynet networks: mynet: external: true
在上述docker compose文件中定義了一個springboot服務,而後針對該服務描述了其所使用的Docker鏡像、環境變量參數、容器端口映射及網絡等信息。須要說明的是services下面還能夠定義服務,stack(應用)與service(服務)的關係在docker-compose中是一對多的關係,只是這裏暫時沒有須要定義其餘服務。
啓動Docker容器實現應用容器部署
經過上述準備,此時就能夠經過docker-compose啓動Spring Boot應用的Docker鏡像,目錄切換到src/main/docker目錄,執行以下命令:
$ docker-compose up -d Creating docker_springboot_1 ... done
此時應用就已經經過Docker容器部署了,能夠經過以下命令進行查看:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4117e4a8963e springboot:1.0-SNAPSHOT "/bin/sh -c /app/run…" 5 seconds ago Up 3 seconds 9090/tcp, 0.0.0.0:9999->9999/tcp docker_springboot_1
到這裏就大功告成了,訪問9999端口就可以訪問到Docker容器中的Spring Boot服務了。
歡迎你們關注我新開通的公衆號【風平浪靜如碼】,海量Java相關文章,學習資料都會在裏面更新,整理的資料也會放在裏面。
以爲寫的還不錯的就點個贊,加個關注唄!點關注,不迷路,持續更新!!!