• Docker Compose快速入门及实战


    前言

    在此之前部署服务都是使用Docker命令来进行的,越到后面执行的Docker命令就会十分复杂且容易出错,而且对于部署多个容器时需要一条一条docker命令去执行,实在是累啊,还有就是一些实战案例以及项目中都是提供了docker compose服务运行命令模板,基于这几个原因,就去现学了下Docker Compose。

    所有博客文件目录索引:博客目录索引(持续更新)

    一、认识Docker-Compose

    官网—Use Docker Compose

    Get started with Docker Compose

    简介:docker-compose是基于docker的编排工具,使容器的操作能够批量的,可视的执行,是一个管理多个容器的工具。

    • docker-compose是基于docker的开源项目,托管于github上,由python实现,调用 docker服务的API负责实现对docker容器集群的快速编排,即通过一个单独的yaml文件,来定义一组相关的容器来为一个项目服务。 所以,docker-compose默认的管理对象是项目,通过子命令的方式对项目中的一组容器进行生命周期的管理。

    最重要的两个概念

    • 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
    • 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

    二、快速安装Docker-Compose

    # 国内镜像下载
    sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
    # 为docker-compose设置权限
    sudo chmod +x /usr/local/bin/docker-compose
    
    # 查看docker-compose版本
    docker-compose --version
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20220822110549389


    三、Docker Compose文件语法详解以及运行命令

    Docker运行命令详解

    # 直接运行该目录下所有compose文件:
    docker-compose up
    # 后台运行: 
    docker-compose up -d
    # 指定文件名运行:
    docker-compose -f xxx-compose.yml up -d 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    docker-compose文件语法详解

    参考:docker-compose语法详解

    实战案例:SpringBoot(53) 整合canal实现数据同步,可去根据实战案例中的compose来自己对照下面配置内容来编写出来

    version: "3"  # 指定docker-compose语法版本
    services:    # 从以下定义服务配置列表
      server_name:   # 可将server_name替换为自定义的名字,如mysql/php都可以
        container_name: container_name  # 指定实例化后的容器名,可将container_name替换为自定义名
        image: xxx:latest # 指定使用的镜像名及标签
        build:  # 如果没有现成的镜像,需要自己构建使用这个选项
          context: /xxx/xxx/Dockerfile  # 指定构建镜像文件的路径
          dockerfile: ....     # 指定Dockerfile文件名,上一条指定,这一条就不要了
        ports:
          - "00:00"  # 容器内的映射端口,本地端口:容器内端口
          - "00:00"  # 可指定多个
        volumes:
          - "test1:/xx/xx"  # 这里使用managed volume的方法,将容器内的目录映射到物理机,方便管理
          - "test2:/xx/xx"  # 前者是volumes目录下的名字,后者是容器内目录
          - "test3:/xx/xx"  # 在文件的最后还要使用volumes指定这几个tests
        volumes_from:  # 指定卷容器
           - volume_container_name  # 卷容器名
        restarts: always  # 设置无论遇到什么错,重启容器,其他:unless-stopped(指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器)
        depends_on:       # 用来解决依赖关系,如这个服务的启动,必须在哪个服务启动之后
          - server_name   # 这个是名字其他服务在这个文件中的server_name
          - server_name1  # 按照先后顺序启动
        links:  # 与depend_on相对应,上面控制容器启动,这个控制容器连接
          - mysql  # 值可以是- 服务名,比较复杂,可以在该服务中使用links中mysql代替这个mysql的ip
        networks: # 加入指定的网络,与之前的添加网卡名类似
          - my_net  # bridge类型的网卡名
          - myapp_net # 如果没有网卡会被创建,建议使用时先创建号,在指定
        environment: # 定义变量,类似dockerfile中的ENV
          - TZ=Asia/Shanghai  # 这里设置容器的时区为亚洲上海,也就解决了容器通过compose编排启动的 时区问题!!!!解决了容器的时区问题!!!
          变量值: 变量名   # 这些变量将会被直接写到镜像中的/etc/profile
        command: [                        #使用 command 可以覆盖容器启动后默认执行的命令
                '--character-set-server=utf8mb4',            #设置数据库表的数据集
                '--collation-server=utf8mb4_unicode_ci',    #设置数据库表的数据集
                '--default-time-zone=+8:00'                    #设置mysql数据库的 时区问题!!!! 而不是设置容器的时区问题!!!!
        ]
      server_name2:  # 开始第二个容器
        server_name:
          stdin_open: true # 类似于docker run -d
          tty: true  # 类似于docker run -t
    volumes:   # 以上每个服务中挂载映射的目录都在这里写入一次,也叫作声明volume
      test1:
      test2:
      test3:
    networks:  # 如果要指定ip网段,还是创建好在使用即可,声明networks
      my_net:
        driver: bridge  # 指定网卡类型
      myapp_net:
        driver: bridge 
    
    • 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

    四、实战手动编写一个Docker Compose

    该案例是从原始的docker命令演变为使用docker compose,我自己也是如此来进行过渡进而学习docker compose的使用方法的。

    案例使用MySQL 5.7.36镜像

    首先我们拉取一个mysql5.7.36镜像:

    docker pull mysql:5.7.36
    
    • 1

    原先我们的启动MySQL的Docker命令如下

    • 在命令中我们挂载了对应的mysql配置文件。
    docker run --name mysql5736 \
    -p 3306:3306 \
    -v /mydata/mysql/conf:/etc/mysql/mysql.conf.d \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:5.7.36
    
    • 1
    • 2
    • 3
    • 4
    • 5

    挂载的配置文件名为mysqld.cnf,完整的目录为:/home/dockerfiles/mysql/conf/mysqld.cnf:在配置文件中我开启了binlog,之后来进行验证

    [mysqld]
    pid-file	= /var/run/mysqld/mysqld.pid
    socket		= /var/run/mysqld/mysqld.sock
    datadir		= /var/lib/mysql
    #log-error	= /var/log/mysql/error.log
    # By default we only accept connections from localhost
    #bind-address	= 127.0.0.1
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    log-bin=mysql-bin  # 开启 binlog
    binlog-format=ROW  # 选择 ROW 模式
    server-id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    替换为Docker Compose文件

    image-20220822124503781

    文件路径:

    /
    └── home
         └── dockerfiles
               └── mysql
                    └── conf
                          └── mysqld.cnf
                └──docker-compose-mysql.yml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    我们在home目录中创建dockerfiles文件夹,然后在mysql/conf目录下创建对应的mysql配置文件,同上,这个操作我不做演示了。

    现在关注点就在这个docker-compose-mysql.yml配置文件上,上面的Docker命令转换如下:

    version: "3"
    services:
      mysql:  # mysql服务
        image: mysql:5.7.36  # 镜像文件
        container_name: mysql5736test  # 容器名称
        volumes: 
          - "./mysql/conf:/etc/mysql/mysql.conf.d"   # 共享同一个配置文件目录
        environment:                                 # 设置环境变量,相当于docker run命令中的-e
          TZ: Asia/Shanghai
          LANG: en_US.UTF-8
          MYSQL_ROOT_PASSWORD: root                  # 设置初始密码为root 
        ports:
          - "3307:3306"                              # 端口号配置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    接着在dockerfiles文件目录下执行启动命令:

    # -f表示指定某个配置文件名   -d:表示后台启动
    docker-compose -f docker-compose-mysql.yml up -d 
    
    • 1
    • 2

    若是出现下面的效果,表示已经成功!

    image-20220822125040037

    我们使用navicat来去连接一些看看:默认的用户名密码是root、root,端口宿主机开放的是3307映射到容器中的3306,连接成功如下:

    image-20220822125326120

    用docker compose后简直不要太爽了,避免了之前写了一大长串的docker执行命令,很容易出错,而且执行多个容器也不方便,需要一个个进行启动。

    参考资料

    [1]. docker-compose语法详解

    [2]. ruamel_yaml.scanner.ScannerError: while scanning for the next token found character ‘\t’ that cannot

    [3]. Docker-Compose运行命令

    [4]. Docker Compose 简介

    [3]. Docker-Compose运行命令

    [4]. Docker Compose 简介

    [5]. Docker Compose 知识点(学习笔记)

  • 相关阅读:
    QImage
    基于AI算法的5G多接入协同方案及关键技术
    Camtasia Studio2023喀秋莎免费实用的屏幕录像工具
    【项目】手把手带你用 SpringBoot、Uniapp、MySql 开发一个简单的活动报名项目
    postman下载文件的名字 中文部分表示成%
    4、运算符
    【无标题】
    浅谈微信小程序的功能定位和使用场景
    Windows安装cassandra,数小时多个bug总结记录
    kubernetes-pod的更新策略与回滚策略
  • 原文地址:https://blog.csdn.net/cl939974883/article/details/126463806