需求:有个SpringBoot项目,需要部署,依赖了mysql,redis,如果做到一键部署,相关的依赖能够自动安装(安装时,能以挂载的方式进行安装)
- 以下是我实践后的精炼步骤
- 服务器安装docker与docker-compose,可以参考: //www.greatytc.com/p/0e3e8ea35e69
- 准备SpringBoot项目jar包,Dockerfile,docker-compose.yml 3个文件,放在服务器上的任意目录,建议放在 /tmp/目录下,例如 /tmp/len
2-1 jar包,Maven正常打的jar包,该包为单纯可执行的jar包,与docker无关
2-2 Dockerfile配置说明
# 基础镜像使用Java
FROM openjdk:8
# 作者
MAINTAINER len
COPY springBoot项目.jar springBoot项目.jar
ENTRYPOINT ["java","-jar","springBoot项目.jar"]
# 指定容器需要映射到主机的端口
EXPOSE 8080
2-3 docker-comopse 配置说明
# 指定我们docker-compose的版本
version: "3"
# 指定网络
networks:
tip-network:
#网络配置方式
driver: bridge
# 设置我们的服务
services:
# 配置nignx服务
nginx:
# nginx最新镜像
image: nginx:latest
# 定义容器名称
container_name: nginx-compose
# 配置nginx环境
environment:
- TZ=Asia/Shanghai
# 配置端口
ports:
- "80:80"
# 配置挂载的文件夹
volumes:
# 挂载文件,即docker命令的 -v
- /home/len/conf/nginx/conf.d/:/etc/nginx/conf.d/
- /home/len/conf/nginx/nginx.conf:/etc/nginx/nginx.conf
- /docker-cps/nginx/logs:/var/log/nginx
# 自动重启
restart: always
networks:
- test-network
# 配置mysql服务
mysql:
image: mysql:8.0.20
container_name: mysql-compose
ports:
- "3306:3306"
# 配置环境,主要是配置我们的mysql的登陆密码,这些是必填,不填会报错
environment:
TZ: Asia/Shanghai
MYSQL_DATABASE: len-test
MYSQL_ROOT_PASSWORD: 123456
# '%' 表示 root账号对所有网络都能登录使用,很关键
MYSQL_ROOT_HOST: '%'
# 配置挂载的文件夹
volumes:
- /docker-cps/mysql/conf:/etc/mysql
# 该配置必加,解决 [ERROR] [MY-010095] 问题
- /docker-cps/mysql/data:/var/lib/mysql-files/
- /docker-cps/mysql/data:/var/lib/mysql
- /docker-cps/mysql/logs:/var/log/mysql
# 初始化数据库,mysql创建好后,可以通过该方式创建库,创建表,无需手动
- /home/len/init/init_database.sql:/docker-entrypoint-initdb.d/init_database.sql
# 设置命令
command:
[
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_bin',
# 这行代码解决无法访问的问题
'--default-authentication-plugin=mysql_native_password'
]
# 自动重启
restart: always
# 加入指定网络,容器间必须要处于同一个网络才能通过容器名称进行调用
networks:
- test-network
# 配置redis服务
redis:
image: redis:latest
container_name: redis-compose
environment:
- TZ=Asia/Shanghai
ports:
- "6379:6379"
# 同上,挂载文件夹
volumes:
# 配置文件(需要在宿主机路径上传redis.conf文件)
- /docker-cps/redis/redis.conf:/etc/redis/redis.conf
- /docker-cps/redis/data:/data
- /docker-cps/redis/logs:/var/log/redis
# 设置命令,通过这儿设置redis密码
command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
restart: always
networks:
- test-network
# 配置springboot服务
springboot:
# 生成镜像,用.它会自动去当前目录下面去找一个Dockerfile的文件,然后根据里面的配置去生成一个镜像
build: .
image: len-project:1.0.0
container_name: len-project
ports:
- "8080:8080"
working_dir: /
# 将SpringBoot的项目配置文件外置,可以项目外进行修改
command:
- --spring.config.location=/home/biz/conf/application.yml
volumes:
- /docker-cps/len/shsd/:/home/shds
- /home/len/conf:/home/len/conf
# springboot依赖的服务,依赖的服务会先安装
depends_on:
- nginx
- mysql
- redis
restart: always
networks:
- tip-network
- 创建挂载文件,将需要提前准备的初始化文件,手动修改的配置文件等文件,提前准备好。例如:nginx的配置文件,项目的前端包,SpringBoot的外置配置文件,Mysql的初始化语句等。
- 进入步骤2的 /tmp/len 目录,执行docker-compose命令
# 安装启动,1 先pull依赖镜像 2 安装
docker-compose up -d
# 卸载移除
docker-compose down -v
- 遇到的问题及解决步骤
- 配置有修改,执行down后,再执行up,会发现配置没有变化,是有缓存吗?
实际上是创建的挂载文件未移除,重新up的时候,读取是down之后的路径文件,看起来是缓存了,建议down之后,移除挂载的所有目录。
- Dockerfile文件有修改,重新执行up之后,会发现Dockerfile文件未生效,1中删除了,还有缓存吗?
Dockerfile文件的作用,是生成镜像,down只是处理容器,未处理镜像,要让修改的Dockerfile生效,则需要删除已生成的镜像,通过 docker images 查看,或者再执行 docker-compose up 的时候,加上 --build参数
- 安装mysql的时候,报错 mysqld: Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)
2024-05-23T08:40:04.416953Z 0 [ERROR] [MY-010095] [Server] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files
2024-05-23T08:40:04.416964Z 0 [ERROR] [MY-010119] [Server] Aborting
在mysql的compose配置文件中,增加该文件夹的挂载即可,例如: - /docker-cps/mysql/data:/var/lib/mysql-files/
- mysql安装之后,一般都需要设置密码,需要创建库,需要初始化项目的表,以及 mysql8 配置的root密码不生效的问题, 如何解决呢?
mysql安装后,有个/docker-entrypoint-initdb.d目录,可以放sql文件,docker安装成功后,会执行该目录下的文件,进行数据库的初始化,compose文件可以这么配置: - /home/len/init/init_database.sql:/docker-entrypoint-initdb.d/init_database.sql , 既然可以执行SQL,那么以上的问题都可以解决,在SQL文件中,加上以下语句即可。
# 修改密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 密码';
# 创建库
CREATE DATABASE len_test CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
# 使用库
use len_test;
# 创建表等语句
...
- docker-compose 未设置网络,默认创建的网络,导致ssh连接宿主机网络失效
原因还未知,指定创建网络即可解决