【Docker笔记06】【容器编排】

本文介绍了DockerCompose的基本概念、安装过程、常用命令以及如何通过DockerCompose管理和部署SpringBoot微服务,包括服务定义、配置文件编写和实战示例。
摘要由CSDN通过智能技术生成

一、前言

本系列是根据 B 站 尚硅谷 Docker 视频 学习记录笔记。因为没有视频课件,部分内容摘自 https://www.yuque.com/tmfl/cloud/dketq0

本系列仅为自身学习笔记记录使用,记录存在偏差,推荐阅读原视频内容或本文参考笔记。


系列文章:
【Docker笔记01】【基础内容】
【Docker笔记02】【常用软件安装】
【Docker笔记03】【MySQL 与 Redis的主从安装】
【Docker笔记04】【Dockerfile】
【Docker笔记05】【网络模式】
【Docker笔记06】【容器编排】
【Docker笔记07】【容器监控】


二、Docker-compose

1. 基本概念

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

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

Docker建议我们每个容器中只运行一个服务,因为Docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来。但是如果我们需要同时部署多个服务,每个服务单独构建镜像构建容器就会比较麻烦。所以 Docker 官方推出了 docker-compose 多服务部署的工具。


Compose允许用户通过一个单独的 docker-compose.yml 模板文件来定义一组相关联的应用容器为一个项目(project)。可以很容易的用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。


核心概念:

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

Compose使用的三个步骤:

  1. 编写 Dockerfile 定义各个应用容器,并构建出对应的镜像文件
  2. 编写 docker-compose.yml,定义一个完整的业务单元,安排好整体应用中的各个容器服务
  3. 执行 docker-compose up 命令,其创建并运行整个应用程序,完成一键部署上线

2. 安装过程

Docker-Compose的版本需要和Docker引擎版本对应,可以参照官网上的对应关系

安装过程参考官网地址 :Install Compose standalone

# 例如从github下载 2.26.0版本的docker-compose
# 下载下来的文件放到 /usr/local/bin目录下,命名为 docker-compose
curl -SL https://github.com/docker/compose/releases/download/v2.26.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# 添加权限
chmod +x  /usr/local/bin/docker-compose
# 验证
docker-compose version

注:如果从 github 上下载可能会失败,可以通过 下载地址 来下载 docker-compose 后复制到服务器中。

3. 常用命令

# 查看帮助
docker-compose -h
# 创建并启动docker-compose服务:(类似 docker run)
docker-compose up
# 创建并启动docker-compose服务(后台运行)
docker-compose up -d
# 停止并删除容器、网络、卷、镜像:(类似 docker stop +  docker rm)
docker-compose down
# 进入容器实例内部:
docker-compose exec <yml里面的服务id> /bin/bash
# 展示当前docker-compose编排过的运行的所有容器:
docker-compose ps
# 展示当前docker-compose编排过的容器进程
docker-compose top
# 查看容器输出日志
docker-compose log <yml里面的服务id>

# 检查配置
docker-compose config
# 检查配置 :有问题才输出
docker-compose config -q

# 重启服务
docker-compose restart
# 启动服务
docker-compose start
# 停止服务
docker-compose stop

