Spring Boot在Docker上的部署

1、準備工做

1.1 安裝Docker環境

Docker 給舊版本的WIN系統提供的是Docker Toolbox下載(https://docs.docker.com/toolbox/overview/)。因此做者採用的是Docker Toolbox,下載後雙擊DockerToolbox.exe,java

注意安裝路徑不要有中文git

最後一項記得打上對勾github

安裝成功spring

 

安裝完成後桌面會生成三個快捷方式,分別爲:
(1) Docker Quickstart Terminal: 提供Docker的命令行操做
(2) Oracle VM VirtualBox:  虛擬機軟件
(3) Kitematic (Alpha):圖形化的docker工具

 

 

你可經過CMD查看docker是否安裝成功,輸入docker-machine,出現版本等信息。docker

   在使用Docker前,要先建立docker machine,它實際上是臺虛擬機,不過在使用它的時候,你可能根本察覺不出來它是虛擬的。默認狀況下,docker machine的全部文件都會保存在用戶的根目錄下,通常是在C盤,若是就用默認的位置,C盤的空間會愈來愈小,因此最好仍是換個地方。 點擊Git Bash,在起開全部docker應用以前須要先使用這個才能更改爲功,修改默認的default machine的路徑,否則,默認安裝在C盤,會使C盤空間愈來愈小。bash

1.2 準備Java鏡像

  (1)拉取java鏡像服務器

  # docker pull java => 默認爲最新版本的鏡像網絡

  # docker pull java:8 => 標籤爲8的java鏡像版本架構

  (2)查看java鏡像app

  # docker images java

  

  PS:java鏡像有點大啊,643MB

2、部署Spring Boot微服務到Docker

2.1 Spring Boot示例準備

  這裏以一個spring boot應用程序:eureka-service來介紹,它是基於spring cloud eureka的一個服務註冊與發現的微服務應用程序,你能夠從這裏獲取其源碼。

  

2.2 快速藉助Dockerfile部署到Docker

  (1)使用Maven打包項目:執行下面的命令,將其構建成jar包

MVN> mvn clean package  

  (2)在jar包所在目錄,建立Dockerfile文件,並添加如下內容

複製代碼
# 基於Java8鏡像
FROM java:8

# 將本地文件夾掛在到當前容器
VOLUME /tmp

# 複製文件到容器
ADD eureka-service-sn-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'

# 聲明須要暴露的端口
EXPOSE 9000

# 配置容器啓動後執行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
複製代碼

  (3)經過FTP工具將jar包和Dockerfile文件一塊兒傳送到服務器端,而後經過Shell工具登陸並跳轉到這個目錄下,執行如下命令打包鏡像:

  # docker build -t edc/discovery-service-eureka:0.0.1 . => 不要忘記這裏有個 .

  

  # docker images => 能夠看到在Java8的鏡像基礎之上,針對eureka-service的鏡像已準備好

  

  (4)啓動鏡像:

  # docker run --name eureka-service -d -p 8761:8761 edc/service-discovery-eureka:0.0.1

  

  (5)驗證是否已成功啓動:訪問http://docker宿主機IP:8761/,能夠正常顯示Eureka Server首頁。

3、使用Docker Compose編排微服務

3.1 Docker Compose簡介

  在實際的微服務架構中,通常包含不少個微服務,並且每一個微服務都會部署多個實例,若是每一個微服務都須要手動啓停,那麼效率會很低下,維護量也會很大。

  Compose是一個用於定義和運行多容器的Docker應用程序的工具,很是適合在開發、測試、構建CI工做流等場景。

  Compose的安裝請參考:https://docs.docker.com/compose/install/#install-compose

  

  安裝後驗證以下:# docker-compose --version

  

  PS:我這裏使用的Compose版本是1.22.0

3.2 Docker Compose快速入門示例

  首先,咱們來了解下使用Compose的3個基本步驟:

  • 使用Dockerfile(或其餘方式)定義應用程序環境,以便於在任何地方重現該環境
  • 在docker-compose.yml文件中定義組成應用程序的服務,以便各個服務在一個隔離的環境中一塊兒運行
  • 運行docker-compose up命令,啓動並運行整個應用程序

  其次,咱們仍然以上面的eureka-service爲例,來快速實踐一下Compose的基本步驟:

  (1)打包eureka-service,同上,再也不贅述

  (2)建立Dockerfile文件,同上,再也不贅述

  (3)在Dockerfile同一路徑下建立docker-compose.yml,並添加如下內容:

複製代碼
version: '3'
services:
  eureka:                      # 指定服務的名稱
    build: .                     # 指定Dockerfile所在路徑,注意這裏是個 .
    ports:
      - "8761:8761"         # 指定端口映射,相似docker run的-p選項,注意使用字符串形式
複製代碼

  (4)經過FTP工具將jar包、dockerfile以及docker-compose.yml一同拷貝到docker宿主機指定文件夾中

  (5)在這個目錄下執行如下命令,啓動容器。

  # docker-compose up

  

  PS:也可使用docker-compose up -d 來經過後臺運行的方式啓動並運行這些容器

  (6)驗證容器是否成功啓動:訪問http://docker宿主機IP:8761/,能夠正常顯示Eureka Server首頁。

 

  最後,說說Docker Compose將所管理的容器分爲三層,分別是工程(Project)、服務(Service)以及容器(Container)。Docker Compose運行目錄下的全部文件(docker-compose.yml、extends文件或環境變量文件等)組成一個工程(默認爲docker-compose.yml所在目錄的目錄名稱)。一個工程能夠包含多個服務,每一個服務定義了容器運行的鏡像、參數和依賴,一個服務能夠包括多個容器實例。

  

  對應上圖中的名稱,工程名稱是eureka-service(對應docker宿主機上的目錄名稱),該工程包含了1個服務,服務名稱是eureka。當執行docker-compose up命令時,啓動了eureka服務的1個容器實例eureka_1。

3.3 Docker Compose編排Spring Cloud微服務

  這裏仍然會採用在2.1節提到的部分示例來(詳情請參見github的part5部分)演示,將要編排的微服務列表以下表所示:

微服務項目名稱 項目微服務中的角色
eureka-service   服務發現&註冊組件
zuul-service   API網關
user-service   服務提供者
movie-service   服務提供者

  (1)分別經過maven打成jar包,再也不贅述。

  PS:能夠經過使用maven插件來構建docker鏡像,須要在pom.xml添加一些內容,這裏不闡述,有興趣的能夠百度一下。此外,因爲Docker默認網絡模式是bridge,各個容器的IP都不相同,所以若是在服務提供者的配置文件中設置了http://localhost:8761/eureka/會沒法知足要求。這時,咱們能夠爲Eureka Server所在容器配置一個主機名(例如discover),並讓各個微服務使用主機名來訪問Eureka Server。因此,這裏講全部微服務關於Eureka地址的配置改成以下內容:

eureka:
  client:
    serviceUrl:
      defaultZone: http://discovery:8761/eureka/

  (2)依次進行build打包docker鏡像,這裏仍然藉助dockerfile,即每一個微服務一個dockerfile

  

  (3)編寫docker-compose.yml文件

複製代碼
version: '3'
services:
  # 指定服務名稱
  eureka-service:
    # 指定服務所使用的的鏡像,後續再也不贅述
    image: edc/eureka-service:0.0.1
    # 暴露端口信息
    ports:
      - "8761:8761"
  zuul-service:
    image: edc/zuul-service:0.0.1
    # 鏈接到 eureka-service,這裏使用的是SERVICE:ALIAS的形式
    links:
      - eureka-service:discovery
  user-service:
    image: edc/user-service:0.0.1
    links:
      - eureka-service:discovery
  movie-service:
    image: edc/movie-service:0.0.1
    links:
      - eureka-service:discovery
複製代碼

  (4)執行如下命令啓動項目

  # docker-compose up -d

  PS:這裏加上了-d,表示後臺運行,不然你的整個屏幕都是日誌輸出...

  

  最終效果以下圖所示:

3.4 Docker Compose編排高可用的Eureka Server

  針對Eureka Server,實現高可用的話,也能夠經過Compose來編排Eureka Server集羣(好比一個2個節點的高可用最小規模集羣)。

  首先,須要針對Eureka Service的配置文件進行改造,以便經過一樣的配置屬性就能夠實現兩個節點的配置,這裏仍然使用2.1節中的github中的示例(參見part1部分)。下面是eureka-service-ha-1的配置項,eureka-service-ha-2同理,再也不贅述。

複製代碼
spring:
  application:
    name: eureka-service-ha-1
---
spring:
  # profile=peer1
  profiles: peer1
server:
  port: 8761
eureka:
  instance:
    # when profile=peer1, hostname=peer1
    hostname: peer1
  client:
    service-url:
      # register self to peer2
      defaultZone: http://peer2:8762/eureka
---
spring:
  # profile=peer2
  profiles: peer2
server:
  port: 8762
eureka:
  instance:
    # when profile=peer2, hostname=peer2
    hostname: peer2
  client:
    service-url:
      # register self to peer1
      defaultZone: http://peer1:8761/eureka
複製代碼

  從上面的配置文件中,兩個節點是經過spring.profiles.active來區分配置屬性的。

  而後,再來編寫一個針對高可用eureka server的docker-compose.yml文件:

複製代碼
version: '3'
services:
  # 指定服務名稱
  eureka-service-ha-1:
    hostname: peer1           # 指定hostname
    image: edc/eureka-service-ha:0.0.1-SNAPSHOT
    links:
      - eureka-service-ha-2   # 註冊到另外一個eureka-service中
    ports:
      - "8761:8761"
    environment:
      - spring.profiles.active=peer1
  # 指定服務名稱
  eureka-service-ha-2:
    hostname: peer2           # 指定hostname
    image: edc/eureka-service-ha:0.0.1-SNAPSHOT
    links:
      - eureka-service-ha-1   # 註冊到另外一個eureka-service中
    ports:
      - "8762:8762"
    environment:
      - spring.profiles.active=peer2      
複製代碼

  其餘步驟如3.3所述,這裏再也不進行演示。

3.5 Docker Compose編排可伸縮的微服務

  這裏仍然以3.3中的movie-service爲例,執行如下命令來達到微服務節點的擴展(這裏從1個節點變爲2個節點):

  # docker-compose scale movie-service=2

  從上圖能夠看出,movie-service實例已從1個變爲了2個。

  同理,要伸縮爲1個節點,只須要將2改成1便可,再也不贅述。

4、小結

  本文極簡地介紹瞭如何經過藉助dockerfile的方式部署一個spring boot應用程序到docker,docker compose的快速入門示例以及如何經過docker compose編排spring cloud微服務應用程序,還介紹了實現編排高可用eureka server以及可伸縮的微服務的實現思路。關於docker與docker compose,還有許許多多的內容,其官方文檔已經寫得很是詳細,並對常見的問題也已經有了不少詳細的總結,你們能夠參見:https://doc.docker.com/compose/faq/ 瀏覽。此外,十分感謝本文參考資料周立老師著的《Spring Cloud與Docker微服務架構實戰(第二版)》,帶我快速入門Spring Cloud的世界,謝謝!

相關文章
相關標籤/搜索