编译打包

应用代码采用Maven构建管理,可基于Docker实现容器化部署。

# 1. 模块组成

# 1.1 前端模块

...

# 1.2 后端模块

bm-auth
├── auth-admin 后台服务入口模块
├── auth-api-gateway API 网关
├── auth-biz 认证中心核心业务代码
├── auth-core 部分库代码
├── auth-demo SDK的测试代码
├── auth-entities 部分实体定义(跨模块的实体)
├── auth-feign-api Feign API
├── auth-init 数据库初始话工程(Flyway)
├── auth-sdk SDK工具包
├── auth-security 安全认证服务
├── auth-wiki 文档相关
1
2
3
4
5
6
7
8
9
10
11
12

# 2. 前端构建

# 2.1 配置服务地址

进入前端代码根目录下的子目录nginx,编辑default.conf文件,修改关键配置:

  • location / root 指定html代码路径(Dockerfile中决定了改代码的位置)。
# 将npm run build的构建结果dist复制到了/opt/auth/auth-html/目录
COPY ./dist/ /opt/auth/auth-html/
1
2
  • server location配置下的proxy_pass信息,指定后台服务的网关地址。

location / {
    try_files $uri $uri/ @router;
    index  index.html;
    # 代码路径
    root /opt/auth/auth-html/;
}

location /api/ {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-For $http_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Nginx-Proxy true;
    proxy_set_header Connection "";
    # 修改这里的地址
    proxy_pass   http://172.18.1.237:8002/;
    client_max_body_size 1000M;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 2.2 编译代码

进入前端你代码根目录,执行npm构建。

cnpm install
1
npm run build
1

# 2.3 构建Docker镜像

进入前端代码根目录,执行Docker Build构建脚本或直接执行命令。

docker build -t auth-html-tag .
1

其中tag标记镜像Tag名称。

# 2.4 创建Docker Image Tag

执行命令创建Docker镜像Tag。(docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG])

docker tag 30bd7379e40b 172.18.1.40:1180/geely_usercenter/auth-html:1.0.2
1

说明:上面命令中的镜像ID(30bd7379e40b)为 1.3编译后的输出的镜像ID。

# 2.5 推送镜像到目标仓库

执行命令docker push 仓库地址,如:

docker push 172.18.1.40:1180/geely_usercenter/auth-html:1.0.2
1

# 2.6 拉取目标镜像

登录Docker Server,拉取前端代码镜像。(docker pull [OPTIONS] NAME[:TAG|@DIGEST])

docker pull 172.18.1.40:1180/geely_usercenter/auth-html:1.0.2
1

# 2.7 运行容器

创建容器并运行。(docker run [OPTIONS] IMAGE [COMMAND] [ARG...])

docker run -p 3000:80 -d --name auth-html-1.0.2 30bd7379e40b
1
  • -p标记端口映射关系
  • -d标记后台运行
  • -name标记容器名称
  • 30bd7379e40b标记镜像ID

# 3. 后端构建(基于可执行jar)

以下基于Maven编译后的可执行jar,构建Docker Images并运行。

# 3.1 初始话应用目录

进入Docker Server宿主机服务器,创建一下目录:

mkdir -p /opt/auth/auth-admin/target
mkdir -p /opt/auth/auth-admin/config
1
2
mkdir -p /opt/auth/auth-api-gateway/target
mkdir -p /opt/auth/auth-api-gateway/config
1
2
mkdir -p /opt/auth/auth-security/target
mkdir -p /opt/auth/auth-security/config
1
2
mkdir -p /opt/auth/auth-init/target
mkdir -p /opt/auth/auth-init/config
1
2

说明:以上目录需建立在Docker Server宿主机目录下,而非容器内部!!!

# 3.2 上传服务Jar包

可通过scp或rz命令统将本地jar拷贝到远程服务器对应的target目录下。

# 3.3 创建Dockerfile文件

可将本地模块Dockerfile文件拷贝到如下目录。(Dockerfile文件在各模块根目录下获取)

  • /opt/auth/auth-admin/Dockerfile
  • /opt/auth/auth-api-gateway/Dockerfile
  • /opt/auth/auth-security/Dockerfile

文件示例:

FROM openjdk:8-jdk-alpine

MAINTAINER DaiJ "<daijiang@apegeek.com>"

RUN set -xe \
&& apk --no-cache add ttf-dejavu fontconfig

WORKDIR /opt/auth/auth-admin

COPY target/auth-admin.jar /opt/auth/auth-admin/auth-admin.jar

RUN sh -c 'touch /opt/auth/auth-admin/auth-admin.jar'

EXPOSE 10000

ENV JAVA_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=3"

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /opt/auth/auth-admin/auth-admin.jar"]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 3.4 构建Docker Image

分别进入存放Dockerfile文件的模块目录,执行build指令。例如:

cd /opt/auth/auth-admin

