Docker-Compose

Well,经过了对Docker的学习,我们已经掌握部署单容器应用的技术,但在部署多容器应用时多少还是有些不便。这就是容器编排工具的用武之地了。容器编排工具有Docker Compose、Docker Swarm以及最为人所知的Kubernetes等。为了屏蔽多节点应用的麻烦,我们先从单节点编排工具Docker Compose开始。

Docker Compose 思想

Docker Compose将一个多容器应用看作一个project,而在project中互相配合运行的各个(类)容器则称作一个service。

Docker Compose的任务即详细设定每一个service的配置信息,以及在project下设置整个应用的属性:虚拟网络环境、挂载文件等。

Docker Compose 模板

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
97
98
99
100
101
102
103
104
105
106
107

#docker compose 版本
version: "3"

#定义project中的服务们
services:

#一个redis服务
  redis:
#指定使用镜像/亦可以使用dockerfile代替
    image: redis:alpine
#指定ports,这里指定了redis容器的端口为6379. 一般格式为 宿主端口:容器端口,亦可省略宿主部分,仅声明容器端口
    ports:
      - "6379"
#指定容器所连接到的网络
    networks:
      - frontend
#指定服务的部署,包括副本、更新参数、重启条件等。
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

#配置一个postgresql服务
  db:
    image: postgres:9.4
#此处挂载一个数据卷da-data至/var/lib/postgresql/data
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]

  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
#服务依赖,docker compose依此决定服务的启动顺序
    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]

#配置project内部的虚拟网络
networks:
  frontend:
  backend:

#配置project内部的挂载数据卷
volumes:
  db-data: