9C4.使用Docker和启动脚本
原创PracticeDockerOperation大约 4 分钟
9C4.使用Docker和启动脚本
Wings提供两种方式,用来发布和启动应用,
- script - 基于shell脚本的发布和管理
- docker - 基于docker的发布和管理
9C4.1.Script方式
- release.sh - 拉取、打包、推送的脚本
- starter.sh - 启动、停止和监控的脚本
以上脚本,都支持<同名>.env
的配置来覆盖默认参数。
1a.发布脚本
## 使用app名字,软连接到脚本
ln -s wings-release.sh winx-admin.sh
## 建立同名配置文件
vi winx-admin.env
## 从git上拉取代码
./winx-admin.sh pull
## 使用mvn或web打包
./winx-admin.sh pack
## 推送成果物到应用服务器
./winx-admin.sh push
## 查看更多帮助
./winx-admin.sh help
1b.启动脚本
## 使用app名字,软连接到脚本
ln -s wings-starter.sh winx-admin.sh
## 建立同名配置文件
vi winx-admin.env
## 安全启动
./winx-admin.sh start
## 查看状态
./winx-admin.sh status
## 安全停止
./winx-admin.sh stop
## 查看更多帮助
./winx-admin.sh help
9C4.2.Docker方式
Docker管理的好处是不依赖服务器环境配置,简单和统一。 以下的功能及lib可不需要,在构建前或工程中移除。
spring-boot-devtools-*.jar
spring-boot-docker-compose-*.jar
spring-boot-admin-*.jar
- spring
actuator-*
2a.分层构建
SpringBoot工程在repackage后,通常会有100+M之多,而其中的lib占比95+%, 因此,实践中docker被分成2个layer,一个是dep
,一个是app
。
- docker-dep - 排除
*-SNAPSHOT.jar
后的工程依赖*.jar
- docker-app -
*-SNAPSHOT.jar
和工程文件(classes/
,resources/
)
相当于java -Djarmode=layertools -jar target/*.jar extract
后,
- dependencies - docker-dep
- spring-boot-loader - 可忽略,main-class比JarLauncher启动快
- snapshot-dependencies - docker-app
- application - docker-app
这样,docker-dep
编译一次即可,而每次编译docker-app
体积都很小。
2b.构建方式
构建docker,大概有以下三种实践,
- docker.sh - 基于Dockerfile的构建,比较灵活
- jib maven - OCI格式,不需要Dockerfile,可不需要docker
- buildpack maven - OCI格式,不需要Dockerfile,需要docker
2c.docker.sh构建
使用wings-docker.sh
,保留springboot默认结构,使用JarLauncher启动。
## 使用spring打包成fatjar
mvn clean package
## 解压 fatjar 构建 docker-dep
wings-docker.sh unzip dep target/winx-admin-3.2.110-SNAPSHOT.jar
wings-docker.sh build dep target/winx-admin-3.2.110-SNAPSHOT.jar
## 从 docker-dep,构建 docker-app
wings-docker.sh unzip app target/winx-admin-3.2.110-SNAPSHOT.jar
wings-docker.sh build app target/winx-admin-3.2.110-SNAPSHOT.jar
## 一步构建 docker-all
wings-docker.sh build all target/winx-admin-3.2.110-SNAPSHOT.jar
构建成功后,其docker内/app/
目录布局如下,
BOOT-INF/{classes,lib,...}
- 代码及依赖META-INF/{services,spring.components,...}
- 配置及属性org
- Spring JarLauncher{conf,data,logs}
- VOLUME
springboot repackage时会对lib进行优化,比如
- 移除
spring-boot-autoconfigure-processor.jar
- 编译时生成spring-autoconfigure-metadata.properties
- 移除
spring-boot-configuration-processor.jar
- 编译时生成spring-configuration-metadata.json
- 移除
spring-boot-starter-*.jar
- 按springboot约定是空包
- 增加
spring-boot-jarmode-layertools.jar
- 以能够按层解包
java -Djarmode=layertools
- 以能够按层解包
2d.docker启动
## bridge network
WINGS_DOCKER_NET=wings-app
## 创建目录和配置
mkdir -p {data,conf,logs}
cat > conf/application.properties <<'EOF'
## mysql host
winx.database.host=host.docker.internal:51487
## boot admin host
spring.boot.admin.client.url=http://host.docker.internal:8093
## jdbc debug
logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
EOF
## docker 启动选项
WINGS_DOCKER_OPTS=(--network $WINGS_DOCKER_NET -e TZ=Asia/Shanghai -v ./data:/app/data -v ./conf:/app/conf -v ./logs:/app/logs -p 8091:8080)
docker network create --driver bridge $WINGS_DOCKER_NET
## 进入 docker shell
docker run -it --rm ${WINGS_DOCKER_OPTS[@]} --user root --entrypoint /bin/bash winx-admin:3.2.110-SNAPSHOT
## 启动 spring 应用
docker run -it --rm ${WINGS_DOCKER_OPTS[@]} winx-admin:3.2.110-SNAPSHOT
上述脚本以 winx-admin
为例,在配置 winx-devops
时,把8091
变为8093
。 分别启动 admin和devops两个docker容器后,可以访问以下URL测试,
- admin swagger http://localhost:8091/swagger-ui/index.html
- devops boot-admin http://localhost:8093/login
- 用户为
boot-admin-server
- 密码为
$DING_TALK_TOKEN
, - 否则为
!!!YOU_MUST_USE_STRONG_PASSWORD_HERE!!!
- 用户为
2e.Jib构建OCI
Jib 可不依赖于docker,默认构建OCI格式
## 编译并安装到本地
mvn clean install
## 使用 docker daemon
mvn -P'docker,docker-dep' jib:dockerBuild -Ddocker.to.prefix=fessional/
mvn -P'docker,docker-app' jib:dockerBuild -Ddocker.to.prefix=fessional/ -Ddocker.from.prefix=docker://fessional/
#mvn -P'docker,docker-app' jib:build -Ddocker.to.prefix=fessional/ -Ddocker.from.prefix=fessional/
## 使用 docker registry
mvn -P'docker,docker-dep' jib:dockerBuild -Ddocker.to.prefix=docker.io/fessional/
mvn -P'docker,docker-app' jib:dockerBuild -Ddocker.to.prefix=docker.io/fessional/ -Ddocker.from.prefix=docker.io/fessional/
## 一步构建 docker-all
mvn -P'docker' jib:dockerBuild -Ddocker.to.prefix=fessional/
其中,两种构建方式存在以下不同,
jib:dockerBuild
- 依赖本地Dockerjib:build
- 不依赖本地Docker,默认推送到docker hub
构建成功后,其docker内/app/
目录布局如下,
{classes,libs}
- 代码及依赖resources/META-INF/spring.components
- 配置及属性jib-classpath-file
- java类路径jib-main-class-file
- java主函数{conf,data,logs}
- VOLUME
2f.Jib启动
同docker启动,不过增加了fessional
前缀,以便区分。
## docker 启动选项
WINGS_DOCKER_OPTS=(--network $WINGS_DOCKER_NET -e TZ=Asia/Shanghai -v ./data:/app/data -v ./conf:/app/conf -v ./logs:/app/logs -p 8093:8080)
## 进入 docker shell
docker run -it --rm ${WINGS_DOCKER_OPTS[@]} --user root --entrypoint /bin/bash fessional/winx-devops:3.2.110-SNAPSHOT
## 启动 spring 应用
docker run -it --rm ${WINGS_DOCKER_OPTS[@]} fessional/winx-devops:3.2.110-SNAPSHOT
2g.buildpack构建
通常需要根据项目的实际需要,自定义CNB的以下属性。
builder
- 默认 paketobuildpacks/builder-jammy-base:latestrunImage
- 默认未指定env
- 构建环境buildpacks
- 建议自定义
默认构建不区分dep
和app
,仅用作示例。
## 编译并安装到本地
mvn clean install
## 本地构建
mvn -P 'image-paketo' spring-boot:build-image
构建成功后,其app-root
是/workspace/
(硬编码,如何改变?)结构同 fatjar,
BOOT-INF/{classes,lib,...}
- 代码及依赖META-INF/{services,spring.components,...}
- 配置及属性org
- Spring JarLauncher/app/{conf,data,logs}
- VOLUME