史上最簡單的SpringCloud教程: docker部署spring cloud項目

一、docker簡介

Docker是一個開源的引擎,可以輕鬆的為任何應用創建一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集群和其他的基礎應用平台。

docker通常用於如下場景:

  • web應用的自動化打包和發布;
  • 自動化測試和持續集成、發布;
  • 在服務型環境中部署和調整資料庫或其他的後台應用;
  • 從頭編譯或者擴展現有的OpenShift或Cloud Foundry平台來搭建自己的PaaS環境。

Docker 的優點

  • 1、簡化程序:

    Docker 讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,便可以實現虛擬化。Docker改變了虛擬化的方式,使開發者可以直接將自己的成果放入Docker中進行管理。方便快捷已經是 Docker的最大優勢,過去需要用數天乃至數周的 任務,在Docker容器的處理下,只需要數秒就能完成。

  • 2、避免選擇恐懼症:

    如果你有選擇恐懼症,還是資深患者。Docker 幫你 打包你的糾結!比如 Docker 鏡像;Docker 鏡像中包含了運行環境和配置,所以 Docker 可以簡化部署多種應用實例工作。比如 Web 應用、後台應用、資料庫應用、大數據應用比如 Hadoop 集群、消息隊列等等都可以打包成一個鏡像部署。

  • 3、節省開支:

    一方面,雲計算時代到來,使開發者不必為了追求效果而配置高額的硬體,Docker 改變了高性能必然高價格的思維定勢。Docker 與雲的結合,讓雲空間得到更充分的利用。不僅解決了硬體管理的問題,也改變了虛擬化的方式。

上面文字參考了相關文章;另,關於docker 的安裝和基本的使用見相關教程。

二、準備工作

環境條件:

  • linux系統,不建議windows
  • docker最新版本
  • jdk 1.8
  • maven3.0

本文採用的工程來自第一篇文章的工程,採用maven的方式去構建項目,並採用docker-maven-plugin去構建docker鏡像。

三、改造工程、構建鏡像

改造eureka-server工程

在pom文件加上插件:

<build>n <plugins>n <plugin>n <groupId>org.springframework.boot</groupId>n <artifactId>spring-boot-maven-plugin</artifactId>n </plugin>n <!-- tag::plugin[] -->n <plugin>n <groupId>com.spotify</groupId>n <artifactId>docker-maven-plugin</artifactId>n <version>0.4.3</version>n <configuration>n <imageName>${docker.image.prefix}/${project.artifactId}</imageName>n <dockerDirectory>src/main/docker</dockerDirectory>n <resources>n <resource>n <targetPath>/</targetPath>n <directory>${project.build.directory}</directory>n <include>${project.build.finalName}.jar</include>n </resource>n </resources>n </configuration>n </plugin>n <!-- end::plugin[] -->n </plugins>n </build> n

Spotify 的 docker-maven-plugin 插件是用maven插件方式構建docker鏡像的。

  • imageName指定了鏡像的名字,本例為 forep/eureka-server
  • dockerDirectory指定 Dockerfile 的位置
  • resources是指那些需要和 Dockerfile 放在一起,在構建鏡像時使用的文件,一般應用 jar 包需要納入。

修改下配置文件:

server:n port: 8761neureka:n instance:n prefer-ip-address: truen client:n registerWithEureka: falsen fetchRegistry: falsen

編寫dockerfile文件:

FROM frolvlad/alpine-oraclejdk8:slimnVOLUME /tmpnADD eureka-server-0.0.1-SNAPSHOT.jar app.jarn#RUN bash -c touch /app.jarnENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]nEXPOSE 8761n

docker file編寫指令:

FROM

FROM <image>n FROM <image>:<tag>n FROM <image> <digest>n

FROM指令必須指定且需要在Dockerfile其他指令的前面,指定的基礎image可以是官方遠程倉庫中的,也可以位於本地倉庫。後續的指令都依賴於該指令指定的image。當在同一個Dockerfile中建立多個鏡像時,可以使用多個FROM指令。

VOLUME

格式為:

VOLUME ["/data"]n

使容器中的一個目錄具有持久化存儲數據的功能,該目錄可以被容器本身使用,也可以共享給其他容器。當容器中的應用有持久化數據的需求時可以在Dockerfile中使用該指令。

ADD

從src目錄複製文件到容器的dest。其中src可以是Dockerfile所在目錄的相對路徑,也可以是一個URL,還可以是一個壓縮包

ENTRYPOINT

指定Docker容器啟動時執行的命令,可以多次設置,但是只有最後一個有效。

EXPOSE

為Docker容器設置對外的埠號。在啟動時,可以使用-p選項或者-P選項。

構建鏡像

執行構建docker鏡像maven命令:

mvn cleannmvn package docker:buildn

構建eureka-server鏡像成功。

同理構建service-hi鏡像

  • pom文件導入同eurek-server
  • 修改下配置文件:

eureka:n client:n serviceUrl:n defaultZone: http://eureka-server:8761/eureka/ # 這個需要改為eureka-servernserver:n port: 8763nspring:n application:n name: service-hin

在這裡說下:defaultZone發現服務的host改為鏡像名。

  • dockefile 編寫同eureka-server
  • 構建鏡像:

mvn cleannmvn package docker:buildn

這時我們運行docke的eureka-server 和service-hi鏡像:

docker run -p 8761: 8761 -t forezp/eureka-serverndocker run -p 8763: 8763 -t forezp/service-hin

訪問localhost:8761

四、採用docker-compose啟動鏡像

Compose 是一個用於定義和運行多容器的Docker應用的工具。使用Compose,你可以在一個配置文件(yaml格式)中配置你應用的服務,然後使用一個命令,即可創建並啟動配置中引用的所有服務。下面我們進入Compose的實戰吧。

採用docker-compose的方式編排鏡像,啟動鏡像:

version: 3nservices:n eureka-server:n image: forezp/eureka-servern restart: alwaysn ports:n - 8761:8761nn service-hi:n image: forezp/service-hin restart: alwaysn ports:n - 8763:8763n

輸入命令: docker-compose up

發現2個鏡像按照指定的順序啟動了。

源碼下載:forezp/SpringCloudLearning

五、採用docker-compose編排並啟動鏡像

docker-compose也可以構建鏡像,現在我們採用docker-compose的方式構建鏡像。

現在以eureka-server為例:

將Dockerfile移到eureka-server的主目錄,改寫ADD的相對路徑:

FROM frolvlad/alpine-oraclejdk8:slimnVOLUME /tmpnADD ./target/eureka-server-0.0.1-SNAPSHOT.jar app.jarn#RUN bash -c touch /app.jarnENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]nEXPOSE 8761n

同理修改service-hi目錄;

編寫構建鏡像docker-compose-dev文件:

version: 3nservices:n eureka-server:n build: eureka-servern ports:n - 8761:8761nn service-hi:n build: service-hin ports:n - 8763:8763n

命令構建鏡像並啟動:

docker-compose -f docker-compose.yml -f docker-compose-dev.yml up n

源碼下載:forezp/SpringCloudLearning

轉載請標明出處:

史上最簡單的SpringCloud教程 | 第十一篇: docker部署spring cloud項目

本文出自方誌朋的博客

推薦閱讀:

Ribbon源碼分析系列(一)
Spring Boot 1.5.x新特性:動態修改日誌級別
Netflix Zuul與Nginx的性能對比
【spring指南系列】使用Redis進行消息傳遞

TAG:Spring | SpringCloud |