Docker Compose部署微服务项目实战讲解

一、Docker Compose简介

当需要在多个容器之间协调和管理应用程序时,Docker Compose是一个非常有用的工具。它允许通过一个配置文件来定义、配置和启动多个 Docker 容器,使得整个应用程序的部署变得更加简单和一致。以下是 Docker Compose 的一些重要概念和用法:

1. Compose 文件

Compose 文件是 Docker Compose 的核心组件,通常命名为 docker-compose.yml。这个文件用于定义应用程序的服务、网络和卷等。它描述了容器之间的关系、容器的配置选项以及如何运行这些容器。Compose 文件使用 YAML 格式,因此它是易读易写的。

2. 服务

Compose 文件中的每个顶级键都代表一个服务。服务定义了应用程序的一个部分,通常对应一个容器。服务包含配置信息,例如使用的 Docker 镜像、容器的端口映射、环境变量、卷挂载等。

version: '3'
services:web:image: nginx:latestports:- "8080:80"volumes:- ./html:/usr/share/nginx/html

上面的例子定义了一个名为 web 的服务,使用 Nginx 镜像,将主机的 8080 端口映射到容器的 80 端口,并将主机的 ./html 目录挂载到容器的 /usr/share/nginx/html 目录。

3. 网络

Compose 允许你定义自己的网络,以便服务之间可以相互通信。默认情况下,Compose 会为你的应用程序创建一个默认网络,但你也可以自定义网络以更好地满足你的需求。

4.

卷允许在容器之间共享和持久化数据。Compose 允许你将主机的目录或其他容器的卷挂载到你的服务中。

5. 启动和停止服务

使用 docker-compose up 命令可以启动应用程序,而 docker-compose down 命令则会停止并移除相关的容器、网络和卷。

docker-compose up -d  # 在后台启动服务
docker-compose down  # 停止并移除服务
6. 重启服务

使用 docker-compose restart 命令可以重新启动一个或多个服务。

docker-compose restart [service_name]

使用 Docker Compose,你可以更轻松地定义、配置和管理多个 Docker 容器,为复杂的应用程序提供了一种方便的部署方式。

二、通过Docker Compose部署微服务实战
上传项目

将后端所有服务模块的jar包上传到Linux服务器项目目录下,因为每个服务模块都需要配置个Dockerfile,所以分别建各自的目录,结构如下:
image.png
其中,nacos为注册中心和配置中心服务,gateway是网关服务,system为系统服务,business是主要的业务服务,html下放的是前端vue编译后的js、html等文件,nginx.conf是nginx的配置文件。每个目录下都有Dockerfile文件。
image.png

nacos配置文件

Dockerfile