docker build -t auth-admin .

Build完成后可通过docker images查看生成的Docker镜像。

# 3.5 运行容器

镜像构建完成后,可通过docker run命令启动容器,运行镜像。

docker run -d -p 10000:10000 -v /opt/auth/auth-admin/config:/opt/auth/auth-admin --name auth-admin auth-admin:latest

  • -d 表示后台运行
  • -p 表示端口映射关系
  • -v 目录挂载,本地目录:容器目录 或 -v容器目录
        将本机的/opt/auth/auth-admin/config,挂载到镜像中的/opt/auth/auth-admin目录
  • --name 表示容器名称
  • auth-admin:latest 表示镜像和Tag

# 4. 后端构建(基于Maven Plugin)

基于Maven插件docker-maven-plugin可实现通过Maven命令进行Docker镜像的构建。

# 4.1 添加POM Properties

编辑服务模块pom文件,修改相关信息:

  • Docker Server:<docker.server></docker.server>
  • Docker Image 仓库:<docker.repostory></docker.repostory>
  • Docker Image 仓库名称:<docker.registry.name></docker.registry.name>
  • Docker Image 前缀:<docker.image.prefix></docker.image.prefix>
<docker.server>http://172.18.1.237:12375</docker.server>
<docker.repostory>172.18.1.40:1180</docker.repostory>
<docker.registry.name>geely_usercenter</docker.registry.name>
<docker.image.prefix>auth</docker.image.prefix>
1
2
3
4

# 4.2 添加POM插件配置

将如下配置添加到build->plugins节点下:

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <serverId>harbor</serverId>
        <registryUrl>http://${docker.repostory}</registryUrl>

        <dockerDirectory>${project.basedir}</dockerDirectory>
        <dockerHost>${docker.server}</dockerHost>

        <imageName>${project.artifactId}:${project.version}</imageName>
        <imageTags>
            <!-- tag 名称默认使用工程版本号 -->
            <imageTag>${project.version}</imageTag>
        </imageTags>

        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 4.3 编译构建

因为Maven Docker插件与Maven Package命令做了绑定,所以执行mvn package命令时会触发Docker Build动作,进而生成镜像。

mvn clean package

同时,因为pom中配置了docker server信息,所以产生的镜像会自动同步到目标Docker Server。

# 4.4 运行容器

如果镜像被直接push到了目标Docker Server,则登录Docker Server后可以直接通docker run启动镜像容器。如:

docker run -d -p 10000:10000 -v /opt/auth/auth-admin/config:/opt/auth/auth-admin --name auth-admin auth-admin:1.0.6

  • -d 表示后台运行
  • -p 表示端口映射关系
  • -v 目录挂载,本地目录:容器目录 或 -v容器目录
        将本机的/opt/auth/auth-admin/config,挂载到镜像中的/conf目录
  • --name 表示容器名称
  • auth-admin:1.0.6 表示目标镜像

或可通过docker push命令将镜像push到目标镜像仓库。在Docker Server服务器通过docker pull拉取镜像并运行。

# 5. 其他

# 5.1 数据库初始话

项目数据库初始话通过Flyway进行管理和实现。

通过下载auth-init工程并修改目标数据库连接配置后(application-auth.yml),执行ScriptLauncher主类的main方法即可实现数据库表和数据的初始话。

关键配置项如下:

spring:
  # 数据源配置
  datasource:
    url: jdbc:mysql://172.18.1.237:13001/auth?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false
    username: root
    password: root123!
1
2
3
4
5
6

# N.

# N.1 Springboot配置文件引入方式

  1. 在jar包的同一目录下建一个config文件夹,然后把配置文件放到这个文件夹下;
  2. 直接把配置文件放到jar包的同级目录;
  3. 在classpath下建一个config文件夹,然后把配置文件放进去;
  4. 在classpath下直接放配置文件。

这里的优先级也是依次降低,优先级高的覆盖优先级低的,可以注意点的是,只是对相同配置项才会产生覆盖作用,不同的话是互补作用,也就是说如果四个地方都配了的话,是会累加起来的。

  1. 如果我们需要自定义配置文件路径的话,可以通过命令行启动程序时配置 --spring.config.location=xxx.properties就可以达到目的,但是对运维就不太优化,因为在启动命令时候要配置好这个特定项目路径。那么如果通过一个配置项spring.config.location来实现配置。

# N.2 Ddocker启动SpringBoot引用外部文件

  1. 定ding外部的配置文件并将文件挂载路径定义好 例如: -v 宿主机配置文件目录:容器内配置文件目录

  2. 打包镜像时指定引用外部配置文件的路径(即挂载在容器内部的配置文件路径) 例如: java [服务配置参数] -jar [jvm参数] jar文件 --Dspring.config.location=容器内部的配置文件路径

更新时间: 1/3/2023, 4:10:36 PM