docker-compose demo例子,springboot、mysql、redis全部容器化一键启动

使用docker-compose,springboot、mysql、redis全部容器化一键启动,mysql数据挂载到宿主机持久化。

环境
jdk: 1.8
maven: 3.2
centos: 7
docker: 20.10.8
docker-compose: 1.29.2

代码(码云):
docker-compose-springboot-mysql-redis

贴上关键代码,全部代码见码云。

application.yml:

server:
  servlet:
    context-path: /dockercomposespringbootmysqlredis
# spring http端口
  port: 8899
  tomcat:
    uri-encoding: UTF-8
spring:
  application:
    name: dockercomposespringbootmysqlredis
  #SpringBoot2根据我们自定义的建表语句创建数据库表;在resources目录下创建schema.sql文件
  datasource:
    initialization-mode: always
    jpa:
      database: MySQL
      show-sql: true
      generate-ddl: true
      hibernate:
        ddl-auto: none
  profiles:
#   引入另外一个同路径下yml配置文件,该配置文件必须以application-开头
    active: pro
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
mybatis-plus:
  mapper-locations: classpath:com/hsj/mapper/xml/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  type-aliases-package: com.hsj.entity

springboot根路径:dockercomposespringbootmysqlredis,外网端口:8899,
SpringBoot2根据我们自定义的建表语句创建数据库表;在resources目录下创建schema.sql文件(docker-compose启动时候会自动创建表结构)

schema.sql:

