详细介绍:从零到一:Docker Compose 轻松部署微服务实战!

news/2025/10/3 16:02:18/文章来源:https://www.cnblogs.com/tlnshuju/p/19124688

详细介绍:从零到一:Docker Compose 轻松部署微服务实战!

2025-10-03 15:59  tlnshuju  阅读(0)  评论(0)    收藏  举报

从零到一:Docker Compose 轻松部署微服务实战

今天实践一下使用Docker Compose部署一个微服务项目。

项目包括docker compose部署的代码都放在了我的github上:https://github.com/cra358/demo

首先简单写一个微服务项目,主要技术栈:Spring Cloud Alibaba、redis、Mysql、Gateway、SaToken

主要就是用户登陆积分记录功能。用户每登陆系统一次,用户登陆积分+1。

服务划分

  • gatway主要实现登陆校验。
  • user实现用户注册、退出、积分查询增长功能。

在这里插入图片描述

容器划分

  • 环境容器:nacos、mysql、redis

  • 服务容器:gateway、user

服务打包package:

先双击clean,清理target目录文件,再双击package文件,点击右上角的>中的带斜线的圈可以跳过test。

在这里插入图片描述

在target目录中可以找到对应的jar包。确定没有问题后就可以开始部署了。

安装Docker(略)

Docker 使用的版本是Docker version 27.5.0,安装完成后在pull一下mysql、redis和nacos的镜像,方便后面创建环境容器。本次使用的是mysql8.0、redis7.2.3、nacos v2.2.0版本。

在这里插入图片描述

Docker Compose安装

在选择安装版本时,需要注意Docker Compose 版本和Docker版本对应。我使用的Docker Compose版本是Docker Compose version v2.30.0

在这里插入图片描述

sudo cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

docker-compose --version

在这里插入图片描述

安装成功后,正式准备部署。在项目目录的docker目录中:

在这里插入图片描述

docker下的demo目录存放两个服务模块的我们之前打包生成好的jar包和Dockerfile文件:

在这里插入图片描述

现在,我们需要为每个微服务编写 Dockerfile内容,用于构建 Docker 镜像。Dockerfile 定义了镜像的构建过程,包括基础镜像、依赖安装、代码复制、启动命令等。

为微服务编写Dockerfile文件
  • user
# 基础镜像
FROM openjdk:17
# 挂载目录,就是容器中的目录
VOLUME /home/user
# 创建目录,也是容器中的目录
RUN mkdir -p /home/user
# 指定路径
WORKDIR /home/user
# 复制jar文件到容器指定路径,就是把宿主机中的./jar/user.jar文件复制到容器/home/user/user.jar中
COPY ./jar/user.jar /home/user/user.jar
# 启动用户服务
ENTRYPOINT ["java","-jar","user.jar"]
  • gateway
# 基础镜像
FROM openjdk:17
# 挂载目录
VOLUME /home/gateway
# 创建目录
RUN mkdir -p /home/gateway
# 指定路径
WORKDIR /home/gateway
# 复制jar文件到路径
COPY ./jar/gateway.jar /home/gateway/gateway.jar
# 启动用户服务
ENTRYPOINT ["java","-jar","gateway.jar"]

完成上述步骤后,准备环境容器的Docker文件和一些配置:

  • mysql容器准备:

    在这里插入图片描述

在db目录下存放项目所需的初始数据库表。同时由于nacos配置依赖于mysql存放相关数据,也在这里存放一个nacos_config.sql文件,文件内容直接网上照抄即可。

db.sql文件如下:

