1. 程式人生 > >Docker編排SpringCloud微服務

Docker編排SpringCloud微服務

執行環境

作業系統:windows 10 企業版

docker for windows:2.0.0.0-win81

docker engine:18.09.0

docker compose:1.23.2

springboot專案構建docker映象

maven新增構建docker外掛

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <
version
>
1.3.6</version> <configuration> //要生成的docker映象的名稱 <repository>${docker.image.prefix}/${project.artifactId}</repository> </configuration> </plugin> //將jar解壓成目錄結構 <plugin> <groupId>org.apache.maven.plugins</groupId> <
artifactId
>
maven-dependency-plugin</artifactId> <executions> <execution> <id>unpack</id> <phase>package</phase> <goals> <goal>unpack</goal> </goals> <
configuration
>
<artifactItems> <artifactItem> <groupId>${project.groupId}</groupId> <artifactId>${project.artifactId}</artifactId> <version>${project.version}</version> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin>

在專案根目錄(與pom.xml同級)下新增Dockerfile,如:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG DEPENDENCY=target/dependency
COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY ${DEPENDENCY}/META-INF /app/META-INF
COPY ${DEPENDENCY}/BOOT-INF/classes /app
EXPOSE 8070
ENTRYPOINT ["java","-cp","app:app/lib/*","${springboot專案的啟動類}"]

上面的Dockerfile一定要把${springboot專案的啟動類}替換為自己專案的啟動目錄如com.xiaoyang.Application,其中Application是專案的啟動類。

將專案打包打包成docker映象

  1. 方法一:可以直接使用命令(需要配置maven環境變數):

    mvn clean package dockerfile:build
    

    可能會出現的問題,如:

    [ERROR] Failed to execute goal com.spotify:dockerfile-maven-plugin:1.3.6:build (default-cli) on project crm_service_member: Could not build image: java.util.concurrent.ExecutionException:com.spotify.docker.client.shaded.javax.ws.rs.ProcessingException: org.apache.http.conn.HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect -> [Help 1]
    

    解決發放(docker for windows)在沒有TLS的tcp:// localhost:2375上公開守護程序,如圖設定docker for windows :

  2. 方法二,如果方法一實在不能行可以使用方法二(略麻煩,但可以跳過方法一說所的問題):

    第一步、先編譯好專案,在專案根目錄下:

    mvn clean package
    

    第二步、直接使用docker命令執行Dockerfile生成映象:

    docker build -t [IMAGE_NAME]:[TAG] PATH
    如:docker build -t config:v1 .
    

    IMAGE_NAME:docker映象名

    TAG:docker映象tag

    PATH:Dockerfile所在路徑

  3. 其他:可以直接使用IDEA的工具執行指令。

docker-compose服務編排

當所有要釋出的專案都打包編譯好生成docker映象後,就可以統一使用docker-compose進行服務的編排。

在專案根目錄下建立docker-compose.yml,內容如:

eureka:
  image: spring-cloud-eureka
  ports:
  - 8070:8070
config:
  image: spring-cloud-config
  ports:
  - 8072:8072
  links:
  - center
user:
  image: user-server
  ports:
  - 8081:8081
  links:
  - center
  - config

說明:

  • eureka、config、user是釋出的別名,不固定
  • image是要釋出的docker映象名
  • ports是docker服務的埠轉發
  • links是當前執行的docker映象需要訪問的docker映象

對服務的修改

​ docker映象與docker映象之間訪問要採用別名,如config要訪問eureka

​ 使用別名如:

eureka:
    instance:
        prefer-ip-address: true
    client:
      registerWithEureka: true
      fetchRegistry: true
      serviceUrl:
          defaultZone: http://center:8070/eureka/

呼叫配置中心類似

docker-compose啟動順序問題

當我們有多個服務相互依賴,有的時候會出現當前容器所依賴的服務沒有啟動完成導致當前容器啟動失敗,如上述的docker-compose.yml的方式構建就會出現這種情況。

使用depends_on指定依賴服務,使用restart重啟服務,如:

version: "3"
services:
  eureka:
    image: spring-cloud-eureka
    ports:
    - 8070:8070
    restart: always

  config:
    image: spring-cloud-config
    ports:
    - 8072:8072
    depends_on:
    - eureka

  user:
    image: user-server
    restart: always
    ports:
    - 8081:8081
    depends_on:
      - eureka
      - config

其中restart:always代表重啟,always表示一直重啟,如果啟動失敗會重新啟動,一直失敗也會一直重新啟動

參考資料
http://spring.io/guides/gs/spring-boot-docker/
https://docs.docker.com/compose/overview/