目录
介绍:使用goole jib插件构建镜像,docker stack启动部署服务;
通过执行两个脚本既可以实现构建镜像、部署服务的过程。本文将对两个脚本及其他核心配置文件做详细解释。
1.jib构建、推送镜像
1.1 执行脚本
执行脚本sh build.sh即可,脚本位于项目根目录下,脚本build.sh内容如下:
#!/bin/bash
echo "start build myApp image...."
# 指定选择prod环境
# 指定登录用户名/密码 admin/admin@server1,如果仓库没有设置登录验证,去掉此配置即可
# 通过goole的jib工具构建镜像,并将镜像推送到192.168.100.90:5000镜像仓库
# DsendCredentialsOverHttp=true,仓库是http则需要加上此参数配置
# -Djib.to.auth.username 目标镜像仓库的认证用户
# -Djib.from.auth.username 基础镜像仓库的认证用户
mvn clean compile jib:build -Djib.to.auth.username=admin -Djib.to.auth.password=admin@server1 -Djib.to.image=192.168.100.90:5000/myApp/backend_prod:2.2 -DsendCredentialsOverHttp=true -Djib.container.jvmFlags=-Dspring.profiles.active=prod,-Duser.timezone=Asia/Shanghai,-Xms4096m,-Xmx6144m,-Xmn512m
echo "end build myApp image...."
说明:选择prod环境配置,maven 清理后并编译打包代码,再通过jib工具构建镜像并推送到镜像仓库。
执行成功如下:
2.2 pom.xml配置
由于需要goole的jib插件,所以需要在pom.xml中配置jib,配置如下:
<plugin>
<!--goole提供的jib插件,具有构建build镜像、推送push镜像的功能-->
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.3.0</version>
<configuration>
<!-- 构建以java8为基础的镜像,相当于dockerfile文件中的from关键字。此处配置从指定仓库中下载Java8-->
<from>
<image>${registryUrl}/library/java:8-jre-alpine</image>
<!-- 基础镜像仓库的登陆认证-->
<!-- <auth>
<username>my_username</username>
<password>my_password</password>
</auth>-->
</from>
<!-- 可以在此配置构建的镜像名称、标签,目标镜像仓库的登陆认证。本文采取直接在build.sh脚本中配置的方式-->
<!-- <to>
<image>${registryUrl}/${registryNamespace}/${project.name}</image>
<tags>
<tag>${version}</tag>
</tags>
<auth>
<username>${registryUsername}</username>
<password>${registryPassword}</password>
</auth>
</to>-->
<!-- 配置:未配置安全认证的registry -->
<allowInsecureRegistries>true</allowInsecureRegistries>
<container>
<mainClass>com.fp.epower.EpowerApplication</mainClass>
<!--jvm参数配置,build.sh中已做了配置
<jvmFlags>
<jvmFlag>-Xms4096m</jvmFlag>
<jvmFlag>-Xmx6144m</jvmFlag>
<jvmFlag>-Xmn512m</jvmFlag>
</jvmFlags>-->
<!--配置使用的时区,build.sh中已做了配置
<environment>
<TZ>Asia/Shanghai</TZ>
</environment>-->
<!--设定容器时间-->
<creationTime>USE_CURRENT_TIMESTAMP</creationTime>
</container>
</configuration>
</plugin>
2.docker 部署镜像服务
2.1 执行脚本
sh deploy.sh start
在镜像所在服务器的(deploy.sh、docker-compose.yaml文件)目录下执行此脚本命令即可。deploy.sh脚本内容如下:
#!/bin/bash
cmd="$1"
service="$2"
config="$3"
basepath=$(cd `dirname $0`; pwd)
login(){
docker login 192.168.100.90:5000 --username=admin --password=admin@server1
}
start(){
echo "启动/更新服务"
#如果192.168.100.90:5000设有密码则需要登录,如果没有则注释掉此行命令;
#docker login 192.168.100.90:5000 --username=admin --password=admin@server1
#此处调用登陆方法,作用同上行注释命令
login
# 部署镜像服务,起名为myAppService。
# -c , --compose-file:指定stack file的路径位置为同此脚本目录下的docker-compose.yaml文件
#--with-registry-auth,向swarm代理发送registry认证详细信息
docker stack deploy -c $basepath/docker-compose.yaml myAppService --with-registry-auth
}
down(){
docker stack rm $service
}
# 查询stack服务中的容器运行状态
ps(){
docker stack ps $service
}
usage(){
echo "start version - 启动/更新服务"
echo "down - 删除服务"
echo "ps - 查看服务中容器的运行状态"
echo "login - 登录镜像仓库"
}
if [[ $cmd = "start" ]]; then
start
elif [[ $cmd = "down" ]]; then
down
elif [[ $cmd = "ps" ]]; then
ps
elif [[ $cmd = "login" ]]; then
login
else
usage
fi
2.2 compose文件
docker-compose.yaml文件内容如下:
#指定compose文件版本
version: '3'
#定义所有的service
services:
#定义一个service服我名,起名为backend
backend:
#镜像名称必须要与build.sh中起的名称一模一样
image: 192.168.100.90:5000/myApp/backend_prod:2.2
#挂载文件 宿主机文件路径:容器内文件路径
volumes:
- "/usr/local/project_data/my_service/report/:/usr/local/my_service/report/"
- "/usr/local/project_data/my_service/json/:/usr/local/my_service/json/"
- "/usr/local/project_data/my_service/logs/:/usr/local/my_service/logs/"
- "/usr/local/project_data/my_service/model/:/usr/local/my_service/model/"
deploy:
replicas: 1
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: any
delay: 10s
max_attempts: 3
window: 120s
resources:
limits:
memory: 20240M
reservations:
memory: 1024M
#端口映射
ports:
- "9001:9001"
本文件创建了一个名为“backend”的service,也可以在下面继续添加其他服务。(一般情况下将前端服务和后端服务都配置到同一个compose文件中,这样就可以通过deploy.sh同时部署前后端。)
3.docker stack常用命令
启动服务后可通过docker命令查看服务状态:
docker stack ls 查看服务列表
docker stack ps 服务名 查看服务状态
docker stack ps 服务名 --no-trunc 查看服务状态,不要截断输出
docke stack rm 服务名 删除服务