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

news2024/11/16 1:48:23
一、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:latest
    ports:
      - "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 /app

COPY ./*.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: /nacos
  tomcat:
    accesslog:
      enabled: true
      pattern: '%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i'
    basedir: ''
spring:
  datasource:
    platform: mysql
db:
  num: 1
  password:
    '0': xxxxxxxxxxxx
  url:
      '0': jdbc:mysql://mysql57:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
  user:
    '0': root
management:
  metrics:
    export:
      elastic:
        enabled: false
      influx:
        enabled: false
nacos:
  core:
    auth:
      caching:
        enabled: true
      default:
        token:
          expire:
            seconds: 18000
          secret:
            key: SecretKey012345678901234567890123456789012345678901234567890123456789
      enabled: false
      system:
        type: nacos
  istio:
    mcp:
      server:
        enabled: false
  naming:
    empty-service:
      auto-clean: true
      clean:
        initial-delay-ms: 50000
        period-time-ms: 30000
  security:
    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 /app

COPY ./*.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: 0
    host: redis-6
    lettuce:
      pool:
        max-active: 8   #最大连接数据库连接数,设 0 为没有限制
        max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
      shutdown-timeout: 100ms
    # password: 123456a?
    port: 6379
  main:
    #循环依赖默认情况下已经被禁止了
    allow-circular-references: true
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      config:
        username: nacos
        password: nacos
        namespace: 
        server-addr: nacos:8848
        group: DEFAULT_GROUP
        file-extension: yaml
        prefix: jeecg
      discovery:
        namespace: 
        server-addr: nacos:8848
        watch:
          enabled: false
    #Sentinel配置
    sentinel:
      transport:
        dashboard: jeecg-boot-sentinel:9000
      # 支持链路限流
      web-context-unify: false
      filter:
        enabled: false
      # 取消Sentinel控制台懒加载
      eager: false
      datasource:
        #流控规则
        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:8848
            dataId: ${spring.application.name}-degrade-rules
            groupId: SENTINEL_GROUP
            rule-type: degrade
            data-type: json
        #系统规则
        system:
          nacos:
            server-addr: nacos:8848
            dataId: ${spring.application.name}-system-rules
            groupId: SENTINEL_GROUP
            rule-type: system
            data-type: json
        #授权规则
        authority:
          nacos:
            server-addr: nacos:8848
            dataId: ${spring.application.name}-authority-rules
            groupId: SENTINEL_GROUP
            rule-type: authority
            data-type: json
        #热点参数
        param-flow:
          nacos:
            server-addr: nacos:8848
            dataId: ${spring.application.name}-param-rules
            groupId: SENTINEL_GROUP
            rule-type: param-flow
            data-type: json
        #网关流控规则
        gw-flow:
          nacos:
            server-addr: nacos:8848
            dataId: ${spring.application.name}-flow-rules
            groupId: SENTINEL_GROUP
            rule-type: gw-flow
            data-type: json
        #API流控规则
        gw-api-group:
          nacos:
            server-addr: nacos:8848
            dataId: ${spring.application.name}-api-rules
            groupId: SENTINEL_GROUP
            rule-type: gw-api-group
            data-type: json
    gateway:
      discovery:
        locator:
          enabled: true
      globalcors:
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        cors-configurations:
          '[/**]':
            allowCredentials: true
            #springboot2.4后需用allowedOriginPatterns
            allowedOriginPatterns: "*"
            allowedMethods: "*"
            allowedHeaders: "*"
system配置文件

Dockerfile

FROM openjdk:8-jre-alpine
WORKDIR /app

COPY ./*.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-system
  cloud:
    nacos:
      config:
        username: nacos
        password: nacos
        namespace: 
        server-addr: nacos:8848
        group: DEFAULT_GROUP
        file-extension: yaml
        prefix: jeecg
      discovery:
        namespace: 
        server-addr: nacos:8848
        watch:
          enabled: false
  datasource:
    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=true
          username: root
          password: 2020miman2023
          driver-class-name: com.mysql.cj.jdbc.Driver
        adms7pro:
          url: jdbc:sqlserver://123.51.235.21:1433;DatabaseName=adms7pro
          username: JGLog
          password: JG5656
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
 #redis 配置
  redis:
    database: 0
    host: redis-6
    lettuce:
      pool:
        max-active: 8   #最大连接数据库连接数,设 0 为没有限制
        max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
      shutdown-timeout: 100ms
    # password: 123456a?
    port: 6379
    
jeecg:
  # 签名密钥串(前后端要一致,正式发布请自行修改)
  signatureSecret: dd05f1c54d63749eda95f9fa6d49v442a
business配置文件

Dockerfile

FROM openjdk:8-jre-alpine
WORKDIR /app

COPY ./*.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: true
  application:
    name: jeecg-business
  cloud:
    nacos:
      config:
        username: nacos
        password: nacos
        namespace: 
        server-addr: nacos:8848
        group: DEFAULT_GROUP
        file-extension: yaml
        prefix: jeecg
      discovery:
        namespace: 
        server-addr: nacos:8848
        watch:
          enabled: false
  datasource:
    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=true
          username: root
          password: 2020mima2023
          driver-class-name: com.mysql.cj.jdbc.Driver
        adms7pro:
          url: jdbc:sqlserver://123.111.111.81:1433;DatabaseName=adms7pro
          username: root
          password: JGLog11111
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
 #redis 配置
  redis:
    database: 0
    host: redis-6
    lettuce:
      pool:
        max-active: 8   #最大连接数据库连接数,设 0 为没有限制
        max-idle: 8     #最大等待连接中的数量,设 0 为没有限制
        max-wait: -1ms  #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
        min-idle: 0     #最小等待连接中的数量,设 0 为没有限制
      shutdown-timeout: 100ms
    # password: 123456a?
    port: 6379
  
jeecg:
  # 签名密钥串(前后端要一致,正式发布请自行修改)
  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: nacos
    build:
      context: ./nacos
      dockerfile: Dockerfile 
    image: nacos:latest
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /etc/localtime:/etc/localtime:ro  #配置与宿主机时钟一致
      - /etc/timezone/timezone:/etc/timezone:ro #配置与宿主机时钟一致
    ports:
      - 8848:8848
    networks:
      - jg_network
    restart: always
    
  gateway:
    container_name: gateway
    build:
      context: ./gateway
      dockerfile: Dockerfile 
    image: gateway:latest
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /etc/localtime:/etc/localtime:ro  #配置与宿主机时钟一致
      - /etc/timezone/timezone:/etc/timezone:ro #配置与宿主机时钟一致
    ports:
      - 9999:9999
    depends_on:
      - nacos
    networks:
      - jg_network
    restart: always
    
  system:
    container_name: system
    build:
      context: ./system
      dockerfile: Dockerfile 
    image: system:latest
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /etc/localtime:/etc/localtime:ro  #配置与宿主机时钟一致
      - /etc/timezone/timezone:/etc/timezone:ro #配置与宿主机时钟一致
    ports:
      - 7001:7001
    depends_on:
      - nacos
    networks:
      - jg_network
    restart: always
    
  business:
    container_name: business
    build:
      context: ./business
      dockerfile: Dockerfile 
    image: business:latest
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /etc/localtime:/etc/localtime:ro  #配置与宿主机时钟一致
      - /etc/timezone/timezone:/etc/timezone:ro #配置与宿主机时钟一致
    ports:
      - 7002:7002
    depends_on:
      - nacos
    networks:
      - jg_network
    restart: always
    
#nginx服务
  nginx:
    image: nginx:1.18.0
    container_name: nginx
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "3001:3001"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./nginx.conf:/etc/nginx/nginx.conf
    restart: always
    networks:
      - jg_network
    
networks:
  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.coloradmin.cn/o/1246663.html

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

相关文章

猿人学(非常简单三道题)

17. 天杀的http2.0 https://blog.csdn.net/weixin_44327634/article/details/123740008?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169949361816800180633940%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id169949361816800…

机器学习/sklearn 笔记:K-means,kmeans++,MiniBatchKMeans,二分Kmeans

1 K-means介绍 1.0 方法介绍 KMeans算法通过尝试将样本分成n个方差相等的组来聚类,该算法要求指定群集的数量。它适用于大量样本,并已在许多不同领域的广泛应用领域中使用。KMeans算法将一组样本分成不相交的簇,每个簇由簇中样本的平均值描…

全志D1芯片 MIPI屏幕TFT08006支持

屏幕简介 TFT08006官方支持的一款MIPI屏幕,8寸,分辨率800*1280。官方套装支持触控。 下载 MIPI屏幕 TFT08006 patch: https://www.aw-ol.com/downloads/resources/27 MIPI屏幕 TFT08006 相关资料见:https://www.aw-ol.com/down…

OkHttpUrlConnection库编写代码示例

OkHttpUrlConnection库编写的爬虫程序,该程序使用Kotlin编写的。 kotlin import java.net.HttpURLConnection import java.net.URL import java.net.URLConnection import java.io.BufferedReader import java.io.InputStreamReader fun main() { val url UR…

java学习part09类的构造器

1. 2.默认构造器 如果没有显式定义任何构造器,系统会默认加一个默认构造器。 如果定义了,则不会有默认构造器。 默认构造器的权限和类的权限一样,类是public构造器就是public,类是缺省默认构造器就是缺省 反编译之后添加的构造…

申请二级域名

1、登录腾讯云 腾讯云 产业智变云启未来 - 腾讯 (tencent.com) 2、进入我的域名,点击主域名 3、点击前往DNSPod管理 4、点击我的域名,然后点击主域名 5、点击添加记录,进行添加二级域名信息 6、添加相应二级域名信息 7、添加后需要进行验证…

振弦式土压力计在岩土工程安全监测应用的方案

振弦式土压力计在岩土工程安全监测应用的方案 振弦式土压力计是一种常见的土压力测量仪器,其原理是利用振弦在土中传播的速度与土的应力状态有关的特点测量土压力。在岩土工程安全监测中,振弦式土压力计可以应用于以下方面: 1. 地下连续墙和…

Redis入门指南学习笔记(3):Redis高级特性

一.前言 上一篇博客对Redis常用的数据结构进行了详细介绍。Redis除了丰富的数据类型支持,还包含许多高级特性,例如事务、内存驻留策略、排序、消息队列等,本文将对这些进行逐一介绍。 二.事务 Redis同样包含事务(transaction&a…

mysql多表重复数据只保留一行的思路

一、问题描述 假设有3个表,test_a,test_b,test_c; test_a和test_b中有些重复数据; 现在要把这2个表的数据同步到表c,但是重复数据只保留1行。 样例如下: 具体要求如下: 1.tes…

Unity使用DOTween实现分段进度条

文章目录 需求下载安装 DOTween实现实现效果 需求 用组件进度条(Slider),利用分段加载进行以假乱真的进度效果,比如说2秒钟到达20%的进度,10秒钟加载20%到50%进度,1分钟加载50%到90%的进度,30秒…

沉头孔和埋头孔的区别

埋头空和沉头孔的区别在于螺栓孔上部扩孔:沉头孔是直筒结构;埋头孔是四十五度结构,比沉头孔较为平顺。 螺栓孔上部扩孔能容纳螺栓头部,使螺头部不高于周围表面。埋头空和沉头孔只是两种不同的叫法。 沉头孔是 PCB 上的圆柱形凹槽…

网站定制开发有哪些分类?|企业软件app小程序定制

网站定制开发有哪些分类?|企业软件app小程序定制 网站定制开发是指根据客户需求,为其量身定制设计和开发的网站服务。目前,网站定制开发主要分为以下几个分类: 1. 静态网站定制开发:静态网站是由HTML、CSS和JavaScrip…

多模态常见任务介绍

视觉问答(VQA, Visual Question Answer) 目标:给定一个图片以及问题,需要理解图片的内容并基于此用自然语言回答问题。 例如,图像中发生什么事,人物穿的衣服是什么颜色,图像中有多…

算法:给出指定整数区间、期望值,得到最终结果

1,问题: 在游戏中,我们经常会遇到以下情况:打开宝箱,获得x个卡牌碎片。 但通常策划只会给一个既定的数值空间,和一个期望得到的值,然后让我们去随机。比如: 问题A:在1~…

浪涌Surge整改:保护和优化电力系统!|深圳比创达电子EMC

一、浪涌现象简介 浪涌是一种在电气系统中常见的现象,其涉及电压、电流的突然增加,超过系统的正常操作范围。这可能是由许多因素引起的,如雷击、设备故障、或电网中的突然负荷变化。浪涌可能导致设备损坏,甚至可能危及人员安全。…

css引入的三种方式

css引入的三种方式 一、内联样式二、外部样式表三、 内部样式表总结trouble 一、内联样式 内联样式也被称为行内样式。它是将 CSS 样式直接应用于 HTML 元素的 style 属性中的一种方式 <p style"color: blue; font-size: 16px;">这是一个带有内联样式的段落。&…

前后端性能优化实践(含Java代码部分、数据库部分、React前端部分)

最近的一个大屏报表统计的接口查询速度很慢&#xff0c;耗时近一分钟左右&#xff0c;数据量级只是700万左右&#xff0c;但很慢&#xff0c;最后优化到4秒左右&#xff0c;客户还能接受&#xff0c;但其实还可以在优化&#xff0c;先这样吧&#xff0c;简单记录下。这次主要优…

接口测试学习路线

接口测试分为两种&#xff1a; 测试外部接口&#xff1a;系统和外部系统之间的接口 如&#xff1a;电商网站&#xff1a;支付宝支付 测试内部接口&#xff1a;系统内部的模块之间的联调&#xff0c;或者子系统之间的数据交互 测试重点&#xff1a;测试接口参数传递的正确性&…

进制转换 蓝桥oj Alice和Bob的爱恨情仇

题目 翻译 主要思路 举个例子方便理解 以奇数为底去分解一个奇数&#xff0c;分解次数一定是奇数&#xff1b;以奇数为底去分解一个偶数&#xff0c;分解次数一定是偶数 如果一个堆的分解次数是奇数&#xff0c;就在总分解次数上加1&#xff1b;如果一个堆的分解次数是偶数&…

【高级网络程序设计】Week2-1 Sockets

一、The Basics 1. Sockets 定义An abstraction of a network interface应用 use the Socket API to create connections to remote computers send data(bytes) receive data(bytes) 2. Java network programming the java network libraryimport java.net.*;similar to…