• Docker Compose


    Docker Compose

    简介

    Docker Compose 是用来做Docker 的多容器控制,是一个用来把 Docker 自动化的东西。有了 Docker Compose 你可以把所有繁复的 Docker 操作全都一条命令,自动化的完成。

    安装

     curl -SL https://github.com/docker/compose/releases/download/v2.11.1/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/cli-plugins/docker-compose
    
    
    • 1
    • 2

    授权

    sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
    
    • 1

    验证

    docker-compose --version
    
    • 1

    yaml基本语法规则

    • 大小写敏感

    • 使用缩进表示层级关系

    • 缩进时不允许使用Tab键,只允许使用空格。

    • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

      # 表示注释,从这个字符一直到行尾,都会被解析器忽略。

    示例

    version: "3.9"
    services:
    
      redis:
        image: redis:alpine
        ports:
          - "6379"
        networks:
          - frontend
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
    
      db:
        image: postgres:9.4
        volumes:
          - db-data:/var/lib/postgresql/data
        networks:
          - backend
        deploy:
          placement:
            max_replicas_per_node: 1
            constraints:
              - "node.role==manager"
    
      vote:
        image: dockersamples/examplevotingapp_vote:before
        ports:
          - "5000:80"
        networks:
          - frontend
        depends_on:
          - redis
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
          restart_policy:
            condition: on-failure
    
      result:
        image: dockersamples/examplevotingapp_result:before
        ports:
          - "5001:80"
        networks:
          - backend
        depends_on:
          - db
        deploy:
          replicas: 1
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
    
      worker:
        image: dockersamples/examplevotingapp_worker
        networks:
          - frontend
          - backend
        deploy:
          mode: replicated
          replicas: 1
          labels: [APP=VOTING]
          restart_policy:
            condition: on-failure
            delay: 10s
            max_attempts: 3
            window: 120s
          placement:
            constraints:
              - "node.role==manager"
    
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - "8080:8080"
        stop_grace_period: 1m30s
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
          placement:
            constraints:
              - "node.role==manager"
    
    networks:
      frontend:
      backend:
    
    volumes:
      db-data:
    
    • 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
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96

    version

    docker-compose模板的版本

    版本号:https://docs.docker.com/compose/compose-file/compose-file-v3/

    示例

    version: "3.9"
    
    • 1

    services

    代表服务相关的配置,编写服务相关的文件

    version: "3.9"
    services:
    
      redis:
        image: redis:alpine
        ports:
          - "6379"
        networks:
          - frontend
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    解释:

    redis :服务的名字

    image:镜像

    其他配置

    例如 网络、数据卷、全局规则等配置

    示例

    networks:
      frontend:
      backend:
    
    volumes:
      db-data:
    configs:  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Docker Compose Yml文件介绍

    Services

    每个Service代表一个Container,与Docker一样,Container可以是从DockerHub中拉取到的镜像,也可以是本地Dockerfile Build的镜像。

    image

    标明image的ID,这个image ID可以是本地也可以是远程的,如果本地不存在,Docker Compose会尝试pull下来.

    build

    该参数指定Dockerfile文件的路径,Docker Compose会通过Dockerfile构建并生成镜像,然后使用该镜像;

     build:
          #构建的地址
          context: /home/test
          dockerfile: Dockerfile
    
    • 1
    • 2
    • 3
    • 4
    ports

    暴露端口信息。
    使用宿主端口:容器端(HOST:CONTAINER)格式,或者仅仅指定容器的端(宿主将会随机选择端口)

     ports:
          - 8081:8080
    
    • 1
    • 2

    注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。

    expose

    暴露端口,但不需要建立与宿主机的映射,只是会向链接的服务提供;

    volumes
    卷挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模(HOST:CONTAINER:ro),挂载数据卷的默认权限是读写(rw),可以通过ro指定为只读。
    你可以在主机上挂载相对路径,该路径将相对于当前正在使用的Compose配置文件的目录进行扩展。 相对路径应始终以 . 或者 … 开始。

    volumes:
      # 只需指定一个路径,让引擎创建一个卷
      - /var/lib/mysql
     
      # 指定绝对路径映射,需要事先创建绝对路径
      - /opt/data:/var/lib/mysql
     
      # 相对于当前compose文件的相对路径
      - ./cache:/tmp/cache
     
      # 用户家目录相对路径
      - ~/configs:/etc/configs/:ro
     
      # 命名卷,需要额外的声明,其创建的卷名为:项目名+datavolume,如果就需要使用自定义卷名,
      # 需要添加external,但是启动时事先需要先创建卷名,比较麻烦: docker volume create mydata
      - datavolume:/var/lib/mysql 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    container_name

    指定一个自定义容器名称,而不是生成的默认名称。

    environment

    加入环境变量,可以使用数组或者字典,只有一个key的环境变量可以在运行compose的机器上找到对应的值;

    env_file

    从一个文件中引入环境变量,该文件可以是一个单独的值或者一个列表,如果同时定义了environment,则environment中的环境变量会重写这些值;

    depends_on

    定义当前服务启动时,依赖的服务,当前服务会在依赖的服务启动后启动;

    depends_on: 
      - redis
      - mysql
    
    • 1
    • 2
    • 3
    deploy

    该配置项在version 3里才引入,用于指定服务部署和运行时相关的参数;

    replicas

    指定副本数;

    version: '3.4'
    services:
      worker:
        image: nginx:latest
        deploy:
          replicas: 6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    restart_policy

    指定重启策略;

    version: "3.4"
    services:
      redis:
        image: redis:latest
        deploy:
          restart_policy:
            condition: on-failure   #重启条件:on-failure, none, any
            delay: 5s   # 等待多长时间尝试重启
            max_attempts: 3 #尝试的次数
            window: 120s    # 在决定重启是否成功之前等待多长时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    restart_policy

    指定重启策略;

    version: "3.4"
    services:
      redis:
        image: redis:latest
        deploy:
          restart_policy:
            condition: on-failure   #重启条件:on-failure, none, any
            delay: 5s   # 等待多长时间尝试重启
            max_attempts: 3 #尝试的次数
            window: 120s    # 在决定重启是否成功之前等待多长时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    update_config

    定义更新服务的方式,常用于滚动更新;

    version: '3.4'
    services:
      vote:
        image: docker-compose-demo
        depends_on:
          - redis
        deploy:
          replicas: 2
          update_config:
            parallelism: 2  # 一次更新2个容器
            delay: 10s  # 开始下一组更新之前,等待的时间
            failure_action:pause  # 如果更新失败,执行的动作:continue, rollback, pause,默认为pause
            max_failure_ratio: 20 # 在更新过程中容忍的失败率
            order: stop-first   # 更新时的操作顺序,停止优先(stop-first,先停止旧容器,再启动新容器)还是开始优先(start-first,先启动新容器,再停止旧容器),默认为停止优先,从version 3.4才引入该配置项
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    resources

    限制服务资源;

    version: '3.4'
    services:
      redis:
        image: redis:alpine
        deploy:
          resources:
            #限制CPU的使用率为50%内存50M
            limits:
              cpus: '0.50'
              memory: 50M
            #始终保持25%的使用率内存20M
            reservations:
              cpus: '0.25'
              memory: 20M
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    healthcheck

    执行健康检查;

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]   # 用于健康检查的指令
      interval: 1m30s   # 间隔时间
      timeout: 10s  # 超时时间
      retries: 3    # 重试次数
      start_period: 40s # 启动多久后开始检查
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    restart

    重启策略;

    #默认的重启策略,在任何情况下都不会重启容器
    restart: "no"
    #容器总是重新启动
    restart: always
    #退出代码指示失败错误,则该策略会重新启动容器
    restart: on-failure
    #重新启动容器,除非容器停止
    restart: unless-stopped
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    networks

    网络类型,可指定容器运行的网络类型;

    #指定对应的网络
    networks:
      - docker-compose-demo-net
      
      
    networks:
      docker-compose-demo-net:
        driver: bridge
        ipam:
          config:
            - subnet: 192.168.1.0/24
              gateway: 192.168.1.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    ipv4_address, ipv6_address

    加入网络时,为此服务指定容器的静态 IP 地址;

    version: "3.9"
    
    services:
      app:
        image: nginx:alpine
        networks:
          app_net:
            ipv4_address: 172.16.238.10
            ipv6_address: 2001:3984:3989::10
    
    networks:
      app_net:
        ipam:
          driver: default
          config:
            - subnet: "172.16.238.0/24"
            - subnet: "2001:3984:3989::/64"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    env_file

    从一个文件中加入环境变量,带入到容器中去,在容器中可以用printenv打印该环境变量。该文件可以是一个单独的值或者一张列表,在environment中指定的环境变量将会重写这些值

    env_file : .env
    
    或
    env_file:
     - ./common.env
     - ./apps/ web.env
     - /opt/secrets.env
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    healthcheck

    通过命令检查容器是否健康运行。需要给每个service都添加

    healthcheck:
      test: [ "CMD", "curl", "-f", “http://localhost"]
      interval: 1m30s # 前多少秒不检查
      timeout: 10s # 等待时间
      sretries: 3 # 尝试三次
    
    • 1
    • 2
    • 3
    • 4
    • 5

    基本命令

    #构建建启动nignx容器
    
    docker-compose up
    或
    docker-compose up -d nginx                     
    
    #进入nginx容器中
    docker-compose exec nginx bash            
    
    #将会停止UP命令启动的容器,并删除容器
    docker-compose down                             
    
    #显示所有容器
    docker-compose ps                                   
    
    #重新启动nginx容器
    docker-compose restart nginx                   
    
    #构建镜像
    docker-compose build nginx      
    
    #不带缓存的构建
    docker-compose build --no-cache nginx 
    
    #查看nginx的日志
    docker-compose logs  nginx                      
    
    #查看nginx的实时日志
    docker-compose logs -f nginx                   
    
    #验证(docker-compose.yml)文件配置,
    #当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
    docker-compose config  -q                        
    
    #以json的形式输出nginx的docker日志
    docker-compose events --json nginx       
    
    #暂停nignx容器
    docker-compose pause nginx                 
    
    #恢复ningx容器
    docker-compose unpause nginx             
    
    #删除容器
    docker-compose rm nginx                       
    
    #停止nignx容器
    docker-compose stop nginx                    
    
    #启动nignx容器
    docker-compose start nginx 
    
    #检查语法是否正确
    docker-compose config
    
    • 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

    搭建博客

    参照官方文档

    https://docs.docker.com/samples/wordpress/

  • 相关阅读:
    Windows下pm2调用npm和nuxt的办法
    《模拟龙生》|500行Go代码写一个随机冒险游戏|巨龙修为挑战开启
    品牌关键词搜索口碑如何优化?
    华为云数据库 RDS 下载全量备份文件 wget
    Dobot机械臂的Python Demo
    如何使用pywinauto实现一个股票自动交易系统?
    LeetCode 509 斐波那契数(动态规划)
    4K投影仪为什么比1080P投影仪更值得买?答案显而易见!
    java 企业工程管理系统软件源码 自主研发 工程行业适用
    PHP自动执行下一页脚本
  • 原文地址:https://blog.csdn.net/fm15136/article/details/127134385