FROM openjdk:8-jre-alpine
WORKDIR /appCOPY ./*.jar /app
COPY ./application.yml /app/application.yml
RUN apk update && apk add --no-cache libc6-compat
RUN apk update && apk add --no-cache gcompat
ENTRYPOINT ["java","-jar","/app/jeecg-cloud-nacos-2.3.5.RELEASE.jar"]

application.yml

server:servlet:contextPath: /nacostomcat:accesslog:enabled: truepattern: '%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i'basedir: ''
spring:datasource:platform: mysql
db:num: 1password:'0': xxxxxxxxxxxxurl:'0': jdbc:mysql://mysql57:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=trueuser:'0': root
management:metrics:export:elastic:enabled: falseinflux:enabled: false
nacos:core:auth:caching:enabled: truedefault:token:expire:seconds: 18000secret:key: SecretKey012345678901234567890123456789012345678901234567890123456789enabled: falsesystem:type: nacosistio:mcp:server:enabled: falsenaming:empty-service:auto-clean: trueclean:initial-delay-ms: 50000period-time-ms: 30000security:ignore:urls: /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**standalone: true
gateway配置文件

Dockerfile

FROM openjdk:8-jre-alpine
WORKDIR /appCOPY ./*.jar /app
COPY ./application.yml /app/application.yml
ENTRYPOINT ["java","-jar","/app/jeecg-cloud-gateway-3.2.0.jar"]

application.yml

server:port: 9999
spring:application:name: jeecg-gateway#redis 配置redis:database: 0host: redis-6lettuce:pool:max-active: 8   #最大连接数据库连接数,设 0 为没有限制max-idle: 8     #最大等待连接中的数量,设 0 为没有限制max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。min-idle: 0     #最小等待连接中的数量,设 0 为没有限制shutdown-timeout: 100ms# password: 123456a?port: 6379main:#循环依赖默认情况下已经被禁止了allow-circular-references: trueallow-bean-definition-overriding: truecloud:nacos:config:username: nacospassword: nacosnamespace: server-addr: nacos:8848group: DEFAULT_GROUPfile-extension: yamlprefix: jeecgdiscovery:namespace: server-addr: nacos:8848watch:enabled: false#Sentinel配置sentinel:transport:dashboard: jeecg-boot-sentinel:9000# 支持链路限流web-context-unify: falsefilter:enabled: false# 取消Sentinel控制台懒加载eager: falsedatasource:#流控规则flow:  # 指定数据源名称# 指定nacos数据源nacos:server-addr: nacos:8848# 指定配置文件dataId: ${spring.application.name}-flow-rules# 指定分组groupId: SENTINEL_GROUP# 指定配置文件规则类型rule-type: flow# 指定配置文件数据格式data-type: json#降级规则degrade:nacos:server-addr: nacos:8848dataId: ${spring.application.name}-degrade-rulesgroupId: SENTINEL_GROUPrule-type: degradedata-type: json#系统规则system:nacos:server-addr: nacos:8848dataId: ${spring.application.name}-system-rulesgroupId: SENTINEL_GROUPrule-type: systemdata-type: json#授权规则authority:nacos:server-addr: nacos:8848dataId: ${spring.application.name}-authority-rulesgroupId: SENTINEL_GROUPrule-type: authoritydata-type: json#热点参数param-flow:nacos:server-addr: nacos:8848dataId: ${spring.application.name}-param-rulesgroupId: SENTINEL_GROUPrule-type: param-flowdata-type: json#网关流控规则gw-flow:nacos:server-addr: nacos:8848dataId: ${spring.application.name}-flow-rulesgroupId: SENTINEL_GROUPrule-type: gw-flowdata-type: json#API流控规则gw-api-group:nacos:server-addr: nacos:8848dataId: ${spring.application.name}-api-rulesgroupId: SENTINEL_GROUPrule-type: gw-api-groupdata-type: jsongateway:discovery:locator:enabled: trueglobalcors:add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题cors-configurations:'[/**]':allowCredentials: true#springboot2.4后需用allowedOriginPatternsallowedOriginPatterns: "*"allowedMethods: "*"allowedHeaders: "*"
system配置文件

Dockerfile

FROM openjdk:8-jre-alpine
WORKDIR /appCOPY ./*.jar /app
COPY ./application.yml /app/application.yml
RUN apk add --update ttf-dejavu fontconfig
ENTRYPOINT ["java","-jar","/app/jeecg-cloud-system-start-3.2.0.jar"]

application.yml

server:#微服务端口port: 7001
spring:application:name: jeecg-systemcloud:nacos:config:username: nacospassword: nacosnamespace: server-addr: nacos:8848group: DEFAULT_GROUPfile-extension: yamlprefix: jeecgdiscovery:namespace: server-addr: nacos:8848watch:enabled: falsedatasource:dynamic:datasource:master:url: jdbc:mysql://mysql57:3306/trade-service-platform?rewriteBatchedStatements=true&tinyInt1isBit=false&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=trueusername: rootpassword: 2020miman2023driver-class-name: com.mysql.cj.jdbc.Driveradms7pro:url: jdbc:sqlserver://123.51.235.21:1433;DatabaseName=adms7prousername: JGLogpassword: JG5656driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver#redis 配置redis:database: 0host: redis-6lettuce:pool:max-active: 8   #最大连接数据库连接数,设 0 为没有限制max-idle: 8     #最大等待连接中的数量,设 0 为没有限制max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。min-idle: 0     #最小等待连接中的数量,设 0 为没有限制shutdown-timeout: 100ms# password: 123456a?port: 6379jeecg:# 签名密钥串(前后端要一致,正式发布请自行修改)signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a
business配置文件

Dockerfile

FROM openjdk:8-jre-alpine
WORKDIR /appCOPY ./*.jar /app
COPY ./application.yml /app/application.yml
ENTRYPOINT ["java","-jar","/app/jeecg-module-business-start.jar"]

application.yml

server:port: 7002
spring:main:allow-bean-definition-overriding: trueapplication:name: jeecg-businesscloud:nacos:config:username: nacospassword: nacosnamespace: server-addr: nacos:8848group: DEFAULT_GROUPfile-extension: yamlprefix: jeecgdiscovery:namespace: server-addr: nacos:8848watch:enabled: falsedatasource:dynamic:datasource:master:url: jdbc:mysql://mysql57:3306/trade-service-platform?rewriteBatchedStatements=true&tinyInt1isBit=false&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=trueusername: rootpassword: 2020mima2023driver-class-name: com.mysql.cj.jdbc.Driveradms7pro:url: jdbc:sqlserver://123.111.111.81:1433;DatabaseName=adms7prousername: rootpassword: JGLog11111driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver#redis 配置redis:database: 0host: redis-6lettuce:pool:max-active: 8   #最大连接数据库连接数,设 0 为没有限制max-idle: 8     #最大等待连接中的数量,设 0 为没有限制max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。min-idle: 0     #最小等待连接中的数量,设 0 为没有限制shutdown-timeout: 100ms# password: 123456a?port: 6379jeecg:# 签名密钥串(前后端要一致,正式发布请自行修改)signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a
mybatis-plus:configuration:map-underscore-to-camel-case: true
将前端打包后的dist内文件放到html中

image.png

根目录下放一个nginx配置文件:nginx.conf,ip改为对应的网关容器名gateway
#user  nobody;
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;underscores_in_headers on;		sendfile        on;keepalive_timeout  65;server {listen       3001;server_name  localhost;gzip on;gzip_min_length 1k;gzip_comp_level 9;gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;gzip_vary on;gzip_disable "MSIE [1-6]\.";location ^~ /jeecg-boot/ {proxy_pass http://gateway:9999/;#proxy_set_header Host 10.10.10.164;	client_max_body_size 100m;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods *;add_header Access-Control-Allow-Headers *;if ($request_method = 'OPTIONS') {return 204;}add_header 'Access-Control-Allow-Credentials' true;add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';}location / {root /usr/share/nginx/html;index  index.html index.htm;if (!-e $request_filename) {rewrite ^(.*)$ /index.html?s=$1 break;rewrite ^(.*)$ /index.html?s=$1 last;break;}}location ^~ /websocket/ {proxy_pass http://gateway:9999/websocket/;proxy_read_timeout 600;proxy_connect_timeout 4s;proxy_send_timeout 12s;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}
根目录下新建Docker Compose的配置文件docker-compose.yml
version: "3"
services:      nacos:container_name: nacosbuild:context: ./nacosdockerfile: Dockerfile image: nacos:latestenvironment:- TZ=Asia/Shanghaivolumes:- /etc/localtime:/etc/localtime:ro  #配置与宿主机时钟一致- /etc/timezone/timezone:/etc/timezone:ro #配置与宿主机时钟一致ports:- 8848:8848networks:- jg_networkrestart: alwaysgateway:container_name: gatewaybuild:context: ./gatewaydockerfile: Dockerfile image: gateway:latestenvironment:- TZ=Asia/Shanghaivolumes:- /etc/localtime:/etc/localtime:ro  #配置与宿主机时钟一致- /etc/timezone/timezone:/etc/timezone:ro #配置与宿主机时钟一致ports:- 9999:9999depends_on:- nacosnetworks:- jg_networkrestart: alwayssystem:container_name: systembuild:context: ./systemdockerfile: Dockerfile image: system:latestenvironment:- TZ=Asia/Shanghaivolumes:- /etc/localtime:/etc/localtime:ro  #配置与宿主机时钟一致- /etc/timezone/timezone:/etc/timezone:ro #配置与宿主机时钟一致ports:- 7001:7001depends_on:- nacosnetworks:- jg_networkrestart: alwaysbusiness:container_name: businessbuild:context: ./businessdockerfile: Dockerfile image: business:latestenvironment:- TZ=Asia/Shanghaivolumes:- /etc/localtime:/etc/localtime:ro  #配置与宿主机时钟一致- /etc/timezone/timezone:/etc/timezone:ro #配置与宿主机时钟一致ports:- 7002:7002depends_on:- nacosnetworks:- jg_networkrestart: always#nginx服务nginx:image: nginx:1.18.0container_name: nginxenvironment:- TZ=Asia/Shanghaiports:- "3001:3001"volumes:- ./html:/usr/share/nginx/html- ./nginx.conf:/etc/nginx/nginx.confrestart: alwaysnetworks:- jg_networknetworks:jg_network:external: true
三、启动容器编排
# 在后台启动服务
docker-compose up -d
# 停止并移除服务
docker-compose down
# 重新构建镜像 --force-rm 删除构建过程中的临时容器。
docker-compose build --force-rm
# 查看实时日志,如system
docker logs -t -f system

image.png

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

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

相关文章

Linux使用宝塔面板+Discuz+cpolar内网穿透工具搭建可公网访问论坛

Linux宝塔面板搭建Discuz论坛, 并内网穿透实现公网访问 文章目录 Linux宝塔面板搭建Discuz论坛, 并内网穿透实现公网访问前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Di…

【 图片加载】Vue前端各种图片引用

文章目录 一、图片作为js常量(常作为配置项的值 )1、在线链接2、本地图片 二、图片img标签1、一般的src2、动态的src用require3、src可以接收二进制文件blob(如后端返回的、a-upload传的图片) 三、背景图片 一、图片作为js常量(常…

8款那些年救过我的数据文件恢复软件 - 误删除重要文件的“后悔药”

无论您在保存备份方面多么小心,灾难有时还是会发生。有时您的备份软件无法按预期运行。 如果您的外部驱动器靠近您的设备,发生火灾/洪水/故障时,有时备份会与原始文件一起丢失。即使是云存储也不能避免故障。 还有一个事实是,我…

C++设计模式之工厂模式(上)——简单工厂模式

工厂模式 概述简单工厂模式介绍示例示例使用运行结果缺点 概述 工厂模式属于一种创建型设计模式。其可以分为简单工厂模式,工厂模式和抽象工厂模式。工厂模式分为上、中、下三篇,本篇主要介绍简单工厂模式。 简单工厂模式 介绍 简单工厂模式可以理解…

二叉树题目:具有所有最深结点的最小子树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:具有所有最深结点的最小子树 出处:865. 具有所有最深结点的最小子树 难度 5 级 题目描述 要求 给定…

HCIP-六、OSPF-2 综合实验

六、OSPF-2 综合实验 实验拓扑实验需求及解法1.设备名称和部分IP地址已配置2.所有设备运行OSPF,进程号为13.区域间路由汇总4.外部路由汇总5.下发默认路由6. 虚链路 实验拓扑 实验需求及解法 本实验模拟OSPF综合型网络,按照以下需求完成实验。 1.设备名…

EventLog Analyzer:强大的日志管理与分析工具

随着企业网络规模的扩大和信息系统的复杂化,安全日志管理和分析成为了至关重要的一环。在这个背景下,EventLog Analyzer崭露头角,成为一款备受推崇的日志管理与分析工具。本文将介绍EventLog Analyzer的主要特点、功能以及为企业带来的实际价…

IDEA安装教程

文章目录 1 下载IntelliJ IDEA2 安装3 IDEA配置4 创建项目 1 下载IntelliJ IDEA ​ 官方网站上下载最新版本的IntelliJ IDEA。官方网站提供了两个版本:Community版和Ultimate版。 Community版是免费的,适用于个人和非商业用途。Ultimate版则需要付费购…

Exception in thread “消费者“ java.lang.IllegalMonitorStateException

这两天学习生产者消费者模型的时候,使用Java线程来实现,出现了一个问题“Exception in thread "消费者" java.lang.IllegalMonitorStateException”,并且,线程不结束。报错图片如下: 那我们怎么解决呢&…

竞赛选题 题目: 基于深度学习的疲劳驾驶检测 深度学习

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 🔥 优…

河北专升本(微机原理)

目录 第一章:计算机基础与数制转化 1. 进制运算基础 2. 常用编码形式 3. 计算机系统的组成及其工作原理 4. 微机系统主要技术指标 第二章:8086微处理器及其系统 1. 8086微处理器(CPU) 2. 8086的存储器及I/O组织 3. 8086系…

vue中的列表过滤和列表排序

列表过滤 <body><div id"root"><!--输入框用于模糊查询--><input type"text" placeholder"请你输入名字" v-model"name"><ul><!--in可以换成of--><li v-for"(p,index) in persons" …

航天博物馆3D虚拟交互展厅让大众对科技发展有更深切的理解和感受

博物馆作为人们了解历史、文化和艺术的重要场所&#xff0c;现在可以通过VR全景技术来进行展览&#xff0c;让参观者身临其境地感受历史文化的魅力。本文将介绍博物馆VR全景的特点、优势&#xff0c;以及如何使用VR全景技术来使得博物馆的展览和教育活动更丰富。 VR数字博物馆…

WPF图形变形使用技巧

在 WPF (Windows Presentation Foundation) 中&#xff0c;图形变形通常是通过使用 Transform 对象来实现的。WPF 提供了几种不同类型的 Transform&#xff0c;包括&#xff1a; TranslateTransform&#xff1a;用于在 x 轴和 y 轴上移动&#xff08;平移&#xff09;元素。Sc…

SSH 下载及安装之 Windows Server

文章目录 1 概述1.1 操作系统截图1.2 下载 2 安装2.1 解压到指定路径2.2 CMD 到 OpenSSH 目录下2.3 安装 sshd 服务2.3 开放端口 222.4 配置开机自启 sshd 服务2.5 配置环境变量 path2.6 测试 3 连接3.1 使用 Xshell 连接3.2 输入登录用户名3.3 输入登录密码3.4 会话已建立 1 概…

3、如何从0到1去建设数据仓库

1、数仓实施过程 1.1 数据调研 数据调研包括&#xff1a;业务调研、需求调研 业务调研 需要调研企业内有哪些业务线、业务线的业务是否还有相同点和差异点 各个业务线有哪些业务模块&#xff0c;每个模型下有哪些业务流程&#xff0c;每个流程下产生的数据 是怎样存储的 业务调…

python数据结构与算法-16_优先级队列

优先级队列 你可能比较奇怪&#xff0c;队列不是早就讲了嘛。这里之所以放到这里讲优先级队列&#xff0c;是因为虽然名字有队列&#xff0c; 但其实是使用堆来实现的。上一章讲完了堆&#xff0c;这一章我们就趁热打铁来实现一个优先级队列。 实现优先级队列 优先级队列(Pr…

UWA报告使用技巧小视频,你get了么?(第十一弹)

随着玩家对手游渲染品质的要求日益趋上&#xff0c;60帧、各种花式后处理导致发热、耗电等问题日趋明显。本期UWA报告使用技巧将分享关于GPU优化的专题姊妹篇。 《GPU性能优化篇》 UWA专注于手游GPU性能的优化&#xff0c;以确保您的游戏体验得以最佳展现。基于最新发布的GOT …

141.【Git版本控制】

Git-深入挖掘 (一)、Git分布式版本控制工具1.目标2.概述(1).开发中的实际常见(2).版本控制器的方式(3).SVN (集中版本控制器)(4).Git (分布版本控制器)(5).Git工作流程图 (二)、Git安装与常用命令1.Git环境配置(1).安装Git的操作(2).Git的配置操作(3).为常用的指令配置别名 (可…