系列文章

CentOS 7下安装Docker

Docker部署springboot+vue项目

Docker部署微服务

简介

     Docker是一个很强大的容器化管理工具,诸多的优点(优点和解决方案)让它逐渐成为项目部署和持续集成的首选方案。
     对于多个服务构成的微服务而言,项目的统一启动、停止、重建等需求成为了选择部署工具的必要条件之一,针对这样的需求,dodcker提供了docker-compose。
     docker-compose是用于定义和运行多容器Docker应用程序的工具,使用Compose基本上是一个三步过程:

  • 定义每个环境自己的Dockerfile,以便在任何地方使用和复制
  • 定义组成应用的服务,编写docker-compose.yml,以便容器可以在隔离的环境中一起运行
  • 运行 docker-compose up,docker-compose会自动创建和启动容器

项目准备

  • 模块构成

在这里插入图片描述

  • 模块配置
    server
server:
  port: 10000
spring:
  application:
    name: fdfs-server
  profiles: server-one
eureka:
  client:
    service-url:
      defaultZone: http://fdfs-server-two:10001/eureka/
  instance:
    hostname: fdfs-server
    prefer-ip-address: true

---
server:
  port: 10001
spring:
  application:
    name: fdfs-server
  profiles: server-two
eureka:
  client:
    service-url:
      defaultZone: http://fdfs-server-one:10000/eureka/
  instance:
    hostname: fdfs-server
    prefer-ip-address: true

1.我这里是单机eureka server服务集群,没需要的可以只要一个配置

     zuul

server:
  port: 10002
spring:
  application:
    name: fdfs-zuul
eureka:
  client:
    service-url:
      defaultZone: http://fdfs-server-one:10000/eureka/
  instance:
    hostname: fdfs-zuul
    prefer-ip-address: true
