- Docker Compose 是一个工具;
- 这个工具可以通过一个yaml文件定义多容器的docker应用;
- 通过一条命令就可以根据yaml文件的定义去创建或者管理这多个容器。
注意:version 2只支持单机部署,version 3支持集群部署。
示例如下:
根据docker-compose.yml文件创建多个容器:
命令:docker-compose up
默认使用当前目录下的docker-compose.yml文件
depends_on
表达services之间的依赖关系,service依赖关系导致以下行为:
-
docker-compose up
以依赖性顺序启动服务。在以下示例中,db
和redis
会在web
之前启动。 -
docker-up up SERVICE
自动包含SERVICE
的依赖关系。 在下面的例子中,docker-compose up web
也会创建并启动db
和redis
。
示例:
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升级的地方:
- 移除:
volume_driver
、volumes_from
、cpu_shares
、
cpu_quota
、cpuset
、mem_limit
、memswap_limit
、extends
、group_add
. - 添加:
deploy
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
重启策略
-
condition
:重启的条件,取值none
(无),on-failure
(失败时),any
(默认值是:any
)。 -
delay
:延迟时间。在尝试重启之间等待多长时间,默认值为0。 -
max_attempts
:尝试重新启动容器的次数。 -
window
:在决定重新启动是否成功之前等待多久。(默认值:decide immediately
,表示立即决定)。
示例:
version: "3"
services:
redis:
image: redis:alpine
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
update_config
service更新时要遵循的配置
-
parallelism
:同时更新的容器数量; -
delay
:更新一组容器之间的等待时间; -
failure_action
:更新失败时要执行的动作。continue
(继续)、rollback
(回滚)、pause
(暂停)。(默认:pause)。 -
monitor
:每次任务更新后监控失败的时间(单位:ns|us|ms|s|m|h
),(默认为0s
)。 -
max_failure_ratio
:在更新期间容忍的失败率。 -
order
:更新期间的操作顺序。stop-first
(旧任务在开始新任务之前停止)或者start-first
(首先启动新任务,并且正在运行的任务短暂重叠)。(默认:stop-first
)。注意:只支持v3.4及更高版本。
示例:
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