CREATE DATABASE IF NOT EXISTS `demo_user` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `demo_user`;
-- 删除已存在的表(谨慎使用)
DROP TABLE IF EXISTS `user`;
-- 创建 user 表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID,主键',
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(255) NOT NULL COMMENT '密码(存储加密后的密码)',
`score` int(11) NOT NULL DEFAULT '0' COMMENT '用户积分',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`) COMMENT '用户名唯一索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

编写mysql容器的Dockerfile:

# 基础镜像,就是docker images命令下我们之前pull的mysql镜像,据此创建mysql容器
FROM mysql:8.0
# 执行sql脚本
# `/docker-entrypoint-initdb.d/`是MySQL官方镜像中的一个特殊目录,用于存放初始化数据库的脚本文件。
# 把刚刚的两个sql文件存放到mysql容器中
ADD ./db/*.sql /docker-entrypoint-initdb.d/
  • redis容器准备:

在这里插入图片描述

在docker/redis/conf目录下写一个redis配置文件:redis.conf,这里只写了一个密码:

requirepass 1234

同样,编写redis容器的Dockerfile:

# 基础镜像
FROM redis:7.2.3
# 挂载目录
VOLUME /home/demo/redis
# 创建目录
RUN mkdir -p /home/demo/redis
# 指定路径
WORKDIR /home/demo/redis
# 复制刚刚的redis.conf文件到容器指定路径
COPY ./conf/redis.conf /home/demo/redis/redis.conf
  • nacos容器准备:

在这里插入图片描述

在docker/nacos/conf中编写nacos配置文件:application.properties

spring.datasource.platform=mysql
spring.sql.init.platform=mysql
db.num=1
# 这里的nacos_config就是nacos在mysql容器中使用到的数据库,和前面的nacos_config.sql中创建出来的数据库要一致
# 下面的配置不一样有可能会导致意想不到的错误
db.url.0=jdbc:mysql://demo-mysql:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
# 制定用户、密码
db.user.0=root
db.password.0=20041111
# 这里后面的直接复制就可以了
nacos.naming.empty-service.auto-clean=true
nacos.naming.empty-service.clean.initial-delay-ms=50000
nacos.naming.empty-service.clean.period-time-ms=30000
management.endpoints.web.exposure.include=*
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.basedir=/home/demo/nacos/tomcat/logs
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
nacos.core.auth.system.type=nacos
nacos.core.auth.enabled=false
nacos.core.auth.default.token.expire.seconds=18000
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
nacos.core.auth.caching.enabled=true
nacos.core.auth.enable.userAgentAuthWhite=false
nacos.core.auth.server.identity.key=serverIdentity
nacos.core.auth.server.identity.value=security
nacos.istio.mcp.server.enabled=false

编写nacos的Dockerfile文件:

# 基础镜像
FROM nacos/nacos-server:v2.2.0
# 复制刚刚的application.properties文件到nacos容器的制定路径
COPY ./conf/application.properties /home/nacos/conf/application.properties

到此,我们就准备好了环境容器和服务容器的准备工作。

编写 DockerCompose.yml 文件
version: '3'
services:
demo-nacos:
# 容器名
container_name: demo-nacos
image: nacos/nacos-server:v2.2.0
build:
context: ./nacos
environment:
- MODE=standalone
# 使用 mysql 作为数据库
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=demo-mysql
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_DB_NAME=nacos_config
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=20041111
# 设置连接 mysql 的连接参数
- MYSQL_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrievalyaml=true"
volumes:
- ./nacos/logs/:/home/nacos/logs
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties
# 要暴露三个端口,至于为什么,可以网上查下看看
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
privileged: true
networks:
- demo-network
# nacos依赖于mysql先启动成功
depends_on:
demo-mysql:
condition: service_healthy
#      - demo-mysql
demo-mysql:
# 容器名
container_name: demo-mysql
# 镜像
image: mysql:8.0
build:
context: ./mysql
ports:
- "3306:3306"
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/logs:/logs
- ./mysql/data:/var/lib/mysql
- ./mysql/db:/docker-entrypoint-initdb.d/
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00',
'--lower-case-table-names=1'
]
privileged: true
networks:
- demo-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 5
environment:
MYSQL_ROOT_PASSWORD: '20041111'
demo-redis:
container_name: demo-redis
image: redis:7.2.3
build:
context: ./redis
dockerfile: Dockerfile
ports:
- "6379:6379"
volumes:
- ./redis/conf/redis.conf:/home/demo/redis/redis.conf
- ./redis/data:/data
command: redis-server /home/demo/redis/redis.conf
networks:
- demo-network
# 网关服务容器
demo-gateway:
container_name: demo-gateway
build:
context: ./demo/gateway
dockerfile: Dockerfile
ports:
- "8000:8000"
depends_on:
- demo-redis
- demo-nacos
networks:
- demo-network
# 用户服务容器
demo-user:
container_name: demo-user
build:
context: ./demo/user
dockerfile: Dockerfile
# 端口映射
ports:
- "8001:8001"
depends_on:
- demo-redis
- demo-mysql
- demo-nacos
networks:
- demo-network
# 确保都在同一个网络下
networks:
demo-network:
driver: bridge
sh脚本

上述工作完成后,我们写一个sh脚本,方便我们清理复制jar包、运行docker-compose.yml文件来启动容器。

在这里插入图片描述

  • cleanjar.sh
#!/bin/bash
# 删除jar文件
echo "开始清理jar文件"
rm -f ../demo/gateway/jar/gateway.jar
rm -f ../demo/user/jar/user.jar
echo "清理完成"
  • copy.sh
#!/bin/bash
# 创建目标目录
mkdir -p ../mysql/db
mkdir -p ../demo/gateway/jar
mkdir -p ../demo/user/jar
# 复制项目db目录下的sql文件到docker/mysql/db目录中
echo "begin copy sql "
cp ../../sql/db.sql ../mysql/db
echo "end copy sql "
# 复制target目录下的jar文件到docker目录下的demo的jar目录中
echo "begin copy jar "
cp ../../gateway/target/com.chenxw.demo.gateway-1.0-SNAPSHOT.jar ../demo/gateway/jar/gateway.jar
cp ../../user/target/com.chenxw.demo.user-1.0-SNAPSHOT.jar ../demo/user/jar/user.jar
echo "end copy jar "
  • deploy.sh:Docker Compose运行脚本
#!/bin/sh
# 使用说明,用来提示输入参数
usage(){
echo "Usage: sh 执行脚本.sh [base|services|stop|rm]"
exit 1
}
# 启动基础环境(必须)
base(){
docker-compose up -d demo-mysql demo-redis demo-nacos
}
# 启动程序模块(必须)
services(){
docker-compose up -d demo-gateway demo-user
}
# 关闭所有环境/模块
stop(){
docker-compose stop
}
# 删除所有环境/模块
rm(){
docker-compose rm
}
# 根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"base")
base
;;
"services")
services
;;
"stop")
stop
;;
"rm")
rm
;;
*)
usage
;;
esac

到此,所有准备工作都完成了。但是我们要注意,在项目的apppication.yml文件中,我们要把127.0.0.1或者localhost改成指定容器名,每个容器都有自己的ip。比如这里要连接mysql就改成demo-mysql,要连接redis就改成demo-redis,要配置nacos地址就改成demo-nacos

比如gateway服务中的apppication.yml文件:

server:
port: 8000 # 指定启动端口
spring:
application:
name: demo-gateway # 容器名称,就是我们在docker-compose.yml中指定的container_name
cloud:
config:
enabled: false
nacos:
discovery:
enabled: true # 启用服务发现
group: DEFAULT_GROUP # 所属组
namespace: demo # 命名空间
server-addr: demo-nacos:8848 # 指定 Nacos 配置中心的服务器地址
username: nacos
password: nacos
gateway:
routes:
- id: user
uri: lb://demo-user
predicates:
- Path=/user/**
filters:
- StripPrefix=0
data:
redis:
database: 1 # Redis 数据库索引
host: demo-redis # Redis 服务器地址
port: 6379 # Redis 服务器连接端口
password: 1234 # Redis 服务器连接密码(默认为空)
timeout: 5s # 读超时时间
connect-timeout: 5s # 链接超时时间
lettuce:
pool:
max-active: 200 # 连接池最大连接数
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
min-idle: 0 # 连接池中的最小空闲连接
max-idle: 10 # 连接池中的最大空闲连接
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token:
# token 名称(同时也是 cookie 名称)
token-name: Authorization
# token前缀
token-prefix: Bearer
# token 有效期(单位:秒) 默认30天,-1 代表永久有效
timeout: 2592000
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
active-timeout: -1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
is-share: true
# token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
token-style: random-32
# 是否输出操作日志
is-log: true
微服务,启动!

运行cleanjar.sh、copy.sh复制sql、jar包。

运行sh deploy.sh base,启动环境容器!

在这里插入图片描述

在IDEA服务中也可以看到环境容器启动成功:

在这里插入图片描述

运行sh deploy.sh services,启动服务容器!

在这里插入图片描述

服务容器也启动成功:

在这里插入图片描述

在nacos控制台查看demo-gateway和demo-user服务是否注册成功:

在这里插入图片描述

两个应用都注册到nacos中了,来看下各个容器的ip:

在这里插入图片描述

从网关127.19.0.5访问:试下注册、登陆、积分查询、退出接口都没有问题。

  • 注册:

在这里插入图片描述

  • 登陆:

在这里插入图片描述

  • 查询:

在这里插入图片描述

  • 退出:

在这里插入图片描述

至此,docker compose部署微服务就完成了。

其实这个过程中还是会遇到各种奇奇怪怪的错误,可以用cursor帮忙理解整个报错原因,一步步梳理,效率嘎嘎高!

参考资料:https://github.com/timeless157/timeless-order-pay-parent.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软著申请全流程材料模板,2025年最新模板汇总! - 实践

软著申请全流程材料模板,2025年最新模板汇总! - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

四川话ASR-微调-语音识别-Paraformer-Large - 教程

四川话ASR-微调-语音识别-Paraformer-Large - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

茂名专业网站建设公司亚马逊网站建设分析

推荐阅读 给软件行业带来了春天——揭秘Spring究竟是何方神圣(一) 给软件行业带来了春天——揭秘Spring究竟是何方神圣(二) 文章目录 推荐阅读关联查询子查询 关联查询 关联查询 从多张表中查询对应记录的信息,关联查…

手把手教你使用 Docker 部署 Nginx 教程

本文详细介绍了基于轩辕镜像的 Nginx 镜像拉取方法(含登录验证、免登录(推荐)、官方直连等方式),以及三种适合不同场景的 Docker 部署方案(快速部署用于测试、目录挂载用于实际项目、docker-compose 用于企业级场…

建站公司服务网页游戏开服表大全

TJpgDec—轻量级JPEG解码器 本文由乌合之众lym瞎编,欢迎转载blog.cnblogs.net/oloroso 下文中解码一词皆由decompression/decompress翻译而来。 TJpgDec是一个为小型嵌入式系统高度优化的创建JPEG图像的解码模块。它工作时占用的内存非常低,以便它可以集…

网站建设营销模板网站扁平化设计理念

目录 结论先说 实验 结论 实验机器的cpu配置 用EDGE拉九路​编辑 google拉五路就拉不出来了 资源使用情况 edge报错​编辑 结论先说 实验 用chrome先拉九路,再想用edge拉九路,发现拉五路后怎么也拉不出; 后面发现cpu爆满;切…

自己搭建一个网站需要多少钱?手机网站搭建教程

来源:AI前线作者:Ben Dickson译者:盖策划:凌敏本文来自 BDTechTalks 网站的“AI 研究论文评论”专栏。该专栏提供人工智能最新发现的系列解读文章。尽管人工智能研究人员正力图建立能在围棋、星际争霸到 Dota 等复杂游戏中击败人类…

CF2129 CF1951 VP 记录

非常好 hfu 开发的神秘打一场比赛改两场题,使我的国庆假期旋转. CF2129 Div1 B 逆序对考虑在较小的数处统计贡献,枚举序列里面每个数,一并枚举逆序对的另一个数. \(p_i\) 有贡献当且 \(i>j\),\(2n-p_i\) 有贡献…

PWN-BUUCTF-test_your_nc

BUUCTF-test_your_nc的WPpwn 题目题解 使用nc连接题目地址,输入ls查看目录。使用cat命令获取flag文件内容得到flag。总结 题目考察nc的使用方法本文来自博客园,作者:ffff5,转载请注明原文链接:https://www.cnblog…

做网站设计需要具备哪些重庆市工程建设服务中心

中国科学院自动化研究所智能交互团队在环境鲁棒性、轻量级建模、自适应能力以及端到端处理等几个方面进行持续攻关,在语音识别方面获新进展,相关成果将在全球语音学术会议INTERSPEECH2019发表。现有端到端语音识别系统难以有效利用外部文本语料中的语言学…

电商网站建设目标分析的方法淘宝客网站建设方案书

机器学习是一项经验技能,经验越多越好。在项目建立的过程中,实 践是掌握机器学习的最佳手段。在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的 预测模型项目模板 不能只通过阅读来掌握…

Kafka Windows 安装启动与 YAML 配置全解析 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

昆明专业建站装修设计公司服务

参考链接 FFmpeg源代码简单分析:avcodec_close()_雷霄骅的博客-CSDN博客_avcodec_close avcodec_close() 该函数用于关闭编码器avcodec_close()函数的声明位于libavcodec\avcodec.h,如下所示。 ​该函数只有一个参数,就是需要关闭的编码器的…

使用rem布局的网站网站开发5人小组分工

. 单论品牌(主要以登山鞋及徙步鞋为主): 高级品牌:SCARPA、ASOLO、MONTRAIL、ZAMBERLAN、vasque、Lowa、La Sportiva 价格都较高,单价都在千元以上,品质一流,做工精细。 中档品牌:Tr…

详细介绍:计算机视觉:OpenCV+Dlib 人脸检测

详细介绍:计算机视觉:OpenCV+Dlib 人脸检测pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

怀化 网站建设国内网页加速器

文章目录 企业无线局域网部署最佳实践引言1. 无线网规划和设计a. 选择合适的频宽b. 网络规划工具c. 考虑物理环境d. 用户密度和需求e. 未来扩展f. 安全性和策略g. 测试和验证2. 无线局域网容量2.1 用户和设备预测2.2 应用流量分析2.3 带宽管理2.4 无线技术选择2.5 网络健康检查…

python 老生常谈的找2个excel相同列的行,把其中一个excel行的对应的值放入到另一个excel中

有个excel叫典型草原降水强度,还有个excel叫典型草原数浓度,这两个excel里面time和data_name列,time列里面的数据格式是YYYY-M-D空格H:S,data_name列里面是XXXX-时间戳,53192-20240510101700-20240510105559-0_N…

可信网站标识河南省考生服务平台官网

目录 服务端这么做服务端告知客户端使用 Basic Authentication 方式进行认证服务端接收并处理客户端按照 Basic Authentication 方式发送的数据 客户端这么做如果客户端是浏览器如果客户端是 RestTemplat如果客户端是 HttpClient 其它参考 服务端这么做 服务端告知客户端使用 …

wordpress建站优缺点服务中心网站建设意见

less 用来浏览超过一页的文件 用 / 可用来查找关键字 q键退出 cat -n 3.txt | less行号显示grep 文本处理工具,以行为单位找关键字 ls -l /boot | grep ^l grep 关键字 文件名 grep runlevel /etc/inittab 参数 -i忽略大小写 -n显示行号 -v排除关键字&#xff0…

【K8S】Kubernetes 调度器深度解析:原理与源码分析

@目录一、调度器架构概述1.1 核心架构设计1.2 调度器工作流程二、调度队列机制2.1 优先级队列实现2.2 Pod 优先级与抢占三、调度框架与插件系统3.1 框架扩展点3.2 插件注册与执行四、调度周期详细分析4.1 调度算法入口…