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

一、前言

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

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


二、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

powershell 复制代码
# 例如从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. 常用命令

powershell 复制代码
# 查看帮助
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 直连。如下:

    yml 复制代码
    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 文件生成该微服务镜像。内容如下:

    powershell 复制代码
    # 依赖于 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 文件,内容如下

    powershell 复制代码
    # 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 命令对文件语法检查

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

    powershell 复制代码
    [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. 调用接口测试:

    powershell 复制代码
    # 从 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 命令停止服务

    powershell 复制代码
    [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

相关推荐
新晓·故知19 分钟前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
魔理沙偷走了BUG31 分钟前
【数学分析笔记】第4章第4节 复合函数求导法则及其应用(3)
笔记·数学分析
NuyoahC2 小时前
算法笔记(十一)——优先级队列(堆)
c++·笔记·算法·优先级队列
这可就有点麻烦了3 小时前
强化学习笔记之【TD3算法】
linux·笔记·算法·机器学习
漫无目的行走的月亮5 小时前
在Docker中运行微服务注册中心Eureka
docker
Ljubim.te5 小时前
软件设计师——数据结构
数据结构·笔记
speop7 小时前
【笔记】I/O总结王道强化视频笔记
笔记·音视频
yngsqq7 小时前
031集——文本文件按空格分行——C#学习笔记
笔记·学习·c#
大道归简8 小时前
Docker 命令从入门到入门:从 Windows 到容器的完美类比
windows·docker·容器
sealaugh328 小时前
aws(学习笔记第一课) AWS CLI,创建ec2 server以及drawio进行aws画图
笔记·学习·aws