Docker部署多容器Springboot问卷系统项目及相关服务的完整步骤
本文将介绍如何使用Docker部署多容器Springboot问卷系统项目及相关服务,并使其容器之间正确通信。一共涉及三个容器:问卷系统项目容器 + MySQL数据库容器 + Redis缓存容器。以下是详细的步骤:
1. 创建并配置问卷系统项目容器
首先,我们需要获取问卷系统项目的镜像,我们可以用Springboot自带的打包为docker镜像文件的工具spring-boot:build-image
,如下图所示,可以一键生成镜像文件。
然后,我们需要创建问卷系统项目的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
) - 在桥接网络模式下,可以使用容器名称作为主机名进行容器间通信。
相关资料
- Docker网络network详解
- 【docker知识】从容器中如何访问到宿主机
- 史上最详细Docker安装Redis (含每一步的图解)实战
- 关于MySQL 8.0的在不同操作系统下区分大小写的表现不一致的坑
Comments NOTHING