docker-compose容器编排


1、是什么?

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、下载与安装步骤

docker-compose官网:https://docs.docker.com/compose/compose-file/compose-file-v3/

官网下载:https://docs.docker.com/compose/install/

3.1 安装步骤

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

3.2 卸载

如果您使用以下方式安装 Docker Compose,请卸载curl

  sudo rm /usr/local/bin/docker-compose

4、Compose核心概念


1、文件:docker-compose.yml

2、两个要素

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

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

5、Compose使用的三个步骤

  • 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件

  • 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。

  • 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线

6、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     # 检查配置
 docker-compose config -q # 检查配置,有问题才有输出
 docker-compose restart   # 重启服务
 docker-compose start     # 启动服务
 docker-compose stop     # 停止服务

7、Compose编排微服务

7.1 微服务工程docker_boot

7.1.1 微服务工程相关文件如下

sql建表建库

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

pom.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.5.6</version>
         <relativePath/> <!-- lookup parent from repository -->
     </parent>
     <groupId>com.atguigu.docker</groupId>
     <artifactId>docker_boot</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <name>docker_boot</name>
     <description>Demo project for Spring Boot</description>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
         <junit.version>4.12</junit.version>
         <log4j.version>1.2.17</log4j.version>
         <lombok.version>1.16.18</lombok.version>
         <mysql.version>5.1.47</mysql.version>
         <druid.version>1.1.16</druid.version>
         <mapper.version>4.1.5</mapper.version>
         <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
 
         <mybatis-plus.version>3.0.5</mybatis-plus.version>
         <velocity.version>2.0</velocity.version>
     </properties>
 
     <dependencies>
         <!--guava Google 开源的 Guava 中自带的布隆过滤器-->
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
             <version>23.0</version>
         </dependency>
         <!-- redisson -->
         <dependency>
             <groupId>org.redisson</groupId>
             <artifactId>redisson</artifactId>
             <version>3.13.4</version>
         </dependency>
         <!--SpringBoot通用依赖模块-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-actuator</artifactId>
         </dependency>
         <!--swagger2-->
         <dependency>
             <groupId>io.springfox</groupId>
             <artifactId>springfox-swagger2</artifactId>
             <version>2.9.2</version>
         </dependency>
         <dependency>
             <groupId>io.springfox</groupId>
             <artifactId>springfox-swagger-ui</artifactId>
             <version>2.9.2</version>
         </dependency>
         <!--SpringBoot与Redis整合依赖-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
         <!--springCache-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-cache</artifactId>
         </dependency>
         <!--springCache连接池依赖包-->
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-pool2</artifactId>
         </dependency>
         <!-- jedis -->
         <dependency>
             <groupId>redis.clients</groupId>
             <artifactId>jedis</artifactId>
             <version>3.1.0</version>
         </dependency>
         <!--Mysql数据库驱动-->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>5.1.47</version>
         </dependency>
         <!--SpringBoot集成druid连接池-->
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>druid-spring-boot-starter</artifactId>
             <version>1.1.10</version>
         </dependency>
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>druid</artifactId>
             <version>${druid.version}</version>
         </dependency>
         <!--mybatis和springboot整合-->
         <dependency>
             <groupId>org.mybatis.spring.boot</groupId>
             <artifactId>mybatis-spring-boot-starter</artifactId>
             <version>${mybatis.spring.boot.version}</version>
         </dependency>
         <!-- 添加springboot对amqp的支持 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-amqp</artifactId>
         </dependency>
         <dependency>
             <groupId>commons-codec</groupId>
             <artifactId>commons-codec</artifactId>
             <version>1.10</version>
         </dependency>
         <!--通用基础配置junit/devtools/test/log4j/lombok/hutool-->
         <!--hutool-->
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
             <version>5.2.3</version>
         </dependency>
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <version>${junit.version}</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-devtools</artifactId>
             <scope>runtime</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>log4j</groupId>
             <artifactId>log4j</artifactId>
             <version>${log4j.version}</version>
         </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
             <version>${lombok.version}</version>
             <optional>true</optional>
         </dependency>
         <!--persistence-->
         <dependency>
             <groupId>javax.persistence</groupId>
             <artifactId>persistence-api</artifactId>
             <version>1.0.2</version>
         </dependency>
         <!--通用Mapper-->
         <dependency>
             <groupId>tk.mybatis</groupId>
             <artifactId>mapper</artifactId>
             <version>${mapper.version}</version>
         </dependency>
 
         <!--mybatis-plus 持久层-->
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>
             <version>${mybatis-plus.version}</version>
         </dependency>
 
         <!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 -->
         <dependency>
             <groupId>org.apache.velocity</groupId>
             <artifactId>velocity-engine-core</artifactId>
             <version>${velocity.version}</version>
         </dependency>
     </dependencies>
 
 
 
     <build>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
         </plugins>
     </build>
 
 </project>

redis配置类

 @Configuration
 @Slf4j
 public class RedisConfig {
     /**
      *
      * @param lettuceConnectionFactory
      * @return
      * redis序列化的工具配置类,下面这个请一定要开启配置
      * 127.0.0.1:6379>keys *
      * 1)"ord:102" 序列化过
      * 2)"xacxedx00x05tx00aord:102" 野生,没有序列化过
      */
     @Bean
     public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
 
         RedisTemplate<String,Serializable> redisTemplate=new RedisTemplate<>();
         redisTemplate.setConnectionFactory(lettuceConnectionFactory);
         //设置Key序列化方式string
         redisTemplate.setKeySerializer(new StringRedisSerializer());
         //设置value的序列化方式json
         redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
 
         redisTemplate.setHashKeySerializer(new StringRedisSerializer());
         redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
 
         redisTemplate.afterPropertiesSet();
 
         return redisTemplate;
    }
 }