3. 使用示例

  1. 编写 SpringBoot 微服务,暴露出两个接口,其中需要注意的是在 yml 文件中,MySQL和 Redis的连接是通过 docker 服务名连接的,而非通过IP 直连。如下:

    spring:
      datasource:
      	# 通过 docker 服务名 kingfish_mysql 连接MySQL
        url: jdbc:mysql://kingfish_mysql:3306/demo?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&serverTimezone=GMT
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
        type: com.alibaba.druid.pool.DruidDataSource
      redis:
      	# 通过 docker 服务名 kingfish_redis 连接MySQL
        host: kingfish_redis
    mybatis:
      mapper-locations: classpath*:mapper/*/*.xml,classpath*:mapper/*.xml
      type-aliases-package: com.kingfish.dao
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        auto-mapping-behavior: full
        map-underscore-to-camel-case: true
    server:
      port: 9090
      servlet:
        context-path: /simple-demo
    
  2. 编写 Dockerfile 文件生成该微服务镜像。内容如下:

    # 依赖于 JDK 8
    FROM jdk:8
    MAINTAINER kingfish
    # 在主机 /var/lib/docker目录下创建一个临时文件,并链接到容器的 /tmp
    VOLUME /tmp
    
    # 将jar包添加到容器中,并命名为 spring-simple-demo.jar
    ADD spring-simple-demo.jar /spring-simple-demo.jar
    # 运行jar包
    RUN bash -c 'touch /spring-simple-demo.jar'
    ENTRYPOINT ["java", "-jar", "/spring-simple-demo.jar"]
    
    # 暴露服务端口(服务本身暴露9090端口)
    EXPOSE 9090
    
  3. 编写docker-compose.yml 文件,内容如下

    # docker-compose文件版本号
    version: "3"
    
    # 配置各个容器服务
    services:
      microService:
        image: simple_demo_docker:1.0
        container_name: ms01  # 容器名称,如果不指定,会生成一个服务名加上前缀的容器名
        ports:
          - "9090:9090"
        volumes:
          - /app/microService:/data
        networks:
          - springboot_network
        depends_on:  # 配置该容器服务所依赖的容器服务
          - kingfish_redis
          - kingfish_mysql
    
      kingfish_redis:
        image: redis:6.0.8
        ports:
          - "6379:6379"
        volumes:
          - /app/redis/redis.conf:/etc/redis/redis.conf
          - /app/redis/data:/data
        networks:
          - springboot_network
        command: redis-server /etc/redis/redis.conf
    
      kingfish_mysql:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: 'root'
          MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
          MYSQL_DATABASE: 'demo'
          MYSQL_USER: 'springboot'
          MYSQL_PASSWORD: 'springboot'
        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:
          - springboot_network
        command: --default-authentication-plugin=mysql_native_password # 解决外部无法访问
    
    networks:
      # 创建 springboot_network 网桥网络
      springboot_network:
    
  4. 编写完成docker-compose.yml后,通过docker-compose config -q 命令对文件语法检查

    [root@192 spring-demo]# docker-compose config -q
    
  5. 语法检查没问题后,通过 docker-compose up -d 命令 进行创建、启动

    [root@192 spring-demo]# docker-compose up -d
    WARN[0000] /soft/spring-demo/docker-compose.yml: `version` is obsolete 
    [+] Running 3/4
     ⠦ Network spring-demo_springboot_network  Created                                                                                                                                                                                                                            0.6s 
     ✔ Container spring-demo-kingfish_mysql-1  Started                                                                                                                                                                                                                            0.3s 
     ✔ Container spring-demo-kingfish_redis-1  Started                                                                                                                                                                                                                            0.3s 
     ✔ Container ms01                          Started     
    
  6. 调用接口测试:

    # 从 MySQL 中获取数据
    [root@192 spring-demo]# curl 127.0.0.1:9090/simple-demo/demo/getByDb
    [{"id":232,"name":null,"password":null,"roleId":null,"userId":"1"},{"id":233,"name":null,"password":null,"roleId":null,"userId":"0"},{"id":234,"name":null,"password":null,"roleId":null,"userId":"2"},{"id":235,"name":null,"password":null,"roleId":null,"userId":"3"},{"id":236,"name":null,"password":null,"roleId":null,"userId":"4"},{"id":237,"name":null,"password":null,"roleId":null,"userId":"5"},{"id":238,"name":null,"password":null,"roleId":null,"userId":"7"},{"id":239,"name":null,"password":null,"roleId":null,"userId":"6"},{"id":240,"name":null,"password":null,"roleId":null,"userId":"8"},{"id":241,"name":null,"password":null,"roleId":null,"userId":"9"}]
    # 从Redis 中获取数据
    [root@192 spring-demo]# curl 127.0.0.1:9090/simple-demo/demo/getByRedis?key=aaa
    123
    
  7. 通过docker-compose stop 命令停止服务

    [root@192 spring-demo]# docker-compose stop
    WARN[0000] /soft/spring-demo/docker-compose.yml: `version` is obsolete 
    [+] Stopping 3/3
     ✔ Container ms01                          Stopped                                                                                                    0.6s 
     ✔ Container spring-demo-kingfish_mysql-1  Stopped                                                                                                    1.5s 
     ✔ Container spring-demo-kingfish_redis-1  Stopped    
    

三、参考内容

B 站 尚硅谷 Docker 视频
https://www.yuque.com/tmfl/cloud/dketq0

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫吻鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值