• 云原生 | Docker - [Compose]


    §1 容器编排

    Compose 是一个用于定义以及运行多个 Docker 容器的工具。
    通过 YAML 文件配置应用服务,随后通过单个命令即可从这个配置创建并开启所有服务
    容器编排可以应用于所有环境

    • 开发
    • 测试
    • 模拟
    • 生产
    • CI 工作流

    作用

    • 明确启动顺序
    • 批量管理服务声明周期
    • 灵活管理服务间关系

    §2 指令

    查看帮助
    docker-compose -h

    启动所有 compose 服务
    docker-compose up

    后台启动所有 compose 服务
    docker-compose up -d

    停止并删除容器、网络、卷、镜像
    docker-compose down

    进入容器内部
    docker-compose exec dockerf-compose.yml中服务名 /bin/bash

    查看经过 docker-compose 的所有运行中容器
    docker-compose ps

    查看经过 docker-compose 的所有容器进程
    docker-compose top

    开启经过 docker-compose 的所有服务
    docker-compose start

    重启经过 docker-compose 的所有服务
    docker-compose restart

    停止经过 docker-compose 的所有服务
    docker-compose stop

    查看容器输出日志
    docker-compose logs dockerf-compose.yml中服务名

    查看配置
    docker-compose config

    查看配置,只输出有问题的部分
    docker-compose config -q
    无输出说明 dockerf-compose.yml 中没有语法问题

    §3 使用

    §3.1 Docker Compose 的获取

    安装
    官网安装指南

    下面示例使用手动安装

    • 查看 docker 安装位置
      whereis docker

    • 下面示例将 docker compose 与 docker 安装在同路径
      curl -SL https://github.com/docker/compose/releases/download/v2.7.0/docker-compose-linux-x86_64 -o /usr/bin/docker-compose

    • 增加权限
      chmod +x /usr/bin/docker-compose

    • 验证安装
      docker compose version

    在这里插入图片描述

    基本流程

    • 通过 Dockerfile 文件 定义应用环境
      以便通过复制 Dockerfile 的方式随处复制这个定义过程
    • dockerf-compose.yml 中定义组成应用的各个服务
      这可以使这些服务可以在独立的环境中一起运行
    • 通过 docker compose up 指令开始并运行整个应用
      此指令可以通过 Docker compose 命令行 和 Compose standalone(二进制版 `docker-compose) 运行


    dockerf-compose.yml 版本对照
    dockerf-compose.yml 拥有多种版本,需要考虑 Docker Engine 版本
    点击查看 Docker 官网版本对照

    docker-compose.yml 示例

    version: "3.9"  # optional since v1.27.0
    services:
      web:
        build: .
        ports:
          - "8000:5000"
        volumes:
          - .:/code
          - logvolume01:/var/log
        depends_on:
          - redis
      redis:
        image: redis
    volumes:
      logvolume01: {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    §3.2 Docker Compose 使用示例

    编写 docker-compose.yml 文件

    • version
      用于标记当前 docker-compose.yml 文件的版本
      参考 版本对照
    • services
      其下包含多个 service
      每一个 service 都相当于一条 docker run 指令
      service 可选的指定 容器名(container_name)
      • 指定时,经过 docker-compose up 启动的容器 就叫那个名字
      • 不指定时,容器名是 当前 service 的服务名增加前后缀
    • networks
      其下包含多个 network
      每一个 network都相当于一条 docker network create 指令
    version: "3"
    
    # 整个 services 段,相当于一条一条的 docker run 指令的集合
    services:
      seataSoService:
        image: seata-so-service
        container_name: so1
        ports:
          - "8001:8000"
        volumes:
          - /app/seataSoService:/data
        networks:
          - net_tomcat_01
        depends_on:
          - redis
          - mysql
     
      redis_01:
        image: redis:6.0.8
        ports:
          - "6379:6379"
        volumes:
          - /app/reids:redis.conf:/etc/redis/redis.conf
          - /app/redis/data:/data
        networks:
          - net_tomcat_01
        command:
          - redis-server /etc/redis/redis.conf
      
      mysql_01:
        image: mysql:5.7
        environment:
          mysql_root_password: '123456'
          MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
          MYSQL_DATABASE: 'learning'
          MYSQL_USER: 'user1'
          MYSQL_PASSWORD: '111111'
        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:
          - net_tomcat_01
    	# 解决外部无法访问问题
        command:
          - --default-authentication-plugin=mysql_native_password
    
    networks:
      net_tomcat_01:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    调整微服务配置
    基于上面的 docker-compose.yml 文件,各个微服务配置需要做出调整

    微服务 对 其他微服务或中间件配置中,基于 IP服务名 的部分,改为基于 docker-compose.yml 中配置的服务名(此服务名 约等于容器名),这是因为

    • 微服务之间的依赖,现在转变为对 包含不同微服务的容器 之间的依赖了
    • 微服务对中间件等基础设施的依赖,现在转变为 对 包含中间件或基础设施的容器 依赖了

    以 seataSoService 服务下 mysql 配置为例

    spring:
      application:
        name: seata-so-service
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource            
        driver-class-name: org.gjt.mm.mysql.Driver              # 注意
        url: jdbc:mysql://mysql_01:3306/SO?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
        username: root
        password: root
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    服务打包
    整个 docker-compose 涉及的所有服务的bao
    以及其他组件传输至服务器
    上例中,包含

    • seataSoService
    • redis:6.0.8
    • mysql:5.7

    启动
    docker-compose up -d

  • 相关阅读:
    Go 小知识之 Go 中如何使用 set
    【第三方登录】微信web扫一扫登录步骤
    Qt Creator 窗体控件自适应窗口大小布局-最大化窗口各个控件自动变化大小
    LabVIEW以编程方式启用IEPE激励
    浏览器本地存储
    开学买哪个牌子的电容笔好?推荐的ipad手写笔
    css绘制常见的一些图形
    nvidia-smi出现Failed to initialize NVML: Driver/library version mismatch
    ObjectProvider学习
    信奥中的数学:整除
  • 原文地址:https://blog.csdn.net/ZEUS00456/article/details/126429647