项目地址:GitHub
上面的项目基于 Spring Boot Admin 搭建的简易监控系统,包含一个
Admin 服务
项目spring-boot-ops-server
,以及两个客户端项目spring-boot-ops-client-1
、spring-boot-ops-client-2
;
通过案例讲解如何使用 Docker 部署服务,包括构建镜像、推送镜像到阿里云、启动服务、服务间通信;
Spring Boot Admin Reference Guide
Spring Boot Admin入门指南
SpringBoot Admin的简单使用
项目文件说明
- Dockerfile
每个项目的文件
FROM openjdk:8-jdk-alpine
WORKDIR /app
COPY target/{package-name}.jar /app/app.jar
ENTRYPOINT ["sh", "-c", "java -jar app.jar"]
- change-version.sh
改变项目版本的脚步,多模块项目比较方便;
pom.xml
需要依赖插件
插件
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<generateBackupPoms>false</generateBackupPoms>
</configuration>
</plugin>
文件内容
#!/bin/bash
#字符颜色显示
#-e:允许echo使用转义
#\033[:开始位
#\033[0m:结束位
#\033等同于\e
if [ ! -n "$1" ]; then
echo Please Enter 版本参数
exit
fi
echo -e "\033[35m[$1]\033[0m Staring... "
echo '+++++++++++++++++++++++++++++++++++++++++++++++++'
echo -e "更新主项目版本 \033[35m[$1]\033[0m Starting... "
mvn versions:set -DnewVersion=$1
echo -e "更新主项目版本 \033[35m[$1]\033[0m Done... "
echo '+++++++++++++++++++++++++++++++++++++++++++++++++'
echo -e "更新子项目版本 \033[35m[$1]\033[0m Starting..."
mvn -N versions:update-child-modules
echo -e "更新子项目版本 \033[35m[$1]\033[0m Done... "
echo '+++++++++++++++++++++++++++++++++++++++++++++++++'
echo -e "更新项目版本 \033[35m[$1]\033[0m 提交... "
mvn versions:commit
echo '+++++++++++++++++++++++++++++++++++++++++++++++++'
echo -e "\033[35m[$1]\033[0m Done... "
执行脚步: ./change_version.sh 1.0.0
- build.sh
构建项目 docker 镜像脚步
#!/bin/bash
# $1 是执行脚步传进来的变量, 这里表示 项目名
SERVICE_NAME=$1
cd $SERVICE_NAME
# mvn clean install -pl ./$s1/pom.xml
# 打包构建
mvn clean package -Dmaven.test.skip=true
REGISTRY=阿里云镜像地址
REGISTRY_NAMESPACE=镜像空间
TAG="$RANDOM"
REPOSITORY=$REGISTRY/$REGISTRY_NAMESPACE/$SERVICE_NAME
IMAGE=$REPOSITORY:$TAG
docker build --build-arg APP=$SERVICE_NAME -t $IMAGE .
IMAGE_ID=$(docker images | grep $REPOSITORY | grep $TAG | grep -v grep | awk '{print $3}')
echo -e "\033[34m构建镜像完成\033[0m: \033[35m$IMAGE_ID\033[0m \033[35m$IMAGE\033[0m"
# IMAGE_AND_REPOSITORY=$(docker build --build-arg APP=$SERVICE_NAME -t $IMAGE . | tail -n 2 | awk '{print $3}' | xargs echo)
# echo -e "\033[34m构建镜像完成\033[0m: \033[35m$IMAGE_AND_REPOSITORY\033[0m"
# 是否推送到镜像中心
PUSH=-P
for i in "$@"; do
if [ i == "$PUSH" ]; then
echo -e "推送镜像「$IMAGE」到仓库 Starting..."
docker push $IMAGE
echo -e "推送镜像「$IMAGE」到仓库 Done..."
break
fi
done
主项目 REAMDE.md
以下是文件的内容
spring-boot-ops
Spring Boot 运维监控
- 构建项目
./build.sh {项目目录} [-P]
-P
参数是否把镜像推送到仓库
- 启动
- 创建网络
保证多个 Docker 容器可以互通
docker network create -d bridge {net-name}
查看网络
docker network ls
- 查看镜像
docker images
- 启动容器
docker run -i -t -d -p port:port --name {自定义容器名字} --network {net-name} --network-alias {自定义网络别名} 镜像名字:镜像标签
自定义容器名字
这个参数是可以随便自定义的代表容器名字
net-name
这是在第一步创建的网络,这是为了保证多个 Docker 容器可以网络互通
自定义网络别名
这个可以理解为 hostname;可以在其他 Docker 容器内直接使用它;
- 启动例子
docker network create -d bridge dev-ops
docker run -i -t -d -p port:port --name spring-boot-ops-server --network dev-ops --network-alias devops-server-admin {REGISTRY}/{REGISTRY_NAMESPACE}/{SERVICE_NAME}:{TAG}
docker run -i -t -d -p 9091:9091 --name spring-boot-ops-client-1 --network dev-ops --network-alias devops-client-1 {REGISTRY}/{REGISTRY_NAMESPACE}/{SERVICE_NAME}:{TAG}
{REGISTRY}/{REGISTRY_NAMESPACE}/{SERVICE_NAME}:{TAG}
变量请参考build.sh
脚步文件中的变量; REGISTRY、REGISTRY_NAMESPACE 是阿里云镜像提供
例如:
registry.cn-hangzhou.aliyuncs.com/namespace/spring-boot-ops-server:32642
- 说明
执行上面命令后,
spring-boot-ops-client-1
容器可以直接使用spring-boot-ops-serve
容器的--network-alias
devops-server-admin;例如: http://devops-server-admin:9090