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>
  2. 添加 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应用镜像

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

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

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

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

    mvn package -DskipTests docker:build

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

    docker images

  7. 创建容器并启动。

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

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

  9. 映射项目日志到外部(-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

许可协议

评论