swagger配置类

 @Configuration  //配置类
 @EnableSwagger2 //swagger注解
 public class SwaggerConfig {
     @Value("${spring.swagger2.enabled}")
     private Boolean enabled;
 
     @Bean
     public Docket createRestApi(){
         return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .enable(enabled)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.atguigu.docker.docker_boot"))
                .paths(PathSelectors.any())
                .build();
    }
     public ApiInfo apiInfo(){
         return new ApiInfoBuilder()
                .title("尚硅谷java大厂技术")
                .description("docker-compose")
                .version("1.0")
                .termsOfServiceUrl("http://www.atguigu.com/")
                .build();
    }
 }

application.properties

 server.port=6001
 # ========================alibaba.druid相关配置=====================
 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 spring.datasource.url=jdbc:mysql://192.168.159.33:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
 spring.datasource.username=root
 spring.datasource.password=123456
 spring.datasource.druid.test-while-idle=false
 # ========================redis相关配置=====================
 spring.redis.database=0
 spring.redis.host=192.168.159.33
 spring.redis.port=6379
 spring.redis.password=
 spring.redis.lettuce.pool.max-active=8
 spring.redis.lettuce.pool.max-wait=-1ms
 spring.redis.lettuce.pool.max-idle=8
 spring.redis.lettuce.pool.min-idle=0
 # ========================mybatis相关配置===================
 mybatis.mapper-locations=classpath:mapper/*.xml
 mybatis.type-aliases-package=com.atguigu.docker.docker_boot.entity
 # ========================swagger=====================
 spring.swagger2.enabled=true

controller

docker-compose容器编排

这个微服务只是测试,所以写的很简单,做个参考就行

项目结构

docker-compose容器编排

7.1.2 项目打包并上传到linux服务器

docker-compose容器编排

docker-compose容器编排

7.1.3 编写Dockerfile

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

7.1.4 构建镜像

注意:这里我的jar包和Dockerfile文件是在同一个目录下面的

 docker build -t zzyy_docker:1.6 .

docker-compose容器编排

7.2 不用Compose

7.2.1、构建单独的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

docker-compose容器编排

2、进入mysql容器实例并新建库新建表

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

docker-compose容器编排

7.2.2 单独的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-compose容器编排

7.2.3 微服务工程实例

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

docker-compose容器编排

此时工程、mysql、redis三个容器实例都已经成功启动了。

7.2.4 swagger测试

 http://192.168.159.33:6001/swagger-ui.html

docker-compose容器编排

测试添加和查询接口功能是否正常

新增

docker-compose容器编排

查询是否添加成功

docker-compose容器编排

redis中是否有数据

docker-compose容器编排

7.2.5 上述方法有什么问题?

  • 先后顺序要求固定,先mysql+redis才能微服务访问成功

  • 多个run命令……

  • 容器间的启停或宕机,有可能导致IP地址对应的容器实例变化,映射出错,要么生产IP写死(可以但是不推荐),要么通过服务调用

7.3 使用Compose容器编排

服务编排,一套带走。

7.3.1 编写docker-compose.yml文件

 version: "3"
 
 services:
  microService:
    image: zzyy_docker:1.6
    container_name: ms01
    ports:
      - "6001:6001"
    volumes:
      - /app/microService:/data
    networks:
      - atguigu_net
    depends_on:
      - redis
      - mysql
 
  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks:
      - atguigu_net
    command: redis-server /etc/redis/redis.conf
 
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'db2021'
      MYSQL_USER: 'zzyy'
      MYSQL_PASSWORD: 'zzyy123'
    ports:
        - "3306:3306"
    volumes:
        - /app/mysql/db:/var/lib/mysql
        - /app/mysql/conf/my.cnf:/etc/my.cnf
        - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - atguigu_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
 
 networks:
    atguigu_net:

7.3.2 修改微服务工程

修改配置文件,可以通过域名访问,与IP无关。

docker-compose容器编排

重新将项目打成jar包并上传到linux服务器中的/mydocker目录下。

编写Dockerfile,这里并没有变动Dockerfile

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

构建镜像

 docker build -t zzyy_docker:1.6 .

7.3.3 执行docker-compose up

执行docker-compose up或者docker-compose up -d

docker-compose容器编排

没有指定容器名字的会自动拼接mydocker_前缀

7.3.4 进入mysql容器实例新建库新建表

docker-compose容器编排

7.3.5 swagger测试

和上面一样,新增三条数据

docker-compose容器编排

docker-compose容器编排

redis中

docker-compose容器编排

7.3.6 关停

 docker-compose stop

docker-compose容器编排

确实比之前不用compose时还要一个一个按顺序启动容器实力方便了一些,做到了一键启停。这里只是简单测试容器编排,只有三个容器实例,如果达到了几十个可能就需要用k8s了。



原文始发于微信公众号(全栈开发那些事):docker-compose容器编排

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/91812.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!