/*
 Navicat Premium Data Transfer

 Date: 26/08/2021 12:56:08
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure
-- ----------------------------
CREATE TABLE IF NOT EXISTS `user`  (
    `id` bigint(64) NOT NULL COMMENT '主键',
    `tenant_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户ID',
    `code` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户编号',
    `user_type` int(2) NULL DEFAULT NULL COMMENT '用户平台',
    `account` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账号',
    `password` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',
    `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称',
    `real_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真名',
    `avatar` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像',
    `email` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
    `phone` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机',
    `birthday` datetime(0) NULL DEFAULT NULL COMMENT '生日',
    `sex` int(2) NULL DEFAULT NULL COMMENT '性别',
    `role_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色id',
    `dept_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门id',
    `post_id` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '岗位id',
    `create_user` bigint(64) NULL DEFAULT NULL COMMENT '创建人',
    `create_dept` bigint(64) NULL DEFAULT NULL COMMENT '创建部门',
    `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
    `update_user` bigint(64) NULL DEFAULT NULL COMMENT '修改人',
    `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
    `status` int(2) NULL DEFAULT NULL COMMENT '状态',
    `is_deleted` int(2) NULL DEFAULT 0 COMMENT '是否已删除',
    PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

在application.yml中,我们使用application-pro.yml进行部署,模拟生产环境:

  profiles:
#   引入另外一个同路径下yml配置文件,该配置文件必须以application-开头
    active: pro

application-pro.yml:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    #docker-compose方式启动MySQL,只需要指定host=mysql
    #docker 内部访问3306,Navicat外部访问3336
    url: jdbc:mysql://mysql:3306/docker-compose-springboot-mysql-redis?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
    username: root
    password: root
    initial-size: 3
    min-idle: 3
    max-active: 18
    max-wait: 60000
    time-between-eviction-runs-millis: 60000
    validation-query: SELECT 1 FROM DUAL
    filters: stat,wall,log4j
    # Hikari 连接池配置
    # 最小空闲连接数量
    hikari:
      minimum-idle: 5
      # 空闲连接存活最大时间,默认600000(10分钟)
      idle-timeout: 180000
      # 连接池最大连接数,默认是10
      maximum-pool-size: 10
      # 此属性控制从池返回的连接的默认自动提交行为,默认值:true
      auto-commit: true
      # 连接池名称
      pool-name: MyHikariCP
      # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
      max-lifetime: 1800000
      # 数据库连接超时时间,默认30秒,即30000
      connection-timeout: 30000
      connection-test-query: SELECT 1
  redis:
    #docker-compose方式启动redis,只需要指定host=redis
    host: redis
    #docker内部6379,Redis desk manager 外部是7379
    port: 6379
    password: root
    database: 0
    jedis:
      pool:
        min-idle: 0
        max-idle: 8
        max-active: 8
        max-wait: -1ms
    timeout: 1000ms


方便测试,mysql、Redis账号密码全部都是:root。重点在链接mysql和Redis的host处:
mysql url:

    #docker-compose方式启动MySQL,只需要指定host=mysql
    #docker 内部访问3306,Navicat外部访问3336
    url: jdbc:mysql://mysql:3306/docker-compose-springboot-mysql-redis?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
    

redis host:

    #docker-compose方式启动redis,只需要指定host=redis
    host: redis

发现不是ip,是名字,这是什么?原理就是docker的自定义网络,不知道的朋友请自己学习docker自定义网络。自定义的网络可以通过容器名称进行同一网络内部互相访问。docker-compose就是基于此。
看看docker-compose.yml吧,你会豁然开亮!上面mysqlredis不就是docker-compose的服务名称吗?

docker-compose.yml:

version: "3.9"
services:
  #指定服务名称mysql、redis
  mysql:
    #自己构建的镜像,参见:docker-entrypoint-initdb.d -> build.sh
#    image: mysql:V5.7.30
    image: mysql:5.7.30
    #指定容器名称
    container_name: dockercomposespringbootmysqlredis-mysql
    #restart: always
    #指定服务运行的端口
    ports :
      - "3336:3306"
    #指定容器的环境变量
    environment:
      #数据库密码
      - MYSQL_ROOT_PASSWORD=root
      #创建的库
      - MYSQL_DATABASE=docker-compose-springboot-mysql-redis
      #允许多IP连接数据库
      - MYSQL_ROOT_HOST=%
    #挂载数据卷
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf:/etc/mysql
#      - ./mysql/datad:/var/run/mysqld
      - ./mysql/datal:/var/log/mysql
  redis:
    #官方的Redis镜像image
    image: redis
    #指定容器名称
    container_name: dockercomposespringbootmysqlredis-redis
    #restart: always
    command: redis-server --requirepass root
    ports:
      - "7379:6379"
    #挂载数据卷
    #Redis 的密码需要自己在与容器共享的配置 redis.conf 中加入,即更改配置中 requirepass 为: requirepass yourpassword
    volumes:
      - ./redis/data:/data
  #指定服务名称
  springboot:
    # 镜像名:版本
    #自己构建的镜像,当前路径Dockerfile
    build: .
    #打包之后的镜像名字
    image: dockercomposespringbootmysqlredis:v1.0.0
    container_name: dockercomposespringbootmysqlredis-springboot
    #restart: always
    #指定服务运行的端口
    ports:
      - "8899:8899"
    #依赖的服务
    depends_on:
      - mysql
      - redis

springboot 依赖于mysql、redis启动之后才会启动:

    #依赖的服务
    depends_on:
      - mysql
      - redis

mysql和Redis我们直接使用官方的镜像,唯一的是springboot我们自己制作镜像,Dockerfile就是我们自己的springboot镜像:

    #自己构建的镜像,当前路径Dockerfile
    build: .
    #打包之后的镜像名字
    image: dockercomposespringbootmysqlredis:v1.0.0

最后:
start.sh脚本仅仅启动了docker-compose而已,

#!/bin/bash
docker-compose up
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker是一种容器解决方案,Docker Compose可以简多个容器的管理和部署流程。Nacos是一个用于服务发现、配置管理和动态DNS服务的开源平台。Node.js是一个基于JavaScript的开源、跨平台的运行时环境,用于构建可扩展的网络应用程序。MongoDB是一个高性能、文档型NoSQL数据库,适用于处理大量的结构和非结构数据。MySQL是一个开源的关系型数据库管理系统,用于存储和管理结构数据。Redis是一个基于内存的高性能键值存储系统,用于缓存和数据持久。Seata是一个开源的分布式事务解决方案,用于保证分布式系统中的数据一致性。 通过Docker Compose,我们可以轻松地将这些不同的组件和服务以容器的方式部署在一台或多台服务器上。我们可以使用Docker Compose的配置文件定义每个服务的镜像、端口映射、环境变量等设置。在这个场景中,我们可以将Nacos、Node.js、MongoDB、MySQLRedis和Seata分别作为独立的服务进行定义。 使用Docker Compose可以简部署过程,只需运行一个命令即可启动整个应用程序的容器群组。Docker会自动拉取和部署所需的镜像,启动容器,并通过网络连接各个服务。Nacos可以作为服务发现和配置中心,用于管理和注册各个服务的地址和配置信息。Node.js可以作为应用程序的后端逻辑进行开发,通过Nacos来发现和调用各个后端服务。MongoDB作为主要的数据存储,MySQLRedis可以作为辅助数据存储和缓存。Seata可以用于管理和控制分布式事务,确保数据一致性。 总之,使用Docker Compose可以方便地将Nacos、Node.js、MongoDB、MySQLRedis和Seata等组件集成在一起,并通过容器的方式进行部署。这样做可以极大地简应用程序的开发和部署过程,并提供高度可扩展的架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值