Docker Stack 部署多服务集群

1. Docker Stack简介

单机模式下,我们可以使用 Docker Compose 来编排多个服务,而 Docker Swarm 只能实现对单个服务的简单部署。本文的主角 Docker Stack ,通过 Docker Stack 我们只需对已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群环境下的多服务编排。

2. Docker Stack集群搭建案例

部署一个投票APP,包含如下服务:

  • 5个应用服务:vote、redis、worker,db,result
  • 工具服务:portainer 和 visualizer
    在这里插入图片描述

首先创建一个 docker-compose.yml 文件,使用 Docker Compose v3 语法

version: "3"
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:
        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]
        
  portainer:
    image: portainer/portainer
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

networks:
  frontend:
  backend:

volumes:
  db-data:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103

在manager节点部署服务:

[root@swarm-manager example-voting-app]# docker stack deploy example --compose-file=docker-compose.yml 
Creating network example_frontend
Creating network example_default
Creating network example_backend
Creating service example_result
Creating service example_worker
Creating service example_visualizer
Creating service example_portainer
Creating service example_redis
Creating service example_db
Creating service example_vote
1234567891011

部署完成:

[root@swarm-manager example-voting-app]# docker stack services example
ID                  NAME                 MODE                REPLICAS            IMAGE                                          PORTS
cdmrhfag3zje        example_vote         replicated          2/2                 dockersamples/examplevotingapp_vote:before     *:5000->80/tcp
csjcltpwvpzs        example_visualizer   replicated          1/1                 dockersamples/visualizer:stable                *:8080->8080/tcp
ihys1qvpz4i5        example_worker       replicated          1/1                 dockersamples/examplevotingapp_worker:latest   
l0ufhl8n0ozg        example_portainer    replicated          1/1                 portainer/portainer:latest                     *:9000->9000/tcp
m2icguw00ls9        example_db           replicated          1/1                 postgres:9.4                                   
pu2h7rqzpaa0        example_redis        replicated          2/2                 redis:alpine                                   *:30001->6379/tcp
tom14od7paf1        example_result       replicated          1/1                 dockersamples/examplevotingapp_result:before   *:5001->80/tcp
123456789
[root@swarm-manager example-voting-app]# docker stack ps example
ID                  NAME                   IMAGE                                          NODE                DESIRED STATE       CURRENT STATE           ERROR                       PORTS
loj1h2dk9l1s        example_vote.1         dockersamples/examplevotingapp_vote:before     swarm-worker3       Running             Running 2 minutes ago                               
kp4n980ldv49        example_db.1           postgres:9.4                                   swarm-manager       Running             Running 2 minutes ago                               
0hf6d80nwwyf        example_worker.1       dockersamples/examplevotingapp_worker:latest   swarm-manager       Running             Running 2 minutes ago                               
rnjnwhl86ro6        example_redis.1        redis:alpine                                   swarm-worker1       Running             Running 2 minutes ago                               
1376pp1lvrly        example_portainer.1    portainer/portainer:latest                     swarm-manager       Running             Running 2 minutes ago                               
xj9a9iu9g2s8        example_worker.1       dockersamples/examplevotingapp_worker:latest   swarm-manager       Shutdown            Failed 2 minutes ago    "task: non-zero exit (1)"   
g5ts3oiibrhn        example_visualizer.1   dockersamples/visualizer:stable                swarm-manager       Running             Running 3 minutes ago                               
kgcttt1xigu2        example_worker.1       dockersamples/examplevotingapp_worker:latest   swarm-manager       Shutdown            Failed 3 minutes ago    "task: non-zero exit (1)"   
jpqdinh0st7b         \_ example_worker.1   dockersamples/examplevotingapp_worker:latest   swarm-manager       Shutdown            Failed 3 minutes ago    "task: non-zero exit (1)"   
ff9bq1vcgbz9        example_result.1       dockersamples/examplevotingapp_result:before   swarm-manager       Running             Running 2 minutes ago                               
q27wp9nna0yc        example_vote.2         dockersamples/examplevotingapp_vote:before     swarm-worker1       Running             Running 2 minutes ago                               
s6hvxlgdz77v        example_redis.2        redis:alpine                                   swarm-worker2       Running             Running 2 minutes ago 
1234567891011121314

浏览器访问:

vote             ip:5000
result           ip:5001  
portainer        ip:9000     
visualizer 	     ip:8080    
1234

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3. Docker Stack和Docker Compose区别

  • Docker stack会忽略了“构建”指令,无法使用stack命令构建新镜像,它是需要镜像是预先已经构建好的。 所以docker-compose更适合于开发场景;
  • Docker Compose是一个Python项目,在内部,它使用Docker API规范来操作容器。所以需要安装Docker -compose,以便与Docker一起在您的计算机上使用;
  • Docker Stack功能包含在Docker引擎中。你不需要安装额外的包来使用它,docker stacks 只是swarm mode的一部分。
  • Docker stack不支持基于第2版写的docker-compose.yml ,也就是version版本至少为3。然而Docker Compose对版本为2和3的 文件仍然可以处理;
  • docker stack把docker compose的所有工作都做完了,因此docker stack将占主导地位。同时,对于大多数用户来说,切换到使用docker stack既不困难,也不需要太多的开销。如果您是Docker新手,或正在选择用于新项目的技术,请使用docker stack。
这个命令就是docker stack,它看起来与docker-compose完全相同。 这是一个他们的用法比较:

$ docker-compose -f docker-compose up
$ docker stack deploy -c docker-compose.yml somestackname

4. Docker Stack常用命令

命令描述
docker stack deploy部署新的堆栈或更新现有堆栈
docker stack ls列出现有堆栈
docker stack ps列出堆栈中的任务
docker stack rm删除一个或多个堆栈
docker stack services列出堆栈中的服务
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker Compose是一个描述和运行多个Docker容器的工具,而Docker Swarm是一个Docker原生的集群管理工具,可以方便地管理多个Docker节点。在Docker Swarm集群中使用Docker Compose可以快速地构建和部署服务。 以下是在Docker Swarm集群中使用Docker Compose部署服务的一些步骤: 1. 编写Docker Compose文件:在本地编写一个Docker Compose文件,描述需要运行的服务、镜像和配置等信息。例如,下面是一个简单的Docker Compose文件: ``` version: '3.7' services: web: image: nginx:alpine deploy: replicas: 2 resources: limits: cpus: '0.5' memory: 512M restart_policy: condition: on-failure ports: - "80:80" - "443:443" ``` 2. 上传Docker Compose文件:将Docker Compose文件上传到Swarm集群管理节点。 3. 部署服务:使用`docker stack deploy`命令部署服务,例如: ``` docker stack deploy --compose-file docker-compose.yml my-app ``` 其中,`--compose-file`参数指定了使用的Docker Compose文件,`my-app`是服务的名称。 4. 验证服务:使用`docker service ls`命令可以查看部署服务列表,使用`docker service ps <service>`命令可以查看服务的运行状态。 ``` docker service ls docker service ps my-app_web ``` 以上就是在Docker Swarm集群中使用Docker Compose部署服务的一些步骤。通过使用Docker Compose可以快速地构建和部署服务,而Docker Swarm可以方便地管理和扩展服务,两者结合使用可以大大提高服务的可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值