史上最簡單的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>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId >
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- tag::plugin[] -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.3</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- end::plugin[] -->
</plugins>
</build>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
Spotify 的 docker-maven-plugin 外掛是用maven外掛方式構建docker映象的。
- imageName指定了映象的名字,本例為 forep/eureka-server
- dockerDirectory指定 Dockerfile 的位置
- resources是指那些需要和 Dockerfile 放在一起,在構建映象時使用的檔案,一般應用 jar 包需要納入。
修改下配置檔案:
server:
port: 8761
eureka:
instance:
prefer-ip-address: true
client:
registerWithEureka: false
fetchRegistry: false
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
編寫dockerfile檔案:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD eureka-server-0.0.1-SNAPSHOT.jar app.jar
#RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EXPOSE 8761
- 1
- 2
- 3
- 4
- 5
- 6
- 7
docker file編寫指令:
- FROM
FROM <image>
FROM <image>:<tag>
FROM <image> <digest>
- 1
- 2
- 3
- 4
FROM指令必須指定且需要在Dockerfile其他指令的前面,指定的基礎image可以是官方遠端倉庫中的,也可以位於本地倉庫。後續的指令都依賴於該指令指定的image。當在同一個Dockerfile中建立多個映象時,可以使用多個FROM指令。
- VOLUME
格式為:
VOLUME ["/data"]
- 1
使容器中的一個目錄具有持久化儲存資料的功能,該目錄可以被容器本身使用,也可以共享給其他容器。當容器中的應用有持久化資料的需求時可以在Dockerfile中使用該指令。
- ADD
從src目錄複製檔案到容器的dest。其中src可以是Dockerfile所在目錄的相對路徑,也可以是一個URL,還可以是一個壓縮包
- ENTRYPOINT
指定Docker容器啟動時執行的命令,可以多次設定,但是隻有最後一個有效。
- EXPOSE
為Docker容器設定對外的埠號。在啟動時,可以使用-p選項或者-P選項。
構建映象
執行構建docker映象maven命令:
mvn clean
mvn package docker:build
- 1
- 2
- 3
構建eureka-server映象成功。
同理構建service-hi映象
- pom檔案匯入同eurek-server
- 修改下配置檔案:
eureka:
client:
serviceUrl:
defaultZone: http://eureka-server:8761/eureka/ # 這個需要改為eureka-server
server:
port: 8763
spring:
application:
name: service-hi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
在這裡說下:defaultZone發現服務的host改為映象名。
-
dockefile 編寫同eureka-server
-
構建映象:
mvn clean
mvn package docker:build
- 1
- 2
- 3
這時我們執行docke的eureka-server 和service-hi映象:
docker run -p 8761: 8761 -t forezp/eureka-server
docker run -p 8763: 8763 -t forezp/service-hi
- 1
- 2
- 3
訪問localhost:8761
四、採用docker-compose啟動映象
Compose 是一個用於定義和執行多容器的Docker應用的工具。使用Compose,你可以在一個配置檔案(yaml格式)中配置你應用的服務,然後使用一個命令,即可建立並啟動配置中引用的所有服務。下面我們進入Compose的實戰吧。
採用docker-compose的方式編排映象,啟動映象:
version: '3'
services:
eureka-server:
image: forezp/eureka-server
restart: always
ports:
- 8761:8761
service-hi:
image: forezp/service-hi
restart: always
ports:
- 8763:8763
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
輸入命令: docker-compose up
發現2個映象按照指定的順序啟動了。
五、採用docker-compose編排並啟動映象
docker-compose也可以構建映象,現在我們採用docker-compose的方式構建映象。
現在以eureka-server為例:
將Dockerfile移到eureka-server的主目錄,改寫ADD的相對路徑:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD ./target/eureka-server-0.0.1-SNAPSHOT.jar app.jar
#RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
EXPOSE 8761
- 1
- 2
- 3
- 4
- 5
- 6
- 7
同理修改service-hi目錄;
編寫構建映象docker-compose-dev檔案:
version: '3'
services:
eureka-server:
build: eureka-server
ports:
- 8761:8761
service-hi:
build: service-hi
ports:
- 8763:8763
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
命令構建映象並啟動:
docker-compose -f docker-compose.yml -f docker-compose-dev.yml up
- 1
- 2