Docker部署多容器Springboot问卷系统项目及相关服务的完整步骤

本文将介绍如何使用Docker部署多容器Springboot问卷系统项目及相关服务,并使其容器之间正确通信。一共涉及三个容器:问卷系统项目容器 + MySQL数据库容器 + Redis缓存容器。以下是详细的步骤:

1. 创建并配置问卷系统项目容器

首先,我们需要获取问卷系统项目的镜像,我们可以用Springboot自带的打包为docker镜像文件的工具spring-boot:build-image,如下图所示,可以一键生成镜像文件。

%E6%88%AA%E5%B1%8F2023-06-21%2021.05.58.png

然后,我们需要创建问卷系统项目的Docker容器,并配置项目所需的配置文件。在本机的某个目录(路径不含中文)上创建文件application.yml,并填写以下配置信息:

server:
  port: 8085

spring:
  datasource:
    url: jdbc:mysql://172.17.0.5:3306/training524?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
    username: root
    password: 20011216
    driver-class-name: com.mysql.cj.jdbc.Driver
  redis:
    port: 6379
    host: 172.17.0.3

# 公共配置 与profiles选择无关
mybatis:
  type-aliases-package: com.example.training524.dao.entity
  mapper-locations: classpath:mapper/*.xml
  # 开启MyBatis的二级缓存
  configuration:
    cache-enabled: true
    map-underscore-to-camel-case: true

接下来,在同目录下创建一个文件mybatis-config.xml,并填入以下内容:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 配置 -->
    <typeAliases>
        <package name="com.example.training524"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://172.17.0.5:3306/training524?serverTimezone=Asia/Shanghai&characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="20011216"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserEntityMapper.xml"/>
        <mapper resource="mapper/ProjectEntityMapper.xml"/>
        <mapper resource="mapper/QuestionnaireEntityMapper.xml"/>
        <mapper resource="mapper/AnswerEntityMapper.xml"/>
    </mappers>
</configuration>

注意根据实际部署环境修改标记删除线的部分。

最后,在同目录下创建一个文件my-config.js,并填入以下内容:

const API_BASE_URL = 'http://localhost:8086'

API_BASE_URL设置为实际生产环境访问接口API的根URL。

2. 部署MySQL服务

使用Docker部署MySQL服务(我用的是MySQL 8.0及以上版本),并将数据库文件导入。首先,将导入数据库的SQL文件放置在本机的某个目录,并命名为training524.sql

运行以下命令启动MySQL容器:

docker run -it -p 3306:3306 --network=bridge -e MYSQL_ROOT_PASSWORD=20011216 -v [本机路径]:/opt --name MysqlForTraining524 mysql:latest mysqld --lower_case_table_names=1

docker run -it -p 3307:3306 --network=bridge -e MYSQL_ROOT_PASSWORD=20011216 -v /opt/mysql:/opt --name MysqlForTraining524 mysql:latest mysqld --lower_case_table_names=1

其中,[本机路径]应替换为实际的文件路径,例如/Users/baizihan/docker/mysql

然后进入MySQL的容器终端:

# 可用 docker ps 查看所有容器的信息
docker exec -it [容器ID] bash

之后在容器内的文件/etc/my.cnf的 [mysqld]下添加这三行

lower_case_table_names=1
collation-server=utf8_general_ci
character-set-server=utf8

在MySQL容器的终端中输入以下命令登录到MySQL命令行工具:

mysql -uroot -p20011216

在MySQL命令行工具中执行以下命令导入数据库:

create database training524;
use training524;
source /opt/training524.sql;

3. 部署Redis服务

配置文件和data路径需要挂载一下,方法同上。确保redis.conf文件与容器中的/etc/redis/redis.conf文件对应上。

配置文件可在我的云盘下载

使用Docker部署Redis服务。运行以下命令启动Redis容器:

docker run -p 6379:6379 --name redis1 --network=bridge --privileged=true \
-v [本机路径]/redis.conf:/etc/redis/redis.conf \
-v [本机路径]/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

其中,[本机路径]应替换为实际的文件路径,例如/Users/baizihan/docker/redis

4. 启动问卷系统项目容器

最后,启动问卷系统项目的Docker容器。

部署问卷系统项目docker容器的命令(端口和路径根据需要自行更改,镜像名自行更改确保一致)

docker run -d -p 8085:8085 training524:0.0.1-SNAPSHOT -v [本机路径]:/workspace/BOOT-INF/classes/application.yml -v [本机路径]:/workspace/BOOT-INF/classes/mybatis-config.xml -v [本机路径]:/workspace/BOOT-INF/classes/static/my-config.js --network=bridge --name Training524

docker run -d --add-host host.docker.internal:host-gateway -v /opt/training524/application.yml:/workspace/BOOT-INF/classes/application.yml -v /opt/training524/mybatis-config.xml:/workspace/BOOT-INF/classes/mybatis-config.xml -v /opt/training524/my-config.js:/workspace/BOOT-INF/classes/static/my-config.js -p 8085:8085 qiuyedx/training524:latest --network=bridge --name Training524

注意这里要用-d守护进程。另外,将[本机路径]替换为实际的文件路径,例如/Users/baizihan/docker/training524

现在,问卷系统项目已经在Docker容器中成功部署。

吐槽

Mysql 8真的搞人心态。。在不同系统下的表现不一致,在linux下对大小写敏感,而且不能后期设置,只有安装Mysql的时候加一句配置参数才可以设置不敏感。。什么nt设计(气)

docker在linux下也有不同的表现,比如在bridge网络模式下,想通过host.docker.internal访问宿主机必须要在run容器的时候加一句参数--add-host host.docker.internal:host-gateway,而Windows和MacOS不需要。。。

除此之外,问题还都好解决?没有太搞人心态。整体来说还是很有收获的~

其他注意事项

  • 如果需要在容器之间进行通信,可以使用容器名称和自定义网络进行连接。
  • 如果容器内部访问宿主机,可以使用host.docker.internal作为宿主机的地址。(Linux 上的 Docker 引擎用户需要通过 docker run 的 --add-host 标志启用主机的默认名称 host.docker.internal。使用此标志启动容器以公开主机字符串,如docker run -d --add-host host.docker.internal:host-gateway my-container:latest
  • 在桥接网络模式下,可以使用容器名称作为主机名进行容器间通信。

相关资料


A Student on the way to full stack of Web3.