Docker+SpringBoot+MSSQL

开发环境

Windows下IDEA开发
Linux下部署项目

知识技术点

SpringBoot
Docker
Docker Compose
Thymeleaf
BootStrap

SpringBoot案例

首先我们先准备一个 Spring Boot 使用 Mssql 的小场景,我们做这样一个示例,使用 Spring Boot 做一个 Web 应用,提供一个简单增删改查功能,每次请求时将统计数据存入 Mssql 并展示到页面中。

配置信息

依赖包

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>webjars-locator-core</artifactId>
        </dependency>
    </dependencies>

主要添加了 Spring Boot Web 支持,使用 Jpa 操作数据库、添加 Mssql 驱动包、webjars包等

配置文件

application.yml

spring:
  profiles:
    active: dev
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

application-dev.yml

spring:
  datasource:
    url: jdbc:sqlserver://localhost:1433;databaseName=test_docker_mssql
    username: sa
    password: 111111

application-docker.yml

spring:
  datasource:
    url: jdbc:sqlserver://mssql:1433;databaseName=test_docker_mssql
    username: sa
    password: Guang@8620

--msqsql 是后面配置文件docker-compose.yml定义

配置了数据库的链接信息,以及 Jpa 更新表模式、方言和是否显示Sql

Docker配置

在SpringBoot项目根目录下创建Dockerfile文件

# 指定基础镜像(必需且为第一条指令,scratch是空白镜像)
FROM 192.168.3.16:5000/openjdk:latest

# MAINTAINER已经过期,具体参考:https://docs.docker.com/engine/reference/builder/#label
LABEL author-name="army.qin"

# 为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,
# 这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
VOLUME /tmp

# 在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,
# 所有文件复制使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD 指令
ADD target/docker-mssql.jar app.jar

修改SpringBoot项目pom.xml打包文件

<properties>
        <java.version>1.8</java.version>
        <docker.repostory>192.168.3.16</docker.repostory>
</properties>

<build>
        <!-- 最终Maven本地打包出来的jar包名称 -->
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <!-- GitHub: https://github.com/spotify/docker-maven-plugin -->
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.0</version>
                <executions>
                    <execution>
                        <id>build-image</id>
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!--<serverId>server-registry</serverId>-->
                    <registryUrl>http://${docker.repostory}:5000</registryUrl>
                    <pushImage>true</pushImage>
                    <!-- 远程镜像名称 -->
                    <imageName>${docker.repostory}:5000/${project.artifactId}:${project.version}</imageName>
                    <forceTags>true</forceTags>
                    <imageTags>
                        <imageTag>${project.version}</imageTag>
                        <imageTag>latest</imageTag>
                    </imageTags>
                    <dockerHost>http://${docker.repostory}:22375</dockerHost>
                    <dockerDirectory>${project.basedir}</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/target</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

docker-compose.yml

version: '3'
services:
  mssql:
    image: 192.168.3.16:5000/mssql:latest
    hostname: mssql
    container_name: v-mssql
    volumes:
     - ./data:/var/opt/mssql
    environment:
     - ACCEPT_EULA=Y
     - SA_PASSWORD=Guang@8620
    restart: always
    ports:
     - "1433:1433"

  dockerMssql:
    image: 192.168.3.16:5000/docker-mssql:latest
    hostname: docker-mssql
    container_name: v-docker-mssql
    volumes:
     - ./logs:/logs
    restart: always
    ports:
     - "8821:8080"
    links:
     - mssql:mssql
    depends_on:
     - mssql

    command: java -jar /app.jar --server.port=8080 --spring.profiles.active=docker

这里大慨说一下注意的属性:

services下的mssql定义在上面application-docker.yml文件连接容器内数据库时使用到

volumes在mssql定义的左边./data是相对当前docker-compose.yml文件下的data目录,属于主机的,右边/var/opt/mssql是运行mssql数据库后,在容器内的路径,这里做了一下挂载,方便在容器外好管理数据库数据

volumes在dockermssql定义的左边./logs也是相对当前docker-compose.yml文件下的logs目录,属于主机,右边/logs是运行SpringBoot项目后,在容器根目录存放log的目录,这里也是做了一下挂载,方便在容器外查看日志

Linux部署项目

上传docker-compose.yml文件到Linux服务器,并在当前文件目录下新建data目录和logs目录

后台启动项目

docker-compose up -d

停止项目

docker-compose stop

卸载项目

docker-compose down

 

参考源码

滚动至顶部