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映象
-
方法一:可以直接使用命令(需要配置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 :
-
方法二,如果方法一實在不能行可以使用方法二(略麻煩,但可以跳過方法一說所的問題):
第一步、先編譯好專案,在專案根目錄下:
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所在路徑
-
其他:可以直接使用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/