Spring Boot 2系列(十七):Docker部署Spring Boot应用

  现在的互联网应用系统在需要分布式部署时,会遇到环境配置的问题,在容器技术出来之前,需要在每台服务器系统上配置应用系统的运行环境,容易出错或环境不一致导致各种问题。

  容器技术的出现很好的解决了环境配置问题,配置一次应用运行环境,打成镜像,到处部署使用,当然还有其它的用途。

环境准备

安装 Docker

Docker 的安装不在此详述,可参考Docker系列(一):Centos 7下安装Docker,其它操作系统的安装参考 Docker 官方文档:CentOSUbuntuDebianFedora

国内可参考:Docker 入门教程,只是有个别命令的使用不是官方推荐的方式。

安装 Maven

Maven 安装参考Maven安装和使用(Linux, Windows)

安装 Git

Git 安装参考Getting Started - Installing Git

部署 jar 包设置

  1. 有一个包含 jdk1.8 的基础镜像。
  2. Spring Boot项目添加 docker 插件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <artifactId>myapp</artifactId>
    <packaging>jar</packaging>
    <properties>
    <docker.image.prefix>local_repos</docker.image.prefix>
    </properties>

    <!-- Docker maven plugin -->
    <plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>1.1.1</version>
    <configuration>
    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
    <dockerDirectory>src/main/docker</dockerDirectory>
    <resources>
    <resource>
    <targetPath>/</targetPath>
    <directory>${project.build.directory}</directory>
    <include>${project.build.finalName}.${project.packaging}</include>
    </resource>
    </resources>
    </configuration>
    </plugin>
    说明: ${docker.image.prefix}:镜像前辍,一般用于标识镜像库名称。
  3. 在项目src/main创建docker目录,在docker目录里创建 Dockerfile文件。
  4. 编辑 Dockerfile 文件。更多参考Docker系列(四):Dockerfile 配置详解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#指定基础镜像
FROM repos_local/centos-jdk1.8:1.0

#作者
MAINTAINER gxing

#数据卷
VOLUME /tmp

#添加当前目录文件到镜像的工作目录
ADD myapp.jar myapp.jar

#运行容器后执行
ENTRYPOINT ["java","-jar","myapp.jar","--spring.profiles.active=prod","&"]

部署 war 包设置##

部署war包的基础镜像必须包含JDKTomcat

  1. 修改pom.xml文件。
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
36
37
38
39
40
<artifactId>myapp</artifactId>
<packaging>war</packaging>
<properties>
<docker.image.prefix>local_repos</docker.image.prefix>
</properties>

<!-- 打war包, 覆盖掉内嵌的Tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

<!-- 打war包,排除web.xml,使用java config -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>

<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.1</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.${project.packaging}</include>
</resource>
</resources>
</configuration>
</plugin>
  1. 添加 Dockerfile 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
FROM centos-jdk1.8-tomcat8:1.0

MAINTAINER gxing

VOLUME /tmp

#---------jar-----------------
#ADD myapp.war myapp.jar

#---------war-----------------
ADD myapp.war /usr/local/tomcat/webapps/ROOT.war
WORKDIR /usr/local/tomcat/bin
CMD ["catalina.sh", "run"]

打Docker应用镜像

  1. 将修改后的项目推到 Git仓库。

  2. 在 Linux 使用 Git 命令拉取项目工程代码。

    git pull https://xxxxx/xxx/xxx.git

  3. 进入到项目工程根目录,执行 Maven 打包,出现BUILD SUCCESS表示成功。

    mvn package -DskipTests docker:build

  4. 查看镜像,会有显打包成功的镜像。

    docker images

  5. 创建容器并启动。

    docker run -d -p 8080:8080 –name app local_repos/myapp

  6. 访问容器:http://xxxxxxx:8080/xxx
    访问成功表示正常。

  7. 映射项目日志到外部(-v:共享文件)

    docker run -d -p 8080:8080 -v /data/qyd-server/logs:/usr/local/tomcat/bin/logs –name myapp local_repos/myapp
    基础镜像里配置了镜像里的工作目录是/work,在打Spring Boot 应用镜像时,指定了添加应用到根目录(工作目录),项目使用 Log4j2 配置了日志输出到文件,运行容器时添加-v参来将容器中的应用日志共享到本地主要的目录中。

Spring Boot 2系列(十七):Docker部署Spring Boot应用

http://blog.gxitsky.com/2018/06/20/SpringBoot-17-docker-deploy/

作者

光星

发布于

2018-06-20

更新于

2022-06-17

许可协议

评论