運行環(huán)境
操作系統(tǒng):windows 10 企業(yè)版
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環(huán)境變量):
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]
解決發(fā)放(docker for windows)在沒有TLS的tcp:// localhost:2375上公開守護進程,如圖設置docker for windows :
image -
方法二较坛,如果方法一實在不能行可以使用方法二(略麻煩,但可以跳過方法一說所的問題):
第一步作瞄、先編譯好項目爪瓜,在項目根目錄下:
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服務編排
當所有要發(fā)布的項目都打包編譯好生成docker鏡像后,就可以統(tǒng)一使用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
是發(fā)布的別名缤至,不固定 -
image
是要發(fā)布的docker鏡像名 -
ports
是docker服務的端口轉發(fā) -
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/