Docker Compose

2019-04-18  本文已影响0人  CaiGuangyin

注意:version 2只支持单机部署,version 3支持集群部署。

示例如下:


image.png

根据docker-compose.yml文件创建多个容器:
命令:docker-compose up

默认使用当前目录下的docker-compose.yml文件

depends_on

表达services之间的依赖关系,service依赖关系导致以下行为:

示例:

version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

--scale 扩缩容

web服务扩容:

[root@docker ha-flask]# docker-compose up -d --scale web=6
Starting haflask_web_1 ... 
Starting haflask_web_1 ... done
Starting haflask_web_2 ... done
Starting haflask_web_3 ... done
Creating haflask_web_4 ... done
Creating haflask_web_5 ... done
Creating haflask_web_6 ... done

-d后台运行。如果不加-d,默认是在前台运行,ctrl+c后会使在运行的容器停止。

web缩容:

[root@docker ha-flask]# docker-compose up -d --scale web=4
Stopping and removing haflask_web_5 ... 
Stopping and removing haflask_web_5 ... done
Stopping and removing haflask_web_6 ... done
Starting haflask_web_1 ... done
Starting haflask_web_2 ... done
Starting haflask_web_3 ... done
Starting haflask_web_4 ... done
haflask_lb_1 is up-to-date

docker swarm模式下的docker-compose

Docker-compose Version 3

version 3升级的地方:

deploy命令下面的子命令:

endpoint_mode

支持的版本:3.3
endpoint_mode: vip - Docker为该service分配一个虚拟ip,即vip。 service之间通过vip进行通信。底层通过LVS轮询,将请求分发至service下的container。这个值是默认的。
endpoint_mode: dnsrr - DNS轮询机制服务发现不使用单个虚拟IP。Docker为服务设置DNS条目,使得服务名称的DNS查询返回一个IP地址列表,并且客户端直接连接到其中的一个。 如果您想使用自己的负载平衡器,或者混合Windows和Linux应用程序,则DNS轮询功能非常有用。

示例:

version: "3.3"

services:
  wordpress:
    image: wordpress
    ports:
      - "8080:80"
    networks:
      - overlay
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: vip

  mysql:
    image: mysql
    volumes:
       - db-data:/var/lib/mysql/data
    networks:
       - overlay
    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: dnsrr

volumes:
  db-data:

networks:
  overlay:

labels

labels 指定service的标签,其实就是对service的描述信息。这个标签仅在设置在service上,而不在service下的任何container设置。labels的值是key: value的形式。

示例:

version: "3" 
services:
  web:
    image: web
    deploy:
      labels:
        com.cgy.desc: "This label will appear on the web service"

mode

mode的值可以是global(每个群集节点只有一个容器,不能通过scale作横向扩展。)或replicated(指定数量的容器,可以通过scale扩展container数量)。 默认值是replicated

示例:

version: '3'
services:
  db:
    image: mysql:5.6
    deploy:
      mode: global

placement

placement设置service的限制条件(constraints)和偏好(preferences)设置。

官方文档参考:https://docs.docker.com/compose/compose-file/#placement

示例:

version: '3'
services:
  db:
    image: mysql:5.6
    deploy:
      mode: global
      placement:
        constraints:    # 限制条件
          - node.role == manager     # 限制db这个service部署至swarm的manager节点
          - engine.labels.operatingsystem == ubuntu 14.04
        preferences:    # 优先配置
          - spread: node.labels.zone

replicas

当模式为replicated(即mode: replicated)时,在初始化时,我们就可以通过relicas指定当前的service需要几个容器。

示例:

version: '3'
services:
  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 6      # 初始化时,在名为worker的service下创建6个container 

resources

资源控制

示例:

version: '3'
services:
  redis:
    image: redis:alpine
    deploy:
      resources:
        limits:              # 资源限制
          cpus: '0.50'
          memory: 50M
        reservations:        # 资源保留
          cpus: '0.25'
          memory: 20M

limits就是限制当前service能够使用的硬件资源;
reservations就是为当前service保留的硬件资源;

restart_policy

重启策略

示例:

version: "3"
services:
  redis:
    image: redis:alpine
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s

update_config

service更新时要遵循的配置

示例:

version: '3.4'
services:
  vote:
    image: dockersamples/examplevotingapp_vote:before
    depends_on:
      - redis
    deploy:
      replicas: 4
      update_config:
        parallelism: 2      # 同时更新2个container
        delay: 10s          # 😒 每组容器更新的间隔时间
        order: stop-first
上一篇 下一篇

猜你喜欢

热点阅读