深入淺出微服務架構:一分鐘讓你輕鬆上手Docker容器

深入淺出微服務架構:一分鐘讓你輕鬆上手Docker容器

在微服務時代,服務數量及規模越來越大,服務的部署及運維的模式如果仍然採用傳統方式就會大大增加運維成本。所以微服務時代的運維方式一定是Devops模式,通過構建自動化運維發佈平臺來打通產品、開發、測試及運維流程,從而整體上提升研發效能,而這也是目前大部分公司正在做的事情。

隨着以Docker爲代表的容器化技術的普及,目前Devops實踐大多會採用容器(如Docker、K8s)這樣的方式來作爲微服務應用部署運行的載體,並通過容器的彈性擴展來實現快速擴容和縮容,從而更快地響應業務、更好地利用資源。

目前Devops最流行的部署方案是基於K8s的集羣方案,但是它本身也是基於Docker容器技術的,所以在接觸K8s技術之前,先通過本文了解下Docker及基於Docker的容器化部署。

Docker的基本概念

Docker是一個開源的應用容器引擎,也是目前最流程的應用部署方式,通過它可以把應用及其依賴打包到一個可移植的鏡像中,然後利用Docker提供的部署機制將其發佈至任意安裝了Docker容器的系統環境中。從使用角度主要需要理解一下幾個要點如圖所示:

深入淺出微服務架構:一分鐘讓你輕鬆上手Docker容器

如上圖所示,理解Docker的使用方式需要掌握以下幾個概念:

  • Image(鏡像):它是一個可執行文件,包含應用代碼、依賴庫、運行環境(如JRE等)以及環境變量及配置等信息,通過鏡像可以啓動一個應用,鏡像的構建過程通過Dockefile文件描述。

  • Container(容器):使用Image啓動的一個進程實例,它與鏡像之間爲一對多的關係,一個鏡像可以啓動多個容器實例。

  • Service(服務):一組提供對外服務的Container,這些Container使用同一個Image鏡像,它與鏡像爲一對一、與容器爲一對多的關係,Service由docker-compose文件定義。

  • Stack(應用):一組Service,相互協作對外提供服務,可以看作是一個完整的應用,在一些複雜的場景中會拆分爲多個Stack,由docker-compose構建。

Docker部署一個Spring Boot服務

爲了更進一步加深對上述概念的理解,這裏以一個Spring Boot應用爲例演示如何通過Docker部署一個Spring Boot服務。這裏可以通過IDE創建一個簡單的Spring Boot應用並寫一個測試接口,如下圖所示:

深入淺出微服務架構:一分鐘讓你輕鬆上手Docker容器

以上爲通過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.8、容器運行的目錄爲/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倉庫中鏡像信息,命令如下:

深入淺出微服務架構:一分鐘讓你輕鬆上手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相關文章,學習資料都會在裏面更新,整理的資料也會放在裏面。

覺得寫的還不錯的就點個贊,加個關注唄!點關注,不迷路,持續更新!!!

海量面試、架構資料分享

深入淺出微服務架構:一分鐘讓你輕鬆上手Docker容器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章