zuul:
  #需要忽略的头部信息,不在传播到其他服务(跨域)
  sensitive-headers: Access-Control-Allow-Origin
  ignored-headers: Access-Control-Allow-Origin,H-APP-Id,Token,APPToken
  routes:
    api-f:
      path: /api-f/**
      service-id: fdfs-feign
  ribbon:
    ReadTimeout: 3000
    ConnectTimeout: 3000
  host:
      connect-timeout-millis: 15000
      socket-timeout-millis: 60000
  hystrix:
    command:
      default:
        execution:
          isolation:
            thread:
              timeout-in-milliseconds: 3000

1.这里的服务ip要写服务在docker网桥里的名字(没定义默认是容器名),这里是fdfs-server-one
2.路由调用服务也要是服务在docker网桥里的名字(没定义默认是容器名),这里是fdfs-feign

     feign

server:
  port: 10005
spring:
  application:
    name: fdfs-feign
eureka:
  client:
    service-url:
      defaultZone: http://fdfs-server-one:10000/eureka/
  instance:
    hostname: fdfs-feign
    prefer-ip-address: true
feign:
  hystrix:
    enabled: true

     upload

server:
  port: 10003
spring:
  application:
    name: fdfs-upload
  datasource:
    druid:
      url: jdbc:mysql://fdfs-mysql:3306/fastdfs?useUnicode=true&characterEncoding=utf-8&useSSL=false
      username: root
      password: 12345
      driver-class-name: com.mysql.cj.jdbc.Driver
      platform: mysql
      type: com.alibaba.druid.pool.DruidDataSource
      # 下面为连接池的补充设置,应用到上面所有数据源中
      # 初始化大小,最小,最大
      initialSize: 1
      minIdle: 3
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 30000
      validationQuery: select 'x'
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      # 打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filters: stat,wall,slf4j
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      # 合并多个DruidDataSource的监控数据
      #useGlobalDataSourceStat: true
    jpa:
      show-sql: true
#服务注册
eureka:
  client:
    service-url:
      defaultZone: http://fdfs-server-two:10001/eureka/
  instance:
    hostname: fdfs-upload
    prefer-ip-address: true
mybatis-plus:
  mapper-locations: classpath:/mapper/*Mapper.xml
  typeAliasesPackage: com.fastdfs.fastdfsupload.entity
  • 打包出错解决

     错误一在这里插入图片描述

公共模块的xxxx找不到或者公共模块找不到mainclass,删除公共模块以及父项目的打包插件spring-boot-maven-plugin

     错误二
在这里插入图片描述

org.apache.maven.plugins:maven-surefire-plugin:xxxxx:这个插件找不到,报错模块的打包处添加:

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>


  • 项目配置

version: "3.7"
services:
    mysql:
        #容器启动镜像(这里一定要有mysql镜像)
        image: mysql:5.7.29
        #容器所在网络
        networks:
            - cloud
        #容器映射端口
        ports:
            - "3306:3306"
        #启动环境配置
        environment:
            - MYSQL_ROOT_PASSWORD=12345
            - MYSQL_USER=root
        #密码方式(不是必要)
        command:
            ['--default-authentication-plugin=mysql_native_password']
        #挂载目录
        volumes:
            #数据挂载
            - /home/project/cloud/data/mysql:/var/lib/mysql
            #同步系统时间
            - /etc/localtime:/etc/localtime:ro
        #容器名(一定要和项目连接数据库的配置名一样)
        container_name: fdfs-mysql
        #一直重启
        restart: always
        
    server-one:
        #容器构建
        build:
          #容器构建相对路径/绝对路径
          context: /home/project/cloud/server
          #指定构建的Dockerfile
          dockerfile: Dockerfile
        #容器启动镜像
        image: fdfs-server-one
        #容器启动时自定义的容器名称(一定要和注册服务的配置名一样)
        container_name: fdfs-server-one
        #容器所在网络
        networks:
            - cloud
        #容器映射端口
        ports:
            - "10000:10000"
        #提高当前用户在容器里面的权限
        privileged: true
        #挂载目录
        volumes:
            #持续集成
            - /home/project/cloud/server:/data
        #入口配置(启动配置和多环境配置)
        entrypoint: ["java","-Djava.security.edg=file:/dev/./urandom","-Dspring.profiles.active=server-one","-jar","/data/fastdfs-server.jar"]
     
        
    server-two:
        #容器构建
        build:
          #容器构建相对路径/绝对路径
          context: /home/project/cloud/server
          #指定构建的Dockerfile
          dockerfile: Dockerfile
        #容器启动镜像
        image: fdfs-server-two
        #容器启动时自定义的容器名称
        container_name: fdfs-server-two
        #容器所在网络
        networks:
            - cloud
        #容器映射端口
        ports:
            - "10001:10001"
        #提高当前用户在容器里面的权限
        privileged: true
        #挂载目录
        volumes:
            #持续集成
            - /home/project/cloud/server:/data
        #入口配置(启动配置和多环境配置)
        entrypoint: ["java","-Djava.security.edg=file:/dev/./urandom","-Dspring.profiles.active=server-two","-jar","/data/fastdfs-server.jar"]
        
    zuul:
        #容器构建
        build: 
            #容器构建相对路径/绝对路径
            context: /home/project/cloud/zuul
            #指定构建的Dockerfile
            dockerfile: Dockerfile
        #容器启动镜像
        image: fdfs-zuul
        ##容器启动时自定义的容器名称
        container_name: fdfs-zuul
        #容器所在网络
        networks:
            - cloud
        #容器映射端口   
        ports:
            - "10002:10002"
        #挂载目录
        volumes:
            #jar包挂载,持续集成
            - /home/project/cloud/zuul:/data
        #入口配置
        entrypoint: ["java","-Djava.security.edg=file:/dev/./urandom","-jar","/data/fastdfs-zuul.jar"]
        #依赖
        depends_on:
            - server-one
        
    feign:
        #容器构建
        build:
            #容器构建相对路径/绝对路径
            context: /home/project/cloud/feign
            #指定构建的Dockerfile
            dockerfile: Dockerfile
        #容器启动镜像
        image: fdfs-feign
        #容器启动时自定义的容器名称
        container_name: fdfs-feign
        #容器所在网络
        networks:
            - cloud
        #映射端口
        ports:
            - "10005:10005"
        #挂载目录
        volumes:
            - /home/project/cloud/feign:/data
        #入口配置
        entrypoint: ["java","-Djava.security.edg=file:/dev/./urandom","-jar","/data/fastdfs-feign.jar"]
        #依赖
        depends_on: 
            - server-one
        
    upload:
        #容器构建
        build:
            #容器构建相对路径/绝对路径
            context: /home/project/cloud/client/upload
            #指定构建的Dockerfile
            dockerfile: Dockerfile
        #容器启动镜像
        image: fdfs-upload
        container_name: fdfs-upload
        networks:
            - cloud
        ports:
            - "10003:10003"
        volumes:
            - /home/project/cloud/client/upload:/data
        entrypoint: ["java","-Djava.security.edg=file:/dev/./urandom","-jar","/data/fastdfs-upload.jar"]
        depends_on:
            - mysql
            - server-two
#定义网络   
networks:
    #网络名
    cloud:
        #有就使用,没有就会新建网络(默认bridge)
        external: true

1.Mysql 的镜像版本一定要注意
2.自定义网络一定要先创建好网络,这里是cloud,否则,会默认新建一个 文件名_网络名 这样名字的网络
3.容器构建路径和挂载路径一定要对,一定要,一定要!!
4.注意你自己的容器名和微服务的名字,一定要对得上,最好容器名=微服务名


  • 项目部署

    1. 将整个部署项目上传到服务器

在这里插入图片描述
    2. 当前docker-compose.yml目录下运行:docker-compose up -d
在这里插入图片描述
    3. 查看是否运行成功:docker ps -a
在这里插入图片描述

Logo

前往低代码交流专区

更多推荐