• docker笔记9:Docker-compose容器编排


    目录

    1.是什么?

    2. 能干嘛?

    3.去哪下?

    4.安装步骤 

    ​编辑

    5.卸载步骤 

     6.Compose核心概念

     6.1概念

    6.2 Compose常用命令 

     7.Compose编排微服务

    7.1改造升级微服务工程docker_boot

    7.2不用Compose

    7.2.1 单独的mysql容器实例

    7.3 swagger测试

    7.4上面成功了,有哪些问题?

    7.5 使用Compose

     7.5.1 编写docker-compose.yml文件

    7.5.2第二次修改微服务工程docker_boot

    7.5.3 Compose常用命令


     

    1.是什么?

    Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。

    Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

    2. 能干嘛?


     docker建议我们每一个容器中只运行一个服务,因为docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来但是这样我们又面临了一个问题?
     
    如果我需要同时部署好多个服务,难道要每个服务单独写Dockerfile然后在构建镜像,构建容器,这样累都累死了,所以docker官方给我们提供了docker-compose多服务部署的工具
     
    例如要实现一个Web微服务项目,除了Web服务容器本身,往往还需要再加上后端的数据库mysql服务容器,redis服务器,注册中心eureka,甚至还包括负载均衡容器等等。。。。。。
     
    Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
     
    可以很容易地用一个配置文件定义一个多容器的应用然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。
     

    3.去哪下?

    Compose file version 3 reference | Docker Docs

    Overview of installing Docker Compose | Docker Docs   下载

    4.安装步骤 

    1. curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    2. chmod +x /usr/local/bin/docker-compose
    3. docker-compose --version

    5.卸载步骤 

     6.Compose核心概念

     6.1概念

    docker-compose.yml

     服务(service):一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器

    工程(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

    Compose使用的三个步骤 :

    6.2 Compose常用命令 


    docker-compose -h                           # 查看帮助
    docker-compose up                           # 启动所有docker-compose服务
    docker-compose up -d                        # 启动所有docker-compose服务并后台运行
    docker-compose down                         # 停止并删除容器、网络、卷、镜像。
    docker-compose exec  yml里面的服务id                 # 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
    docker-compose ps                      # 展示当前docker-compose编排过的运行的所有容器
    docker-compose top                     # 展示当前docker-compose编排过的容器进程
     
    docker-compose logs  yml里面的服务id     # 查看容器输出日志
    docker-compose config     # 检查配置

     7.Compose编排微服务

    7.1改造升级微服务工程docker_boot

    以前的基础版

    SQL建表建库 

    1. CREATE TABLE `t_user` (
    2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    3. `username` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名',
    4. `password` varchar(50) NOT NULL DEFAULT '' COMMENT '密码',
    5. `sex` tinyint(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男 ',
    6. `deleted` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
    7. `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    8. `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    9. PRIMARY KEY (`id`)
    10. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户表'

     一键生成说明

    改POM

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0</modelVersion>
    5. <parent>
    6. <groupId>org.springframework.boot</groupId>
    7. <artifactId>spring-boot-starter-parent</artifactId>
    8. <version>2.5.6</version>
    9. <!--<version>2.3.10.RELEASE</version>-->
    10. <relativePath/> <!-- lookup parent from repository -->
    11. </parent>
    12. <groupId>com.atguigu.docker</groupId>
    13. <artifactId>docker_boot</artifactId>
    14. <version>0.0.1-SNAPSHOT</version>
    15. <properties>
    16. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    17. <maven.compiler.source>1.8</maven.compiler.source>
    18. <maven.compiler.target>1.8</maven.compiler.target>
    19. <junit.version>4.12</junit.version>
    20. <log4j.version>1.2.17</log4j.version>
    21. <lombok.version>1.16.18</lombok.version>
    22. <mysql.version>5.1.47</mysql.version>
    23. <druid.version>1.1.16</druid.version>
    24. <mapper.version>4.1.5</mapper.version>
    25. <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
    26. </properties>
    27. <dependencies>
    28. <!--guava Google 开源的 Guava 中自带的布隆过滤器-->
    29. <dependency>
    30. <groupId>com.google.guava</groupId>
    31. <artifactId>guava</artifactId>
    32. <version>23.0</version>
    33. </dependency>
    34. <!-- redisson -->
    35. <dependency>
    36. <groupId>org.redisson</groupId>
    37. <artifactId>redisson</artifactId>
    38. <version>3.13.4</version>
    39. </dependency>
    40. <!--SpringBoot通用依赖模块-->
    41. <dependency>
    42. <groupId>org.springframework.boot</groupId>
    43. <artifactId>spring-boot-starter-web</artifactId>
    44. </dependency>
    45. <dependency>
    46. <groupId>org.springframework.boot</groupId>
    47. <artifactId>spring-boot-starter-actuator</artifactId>
    48. </dependency>
    49. <!--swagger2-->
    50. <dependency>
    51. <groupId>io.springfox</groupId>
    52. <artifactId>springfox-swagger2</artifactId>
    53. <version>2.9.2</version>
    54. </dependency>
    55. <dependency>
    56. <groupId>io.springfox</groupId>
    57. <artifactId>springfox-swagger-ui</artifactId>
    58. <version>2.9.2</version>
    59. </dependency>
    60. <!--SpringBoot与Redis整合依赖-->
    61. <dependency>
    62. <groupId>org.springframework.boot</groupId>
    63. <artifactId>spring-boot-starter-data-redis</artifactId>
    64. </dependency>
    65. <!--springCache-->
    66. <dependency>
    67. <groupId>org.springframework.boot</groupId>
    68. <artifactId>spring-boot-starter-cache</artifactId>
    69. </dependency>
    70. <!--springCache连接池依赖包-->
    71. <dependency>
    72. <groupId>org.apache.commons</groupId>
    73. <artifactId>commons-pool2</artifactId>
    74. </dependency>
    75. <!-- jedis -->
    76. <dependency>
    77. <groupId>redis.clients</groupId>
    78. <artifactId>jedis</artifactId>
    79. <version>3.1.0</version>
    80. </dependency>
    81. <!--Mysql数据库驱动-->
    82. <dependency>
    83. <groupId>mysql</groupId>
    84. <artifactId>mysql-connector-java</artifactId>
    85. <version>5.1.47</version>
    86. </dependency>
    87. <!--SpringBoot集成druid连接池-->
    88. <dependency>
    89. <groupId>com.alibaba</groupId>
    90. <artifactId>druid-spring-boot-starter</artifactId>
    91. <version>1.1.10</version>
    92. </dependency>
    93. <dependency>
    94. <groupId>com.alibaba</groupId>
    95. <artifactId>druid</artifactId>
    96. <version>${druid.version}</version>
    97. </dependency>
    98. <!--mybatis和springboot整合-->
    99. <dependency>
    100. <groupId>org.mybatis.spring.boot</groupId>
    101. <artifactId>mybatis-spring-boot-starter</artifactId>
    102. <version>${mybatis.spring.boot.version}</version>
    103. </dependency>
    104. <!-- 添加springboot对amqp的支持 -->
    105. <dependency>
    106. <groupId>org.springframework.boot</groupId>
    107. <artifactId>spring-boot-starter-amqp</artifactId>
    108. </dependency>
    109. <dependency>
    110. <groupId>commons-codec</groupId>
    111. <artifactId>commons-codec</artifactId>
    112. <version>1.10</version>
    113. </dependency>
    114. <!--通用基础配置junit/devtools/test/log4j/lombok/hutool-->
    115. <!--hutool-->
    116. <dependency>
    117. <groupId>cn.hutool</groupId>
    118. <artifactId>hutool-all</artifactId>
    119. <version>5.2.3</version>
    120. </dependency>
    121. <dependency>
    122. <groupId>junit</groupId>
    123. <artifactId>junit</artifactId>
    124. <version>${junit.version}</version>
    125. </dependency>
    126. <dependency>
    127. <groupId>org.springframework.boot</groupId>
    128. <artifactId>spring-boot-devtools</artifactId>
    129. <scope>runtime</scope>
    130. <optional>true</optional>
    131. </dependency>
    132. <dependency>
    133. <groupId>org.springframework.boot</groupId>
    134. <artifactId>spring-boot-starter-test</artifactId>
    135. <scope>test</scope>
    136. </dependency>
    137. <dependency>
    138. <groupId>log4j</groupId>
    139. <artifactId>log4j</artifactId>
    140. <version>${log4j.version}</version>
    141. </dependency>
    142. <dependency>
    143. <groupId>org.projectlombok</groupId>
    144. <artifactId>lombok</artifactId>
    145. <version>${lombok.version}</version>
    146. <optional>true</optional>
    147. </dependency>
    148. <!--persistence-->
    149. <dependency>
    150. <groupId>javax.persistence</groupId>
    151. <artifactId>persistence-api</artifactId>
    152. <version>1.0.2</version>
    153. </dependency>
    154. <!--通用Mapper-->
    155. <dependency>
    156. <groupId>tk.mybatis</groupId>
    157. <artifactId>mapper</artifactId>
    158. <version>${mapper.version}</version>
    159. </dependency>
    160. </dependencies>
    161. <build>
    162. <plugins>
    163. <plugin>
    164. <groupId>org.springframework.boot</groupId>
    165. <artifactId>spring-boot-maven-plugin</artifactId>
    166. </plugin>
    167. <plugin>
    168. <groupId>org.apache.maven.plugins</groupId>
    169. <artifactId>maven-resources-plugin</artifactId>
    170. <version>3.1.0</version>
    171. </plugin>
    172. </plugins>
    173. </build>
    174. </project>

    写YML

    1. server.port=6001
    2. # ========================alibaba.druid相关配置=====================
    3. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    4. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    5. spring.datasource.url=jdbc:mysql://192.168.111.169:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
    6. spring.datasource.username=root
    7. spring.datasource.password=123456
    8. spring.datasource.druid.test-while-idle=false
    9. # ========================redis相关配置=====================
    10. spring.redis.database=0
    11. spring.redis.host=192.168.111.169
    12. spring.redis.port=6379
    13. spring.redis.password=
    14. spring.redis.lettuce.pool.max-active=8
    15. spring.redis.lettuce.pool.max-wait=-1ms
    16. spring.redis.lettuce.pool.max-idle=8
    17. spring.redis.lettuce.pool.min-idle=0
    18. # ========================mybatis相关配置===================
    19. mybatis.mapper-locations=classpath:mapper/*.xml
    20. mybatis.type-aliases-package=com.atguigu.docker.entities
    21. # ========================swagger=====================
    22. spring.swagger2.enabled=true

     主启动

    1. package com.atguigu.docker;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. import tk.mybatis.spring.annotation.MapperScan;
    5. @SpringBootApplication
    6. @MapperScan("com.atguigu.docker.mapper") //import tk.mybatis.spring.annotation.MapperScan;
    7. public class DockerBootApplication
    8. {
    9. public static void main(String[] args)
    10. {
    11. SpringApplication.run(DockerBootApplication.class, args);
    12. }
    13. }

     业务类

     config配置类

    RedisConfig

    1. package com.atguigu.docker.config;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.springframework.context.annotation.Bean;
    4. import org.springframework.context.annotation.Configuration;
    5. import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
    6. import org.springframework.data.redis.core.RedisTemplate;
    7. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
    8. import org.springframework.data.redis.serializer.StringRedisSerializer;
    9. import java.io.Serializable;
    10. /**
    11. * @auther zzyy
    12. * @create 2021-10-27 17:19
    13. */
    14. @Configuration
    15. @Slf4j
    16. public class RedisConfig
    17. {
    18. /**
    19. * @param lettuceConnectionFactory
    20. * @return
    21. *
    22. * redis序列化的工具配置类,下面这个请一定开启配置
    23. * 127.0.0.1:6379> keys *
    24. * 1) "ord:102" 序列化过
    25. * 2) "\xac\xed\x00\x05t\x00\aord:102" 野生,没有序列化过
    26. */
    27. @Bean
    28. public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory)
    29. {
    30. RedisTemplate redisTemplate = new RedisTemplate<>();
    31. redisTemplate.setConnectionFactory(lettuceConnectionFactory);
    32. //设置key序列化方式string
    33. redisTemplate.setKeySerializer(new StringRedisSerializer());
    34. //设置value的序列化方式json
    35. redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    36. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    37. redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    38. redisTemplate.afterPropertiesSet();
    39. return redisTemplate;
    40. }
    41. }

     SwaggerConfig

    1. package com.atguigu.docker.config;
    2. import org.springframework.beans.factory.annotation.Value;
    3. import org.springframework.context.annotation.Bean;
    4. import org.springframework.context.annotation.Configuration;
    5. import springfox.documentation.builders.ApiInfoBuilder;
    6. import springfox.documentation.builders.PathSelectors;
    7. import springfox.documentation.builders.RequestHandlerSelectors;
    8. import springfox.documentation.service.ApiInfo;
    9. import springfox.documentation.spi.DocumentationType;
    10. import springfox.documentation.spring.web.plugins.Docket;
    11. import springfox.documentation.swagger2.annotations.EnableSwagger2;
    12. import java.text.SimpleDateFormat;
    13. import java.util.Date;
    14. /**
    15. * @auther zzyy
    16. * @create 2021-05-01 16:18
    17. */
    18. @Configuration
    19. @EnableSwagger2
    20. public class SwaggerConfig
    21. {
    22. @Value("${spring.swagger2.enabled}")
    23. private Boolean enabled;
    24. @Bean
    25. public Docket createRestApi() {
    26. return new Docket(DocumentationType.SWAGGER_2)
    27. .apiInfo(apiInfo())
    28. .enable(enabled)
    29. .select()
    30. .apis(RequestHandlerSelectors.basePackage("com.atguigu.docker")) //你自己的package
    31. .paths(PathSelectors.any())
    32. .build();
    33. }
    34. public ApiInfo apiInfo() {
    35. return new ApiInfoBuilder()
    36. .title("尚硅谷Java大厂技术"+"\t"+new SimpleDateFormat("yyyy-MM-dd").format(new Date()))
    37. .description("docker-compose")
    38. .version("1.0")
    39. .termsOfServiceUrl("https://www.atguigu.com/")
    40. .build();
    41. }
    42. }

    新建entity  User    ,UserDTO

    1. package com.atguigu.docker.entities;
    2. import javax.persistence.Column;
    3. import javax.persistence.GeneratedValue;
    4. import javax.persistence.Id;
    5. import javax.persistence.Table;
    6. import java.util.Date;
    7. @Table(name = "t_user")
    8. public class User
    9. {
    10. @Id
    11. @GeneratedValue(generator = "JDBC")
    12. private Integer id;
    13. /**
    14. * 用户名
    15. */
    16. private String username;
    17. /**
    18. * 密码
    19. */
    20. private String password;
    21. /**
    22. * 性别 0=女 1=男
    23. */
    24. private Byte sex;
    25. /**
    26. * 删除标志,默认0不删除,1删除
    27. */
    28. private Byte deleted;
    29. /**
    30. * 更新时间
    31. */
    32. @Column(name = "update_time")
    33. private Date updateTime;
    34. /**
    35. * 创建时间
    36. */
    37. @Column(name = "create_time")
    38. private Date createTime;
    39. /**
    40. * @return id
    41. */
    42. public Integer getId() {
    43. return id;
    44. }
    45. /**
    46. * @param id
    47. */
    48. public void setId(Integer id) {
    49. this.id = id;
    50. }
    51. /**
    52. * 获取用户名
    53. *
    54. * @return username - 用户名
    55. */
    56. public String getUsername() {
    57. return username;
    58. }
    59. /**
    60. * 设置用户名
    61. *
    62. * @param username 用户名
    63. */
    64. public void setUsername(String username) {
    65. this.username = username;
    66. }
    67. /**
    68. * 获取密码
    69. *
    70. * @return password - 密码
    71. */
    72. public String getPassword() {
    73. return password;
    74. }
    75. /**
    76. * 设置密码
    77. *
    78. * @param password 密码
    79. */
    80. public void setPassword(String password) {
    81. this.password = password;
    82. }
    83. /**
    84. * 获取性别 0=女 1=男
    85. *
    86. * @return sex - 性别 0=女 1=男
    87. */
    88. public Byte getSex() {
    89. return sex;
    90. }
    91. /**
    92. * 设置性别 0=女 1=男
    93. *
    94. * @param sex 性别 0=女 1=男
    95. */
    96. public void setSex(Byte sex) {
    97. this.sex = sex;
    98. }
    99. /**
    100. * 获取删除标志,默认0不删除,1删除
    101. *
    102. * @return deleted - 删除标志,默认0不删除,1删除
    103. */
    104. public Byte getDeleted() {
    105. return deleted;
    106. }
    107. /**
    108. * 设置删除标志,默认0不删除,1删除
    109. *
    110. * @param deleted 删除标志,默认0不删除,1删除
    111. */
    112. public void setDeleted(Byte deleted) {
    113. this.deleted = deleted;
    114. }
    115. /**
    116. * 获取更新时间
    117. *
    118. * @return update_time - 更新时间
    119. */
    120. public Date getUpdateTime() {
    121. return updateTime;
    122. }
    123. /**
    124. * 设置更新时间
    125. *
    126. * @param updateTime 更新时间
    127. */
    128. public void setUpdateTime(Date updateTime) {
    129. this.updateTime = updateTime;
    130. }
    131. /**
    132. * 获取创建时间
    133. *
    134. * @return create_time - 创建时间
    135. */
    136. public Date getCreateTime() {
    137. return createTime;
    138. }
    139. /**
    140. * 设置创建时间
    141. *
    142. * @param createTime 创建时间
    143. */
    144. public void setCreateTime(Date createTime) {
    145. this.createTime = createTime;
    146. }
    147. }

    1. package com.atguigu.docker.entities;
    2. import io.swagger.annotations.ApiModel;
    3. import io.swagger.annotations.ApiModelProperty;
    4. import lombok.AllArgsConstructor;
    5. import lombok.Data;
    6. import lombok.NoArgsConstructor;
    7. import java.io.Serializable;
    8. import java.util.Date;
    9. @NoArgsConstructor
    10. @AllArgsConstructor
    11. @Data
    12. @ApiModel(value = "用户信息")
    13. public class UserDTO implements Serializable
    14. {
    15. @ApiModelProperty(value = "用户ID")
    16. private Integer id;
    17. @ApiModelProperty(value = "用户名")
    18. private String username;
    19. @ApiModelProperty(value = "密码")
    20. private String password;
    21. @ApiModelProperty(value = "性别 0=女 1=男 ")
    22. private Byte sex;
    23. @ApiModelProperty(value = "删除标志,默认0不删除,1删除")
    24. private Byte deleted;
    25. @ApiModelProperty(value = "更新时间")
    26. private Date updateTime;
    27. @ApiModelProperty(value = "创建时间")
    28. private Date createTime;
    29. /**
    30. * @return id
    31. */
    32. public Integer getId() {
    33. return id;
    34. }
    35. /**
    36. * @param id
    37. */
    38. public void setId(Integer id) {
    39. this.id = id;
    40. }
    41. /**
    42. * 获取用户名
    43. *
    44. * @return username - 用户名
    45. */
    46. public String getUsername() {
    47. return username;
    48. }
    49. /**
    50. * 设置用户名
    51. *
    52. * @param username 用户名
    53. */
    54. public void setUsername(String username) {
    55. this.username = username;
    56. }
    57. /**
    58. * 获取密码
    59. *
    60. * @return password - 密码
    61. */
    62. public String getPassword() {
    63. return password;
    64. }
    65. /**
    66. * 设置密码
    67. *
    68. * @param password 密码
    69. */
    70. public void setPassword(String password) {
    71. this.password = password;
    72. }
    73. /**
    74. * 获取性别 0=女 1=男
    75. *
    76. * @return sex - 性别 0=女 1=男
    77. */
    78. public Byte getSex() {
    79. return sex;
    80. }
    81. /**
    82. * 设置性别 0=女 1=男
    83. *
    84. * @param sex 性别 0=女 1=男
    85. */
    86. public void setSex(Byte sex) {
    87. this.sex = sex;
    88. }
    89. /**
    90. * 获取删除标志,默认0不删除,1删除
    91. *
    92. * @return deleted - 删除标志,默认0不删除,1删除
    93. */
    94. public Byte getDeleted() {
    95. return deleted;
    96. }
    97. /**
    98. * 设置删除标志,默认0不删除,1删除
    99. *
    100. * @param deleted 删除标志,默认0不删除,1删除
    101. */
    102. public void setDeleted(Byte deleted) {
    103. this.deleted = deleted;
    104. }
    105. /**
    106. * 获取更新时间
    107. *
    108. * @return update_time - 更新时间
    109. */
    110. public Date getUpdateTime() {
    111. return updateTime;
    112. }
    113. /**
    114. * 设置更新时间
    115. *
    116. * @param updateTime 更新时间
    117. */
    118. public void setUpdateTime(Date updateTime) {
    119. this.updateTime = updateTime;
    120. }
    121. /**
    122. * 获取创建时间
    123. *
    124. * @return create_time - 创建时间
    125. */
    126. public Date getCreateTime() {
    127. return createTime;
    128. }
    129. /**
    130. * 设置创建时间
    131. *
    132. * @param createTime 创建时间
    133. */
    134. public void setCreateTime(Date createTime) {
    135. this.createTime = createTime;
    136. }
    137. @Override
    138. public String toString() {
    139. return "User{" +
    140. "id=" + id +
    141. ", username='" + username + '\'' +
    142. ", password='" + password + '\'' +
    143. ", sex=" + sex +
    144. '}';
    145. }
    146. }

    新建mapper

    新建接口UserMapper 

    1. package com.atguigu.docker.mapper;
    2. import com.atguigu.docker.entities.User;
    3. import tk.mybatis.mapper.common.Mapper;
    4. public interface UserMapper extends Mapper {
    5. }

    src\main\resources路径下新建mapper文件夹并新增UserMapper.xml

    1. "1.0" encoding="UTF-8"?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.atguigu.docker.mapper.UserMapper">
    4. <resultMap id="BaseResultMap" type="com.atguigu.docker.entities.User">
    5. <id column="id" jdbcType="INTEGER" property="id" />
    6. <result column="username" jdbcType="VARCHAR" property="username" />
    7. <result column="password" jdbcType="VARCHAR" property="password" />
    8. <result column="sex" jdbcType="TINYINT" property="sex" />
    9. <result column="deleted" jdbcType="TINYINT" property="deleted" />
    10. <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
    11. <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    12. resultMap>
    13. mapper>

    新建service

    1. package com.atguigu.docker.service;
    2. import com.atguigu.docker.entities.User;
    3. import com.atguigu.docker.mapper.UserMapper;
    4. import lombok.extern.slf4j.Slf4j;
    5. import org.slf4j.Logger;
    6. import org.slf4j.LoggerFactory;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.data.redis.core.RedisTemplate;
    9. import org.springframework.data.redis.core.ValueOperations;
    10. import org.springframework.stereotype.Service;
    11. import org.springframework.web.bind.annotation.PathVariable;
    12. import javax.annotation.Resource;
    13. import java.util.concurrent.TimeUnit;
    14. /**
    15. * @auther zzyy
    16. * @create 2021-05-01 14:58
    17. */
    18. @Service
    19. @Slf4j
    20. public class UserService {
    21. public static final String CACHE_KEY_USER = "user:";
    22. @Resource
    23. private UserMapper userMapper;
    24. @Resource
    25. private RedisTemplate redisTemplate;
    26. /**
    27. * addUser
    28. * @param user
    29. */
    30. public void addUser(User user)
    31. {
    32. //1 先插入mysql并成功
    33. int i = userMapper.insertSelective(user);
    34. if(i > 0)
    35. {
    36. //2 需要再次查询一下mysql将数据捞回来并ok
    37. user = userMapper.selectByPrimaryKey(user.getId());
    38. //3 将捞出来的user存进redis,完成新增功能的数据一致性。
    39. String key = CACHE_KEY_USER+user.getId();
    40. redisTemplate.opsForValue().set(key,user);
    41. }
    42. }
    43. /**
    44. * findUserById
    45. * @param id
    46. * @return
    47. */
    48. public User findUserById(Integer id)
    49. {
    50. User user = null;
    51. String key = CACHE_KEY_USER+id;
    52. //1 先从redis里面查询,如果有直接返回结果,如果没有再去查询mysql
    53. user = (User) redisTemplate.opsForValue().get(key);
    54. if(user == null)
    55. {
    56. //2 redis里面无,继续查询mysql
    57. user = userMapper.selectByPrimaryKey(id);
    58. if(user == null)
    59. {
    60. //3.1 redis+mysql 都无数据
    61. //你具体细化,防止多次穿透,我们规定,记录下导致穿透的这个key回写redis
    62. return user;
    63. }else{
    64. //3.2 mysql有,需要将数据写回redis,保证下一次的缓存命中率
    65. redisTemplate.opsForValue().set(key,user);
    66. }
    67. }
    68. return user;
    69. }
    70. }

    新建controller

    1. package com.atguigu.docker.controller;
    2. import cn.hutool.core.util.IdUtil;
    3. import cn.hutool.core.util.ReferenceUtil;
    4. import com.atguigu.docker.entities.User;
    5. import com.atguigu.docker.entities.UserDTO;
    6. import com.atguigu.docker.service.UserService;
    7. import io.swagger.annotations.Api;
    8. import io.swagger.annotations.ApiOperation;
    9. import io.swagger.models.auth.In;
    10. import lombok.extern.slf4j.Slf4j;
    11. import org.springframework.beans.BeanUtils;
    12. import org.springframework.beans.factory.annotation.Autowired;
    13. import org.springframework.web.bind.annotation.*;
    14. import javax.annotation.Resource;
    15. import java.util.Random;
    16. /**
    17. * @auther zzyy
    18. * @create 2021-05-01 15:02
    19. */
    20. @Api(description = "用户User接口")
    21. @RestController
    22. @Slf4j
    23. public class UserController
    24. {
    25. @Resource
    26. private UserService userService;
    27. @ApiOperation("数据库新增3条记录")
    28. @RequestMapping(value = "/user/add",method = RequestMethod.POST)
    29. public void addUser()
    30. {
    31. for (int i = 1; i <=3; i++) {
    32. User user = new User();
    33. user.setUsername("zzyy"+i);
    34. user.setPassword(IdUtil.simpleUUID().substring(0,6));
    35. user.setSex((byte) new Random().nextInt(2));
    36. userService.addUser(user);
    37. }
    38. }
    39. @ApiOperation("删除1条记录")
    40. @RequestMapping(value = "/user/delete/{id}",method = RequestMethod.POST)
    41. public void deleteUser(@PathVariable Integer id)
    42. {
    43. userService.deleteUser(id);
    44. }
    45. @ApiOperation("修改1条记录")
    46. @RequestMapping(value = "/user/update",method = RequestMethod.POST)
    47. public void updateUser(@RequestBody UserDTO userDTO)
    48. {
    49. User user = new User();
    50. BeanUtils.copyProperties(userDTO,user);
    51. userService.updateUser(user);
    52. }
    53. @ApiOperation("查询1条记录")
    54. @RequestMapping(value = "/user/find/{id}",method = RequestMethod.GET)
    55. public User findUserById(@PathVariable Integer id)
    56. {
    57. return userService.findUserById2(id);
    58. }
    59. }

     mvn package命令将微服务形成新的jar包
    并上传到Linux服务器/mydocker目录下

     编写Dockerfile

    1. # 基础镜像使用java
    2. FROM java:8
    3. # 作者
    4. MAINTAINER zzyy
    5. # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
    6. VOLUME /tmp
    7. # 将jar包添加到容器中并更名为zzyy_docker.jar
    8. ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
    9. # 运行jar包
    10. RUN bash -c 'touch /zzyy_docker.jar'
    11. ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
    12. #暴露6001端口作为微服务
    13. EXPOSE 6001

    构建镜像

    docker build -t zzyy_docker:1.6 .

    7.2不用Compose

    7.2.1 单独的mysql容器实例

    新建mysql容器实例

    docker run -p 3306:3306 --name mysql57 --privileged=true -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

    进入mysql容器实例并新建库db2021+新建表t_user

    1.  docker exec -it mysql57 /bin/bash
    2. mysql -uroot -p
    3. create database db2021;
    4. use db2021;
    5. CREATE TABLE `t_user` (
    6. `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    7. `username` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户名',
    8. `password` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '密码',
    9. `sex` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男 ',
    10. `deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
    11. `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    12. `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    13. PRIMARY KEY (`id`)
    14. ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

    单独的redis容器实例

    docker run  -p 6379:6379 --name redis608 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

    微服务工程

     docker run -d -p 6001:6001 zzyy_docker:1.6

     上面三个容器实例依次顺序启动成功

    7.3 swagger测试

    http://localhost:你的微服务端口/swagger-ui.html#/


     

    7.4上面成功了,有哪些问题?

    7.5 使用Compose

     7.5.1 编写docker-compose.yml文件

    1. version: "3"
    2. services:
    3. microService:
    4. image: zzyy_docker:1.6
    5. container_name: ms01
    6. ports:
    7. - "6001:6001"
    8. volumes:
    9. - /app/microService:/data
    10. networks:
    11. - atguigu_net
    12. depends_on:
    13. - redis
    14. - mysql
    15. redis:
    16. image: redis:6.0.8
    17. ports:
    18. - "6379:6379"
    19. volumes:
    20. - /app/redis/redis.conf:/etc/redis/redis.conf
    21. - /app/redis/data:/data
    22. networks:
    23. - atguigu_net
    24. command: redis-server /etc/redis/redis.conf
    25. mysql:
    26. image: mysql:5.7
    27. environment:
    28. MYSQL_ROOT_PASSWORD: '123456'
    29. MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
    30. MYSQL_DATABASE: 'db2021'
    31. MYSQL_USER: 'zzyy'
    32. MYSQL_PASSWORD: 'zzyy123'
    33. ports:
    34. - "3306:3306"
    35. volumes:
    36. - /app/mysql/db:/var/lib/mysql
    37. - /app/mysql/conf/my.cnf:/etc/my.cnf
    38. - /app/mysql/init:/docker-entrypoint-initdb.d
    39. networks:
    40. - atguigu_net
    41. command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
    42. networks:
    43. atguigu_net:

    7.5.2第二次修改微服务工程docker_boot

     写YML

    1. server.port=6001
    2. # ========================alibaba.druid相关配置=====================
    3. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    4. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    5. #spring.datasource.url=jdbc:mysql://192.168.111.169:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
    6. spring.datasource.url=jdbc:mysql://mysql:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
    7. spring.datasource.username=root
    8. spring.datasource.password=123456
    9. spring.datasource.druid.test-while-idle=false
    10. # ========================redis相关配置=====================
    11. spring.redis.database=0
    12. #spring.redis.host=192.168.111.169
    13. spring.redis.host=redis
    14. spring.redis.port=6379
    15. spring.redis.password=
    16. spring.redis.lettuce.pool.max-active=8
    17. spring.redis.lettuce.pool.max-wait=-1ms
    18. spring.redis.lettuce.pool.max-idle=8
    19. spring.redis.lettuce.pool.min-idle=0
    20. # ========================mybatis相关配置===================
    21. mybatis.mapper-locations=classpath:mapper/*.xml
    22. mybatis.type-aliases-package=com.atguigu.docker.entities
    23. # ========================swagger=====================
    24. spring.swagger2.enabled=true

     mvn package命令将微服务形成新的jar包
    并上传到Linux服务器/mydocker目录下

    编写Dockerfile

    1. # 基础镜像使用java
    2. FROM java:8
    3. # 作者
    4. MAINTAINER zzyy
    5. # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
    6. VOLUME /tmp
    7. # 将jar包添加到容器中并更名为zzyy_docker.jar
    8. ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
    9. # 运行jar包
    10. RUN bash -c 'touch /zzyy_docker.jar'
    11. ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
    12. #暴露6001端口作为微服务
    13. EXPOSE 6001

     构建镜像

    docker build -t zzyy_docker:1.6 .
    1. 执行 docker-compose up
    2. 或者
    3. 执行 docker-compose up -d

    进入mysql容器实例并新建库db2021+新建表t_user 

    1. mysql -uroot -p
    2. create database db2021;
    3. use db2021;
    4. CREATE TABLE `t_user` (
    5. `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    6. `username` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '用户名',
    7. `password` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '密码',
    8. `sex` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '性别 0=女 1=男 ',
    9. `deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '删除标志,默认0不删除,1删除',
    10. `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    11. `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    12. PRIMARY KEY (`id`)
    13. ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

    7.5.3 Compose常用命令


    docker-compose -h                           # 查看帮助
    docker-compose up                           # 启动所有docker-compose服务
    docker-compose up -d                        # 启动所有docker-compose服务并后台运行
    docker-compose down                         # 停止并删除容器、网络、卷、镜像。
    docker-compose exec  yml里面的服务id                 # 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
    docker-compose ps                      # 展示当前docker-compose编排过的运行的所有容器
    docker-compose top                     # 展示当前docker-compose编排过的容器进程
     
    docker-compose logs  yml里面的服务id     # 查看容器输出日志
    dokcer-compose config     # 检查配置
    dokcer-compose config -q  # 检查配置,有问题才有输出
    docker-compose restart   # 重启服务
    docker-compose start     # 启动服务
    docker-compose stop      # 停止服务 

    docker-compose stop      # 停止服务 

  • 相关阅读:
    模型案例推荐:电力大数据项目案例模型分享
    计算机毕业设计 SSM+Vue美容院管理系统 美容护理管理系统 美容店系统管理Java Vue MySQL数据库 远程调试 代码讲解
    TwinCAT3示波器中添加X轴和Y轴的游标
    【JVM】G1垃圾收集器知多少
    Docker基础篇之快速上手
    通过profibus PA转Modbus rtu协议网关把RTU数据传到pa设备上
    【Day27】输入输出流一
    浅论供水管理中产销差率与漏水率的比较和应用
    基于Java毕业设计智能化管理的仓库管理源码+系统+mysql+lw文档+部署软件
    【数据机构】最小生成树(prim算法)
  • 原文地址:https://blog.csdn.net/oDianZi1234567/article/details/132656927