• docker 高级 compose/swarm


    docker高级

    前言:最近让我部署一个项目,该项目是多个服务的,在启动多个容器的时候是比较麻烦的。于是就想到了docker-compose 容器编排。

    结构:

    • docker-compose 容器编排
    • docker-swarm 容器集群

    目录:

    docker compose

    docker 容器编排。当需要启动多容器的时候,需要docker-compose进行编排管理

    结构:

    • 安装
    • docker-compose 文件的组成
    • docker-compose 常用命令
    • 实战

    安装

    流程:

    1. 下载
    2. 添加可执行权限
    3. 测试安装结果

    1、下载

    • 从gitHub下载
    sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    
    • 1
    • daocloud镜像下载
    sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    
    • 1

    2、添加可执行权限

    sudo chmod +x /usr/local/bin/docker-compose
    
    • 1

    3、

    docker-compose --version
    
    • 1

    docker-compose 文件的组成

    docker-compose 文件是一个定义服务,网络,数据卷的yaml文件,默认文件名为 docker-compose.yml

    组成:

    • version

    • services

    • images

    • ports

    • volumes

    • container_name

    • command

    • build

    • depends_on

    • networks

    • sysctls

    • ulimits

    • environment

    • env_file

    案例:

    version: "3.7"
    
    services:
    
      saas_group:
        build:
          context: ../saas-group
          dockerfile: ../saas-group/Dockerfile
        container_name: saas_group
        restart: "no"
        external_links:
          - nacos_server:nacoshost
          - mysql_db:mysqlhost
          - redis_db:redishost
        volumes:
          - /private/docker/application-logs:/mnt/logs
        environment:
          - nacoshost=xx.xx.xx.xx
          - mysqlhost=xx.xx.xx.xx
          - redishost=xx.xx.xx.xx
          - NACOS_CONFIG_GROUP=develop_group
          - DUBBO_IP_TO_REGISTRY=xx.xx.xx.xx
          - NACOS_IP_TO_REGISTRY=xx.xx.xx.xx
        ports:
          - 20880-20085:20880-20885
          - 6000-6005:6000-6005
        networks:
          - qa-overlay
    
    
      application_group:
        build:
          context: ../application-group
          dockerfile: ./Dockerfile
        container_name: application_group
        restart: "no"
        external_links:
          - nacos_server:nacoshost
          - mysql_db:mysqlhost
          - redis_db:redishost
        volumes:
          - /private/docker/application-logs:/mnt/logs
        environment:
          - nacoshost=xx.xx.xx.xx
          - mysqlhost=xx.xx.xx.xx
          - redishost=xx.xx.xx.xx
          - NACOS_CONFIG_GROUP=develop_group
          - DUBBO_IP_TO_REGISTRY=xx.xx.xx.xx
          - NACOS_IP_TO_REGISTRY=xx.xx.xx.xx
        ports:
          - 30880-30889:30880-30889
          - 9000-9005:9000-9005
        networks:
          - qa-overlay
    
      global_gateway:
        build:
          context: middleware-group/global-gateway
          dockerfile: ./Dockerfile
        container_name: global_gateway
        restart: "no"
        external_links:
          - nacos_server:nacoshost
          - mysql_db:mysqlhost
          - redis_db:redishost
        ports:
          - 8080:8080
        volumes:
          - /private/docker/application-logs:/mnt/logs
        environment:
          - nacoshost=xx.xx.xx.xx
          - mysqlhost=xx.xx.xx.xx
          - redishost=xx.xx.xx.xx
          - NACOS_CONFIG_GROUP=develop_group
          - DUBBO_IP_TO_REGISTRY=xx.xx.xx.xx
          - NACOS_IP_TO_REGISTRY=xx.xx.xx.xx
        networks:
          - qa-overlay
        deploy:
          resources:
            limits:
              cpus: '0.50'
              memory: 1024M
    
    
    
    networks:
      qa-overlay:
        external: true
    
    • 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
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89

    1、version

    2、services

    • service代表一个容器,servieces 下可以有多个容器

    3、image

    • 指定为镜像名称【:版本号】或者镜像ID,如果镜像在本地不存在,compose 会尝试拉取这个镜像。
    image: centos7.7
    image: orchardup/postgresql
    image: a4bc65fd
    
    • 1
    • 2
    • 3

    4、ports

    • 暴露端口信息

    宿主端口:容器端口host:container格式;或者仅仅指定容器的端口,宿主机将会随机选择端口。

    ports:
     - "3000"
     - "49100:22"
    
    
    • 1
    • 2
    • 3
    • 4

    5、volumes

    • 数据卷所挂载的路径设置,可以设置为宿主机路径host:container,并且可以设置访问模式host:container:ro
    • 支持相对路径
    volumes:
     - /var/lib/mysql
     - cache/:/tmp/cache
     - ~/configs:/etc/configs/:ro
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 如果路径为数据卷名称,必须在文件中配置数据卷
    version: "3"
    
    services:
      my_src:
        image: mysql:8.0
        # 数据卷声明
        volumes:
          - mysql_data:/var/lib/mysql
    
    volumes:
      mysql_data: # 声明的数据卷
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    6、container_name

    • 指定容器名称,将会默认使用项目名称_服务名称_序号 这样的格式
    version: "3"
    services:
      docker-service-name:  # 容器服务名
        container_name: docker-web-container  # 容器名称
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    7、command

    • 覆盖容器后,默认执行命令
    command: echo "hello world"
    
    • 1

    8、build

    • 指定 Dockerfile 所在文件夹路径(可以是绝对路径,或者是相对 docker-compose.yaml 文件的路径),compose 将会利用它自动构建这个镜像,然后使用这个镜像
    version: '3'
    services:
    
      webapp:
        build: ./dir
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 也可以使用 context 指令指定 Dockerfile 所在文件夹路径
    • 使用 dockerfile 指令指定 Dockerfile 文件名,使用 arg 指令指定构建镜像时的变量
    version: '3'
    services:
      webapp:
        build:
          context: /opt/docker
          dockerfile: Dockerfile-alternate
          args:
            buildno: 1
        container_name: webapp
        ports:
          - "8080:8080"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    9、depends_on

    • 解决容器的依赖,启动先后的问题,以下例子中启动顺序为: dbredisweb
    • 注意:不是【完全启动后】才启动,只是启动顺序
    version: '3'
    
    services:
      web:
        build: .
        depends_on:
          - db
          - redis
    
      redis:
        image: redis
    
      db:
        image: postgres
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    10,networks

    • 配置容器连接的网络
    version: "3"
    services:
    
      some-service:
        networks:
         - some-network
         - other-network
    
    networks:
      some-network:
      other-network:
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    11、sysctls

    • 配置容器内核参数
    sysctls:
      net.core.somaxconn: 1024
      net.ipv4.tcp_syncookies: 0
    
    sysctls:
      - net.core.somaxconn=1024
      - net.ipv4.tcp_syncookies=0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    12、ulimits

    • 指定容器的 ulimits 限制值

    例如:指定最大进程数为 65535 ,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过应限制)和 40000(系统硬限制,只能用户root 提高)

      ulimits:
        nproc: 65535
        nofile:
          soft: 20000
          hard: 40000
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    13、environment

    • 设置环境变量,例如设置mysql 默认启动密码
    environment:
      - MYSQL_ROOT_PASSWORD=root
    
    
    • 1
    • 2
    • 3

    14、env_file

    • 从文件中获取环境变量,可以为单独的文件路径或者列表
    • 如果通过 docker-compose -f FILE 方式来指令 compose 模板文件,则 env_file 中变量的路径会基于模板文件的路径
    • 如果 env_file 的环境变量名称 与 environment 指令冲突,以 environment 为准
    env_file: .env
    
    env_file:
      - ./apps/web.env
      - /opt/secrets.env
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    支持 # 开头的注释,同dockerfile文件一致。


    docker-compose 常用命令

    注意:

    ​ 对于docker-compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。

    ​ 如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令的影响。

    基本命令格式:

    docker-compose [-f=...] [options] [COMMAND] [ARGS...]
    
    • 1

    结构:

    • up
    • down
    • ps
    • log

    1、up

    docker-compose up [options] [SERVICE…]
    
    • 1
    • 该命令十分强大,它将尝试自动完成包括构建镜像,创建服务,启动服务,并关联服务相关容器的一系列操作
    • 链接的服务都会被自动启动,除非已经处于运行状态
    • 可以说大部分时候都可以直接通过该命令,来启动一个项目
    • 默认情况下,,docker-compose up 启动并进入容器;如果当前容器正在运行,将会重新加载 yml 文件,重新创建。
    • 使用 ctrl c 退出容器
    • docker-compose up -d 后台启动

    2、dokcer-compose down

    • 停止 up 命令所启动的容器,并移除网络

    3、docker-compose ps [options] [service…]

    • 列出项目中目前所有的容器 ,-q 只打印容器的id

    4、docker-compose log 容器id

    • 查看服务日志

    实战

    实战列表:


    docker-compose tomcat

    yml文件:

    version: "3.0"
    services:
      tomcat-docker:  # 唯一服务名
        image: tomcat:8.0-jre8 # 创建当前这个容器的镜像
        ports:
          - 8094:8080   # 映射端口
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    启动:

    • 进入docker-compose.yml 文件目录下
    #启动并进入容器
    docker-compose up
    
    #启动容器后台运行
    docker-compose up -d
    
    • 1
    • 2
    • 3
    • 4
    • 5

    访问:

    ip地址:8094
    
    • 1

    docker swarm

    相当于简单版k8s

    CI/CD

    • 持续集成/部署

    • jenkins 流水线

  • 相关阅读:
    【Markdown】博客常用颜色、字体
    go微服务框架Kratos笔记「链路追踪实战」
    STM32单片机上传字符串到阿里云
    算法学习笔记(19): 树上启发式合并(DSU on tree)
    全闪存引领SDS革新换代
    Python爬虫(入门版)
    ios环境搭建
    Windows 输入法在注册表中的管理
    Java 18 新增@snipppet标签,注释中写样例代码更舒适了!
    [附源码]计算机毕业设计JAVA网上花店系统
  • 原文地址:https://blog.csdn.net/dearand/article/details/126215290