当前位置: 首页 > 工具软件 > docker-stacks > 使用案例 >

Docker 学习笔记(五):栈(Stacks)

方河
2023-12-01

    概述:一个stack是一个分享依赖、相互协作的相关服务的集合。一个stack就足以定义和协调整个APP的功能。(虽然非常复杂的应用需要多个stack)。在服务中,我们已经介绍过stack(使用docker stack deploy去部署Compose文件),但那只是运行在单一主机上的单一服务stack,而现在我们要学会使服务相互依赖,并运行在多台机器上。

(一)加入新服务 & 重新部署

    加入新服务:编辑docker-compose.yml 加入一个免费的观察者服务(让我们知道swarm是如何规划容器的)

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"    # giving the visualizer access to the host’s socket file for Docker
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"    # ensuring that this service only ever runs on a swarm manager -- never a worker
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

    重复之前的步骤:

  • 保证你的shell被配置的与myvm1对话;
docker-machine env myvm1
  • 使用docker stack deploy部署;
docker stack deploy -c docker-compose.yml getstartedlab
  • 通过IP地址访问;

    可以看到visualizer服务会运行在管理员机器上,其他五个web服务的实例分散在swarm中,你可以通过以下命令去验证:

docker stack ps getstartedlab

    但是visualizer服务是独立的,它不依赖于任何其他东西,可以运行在任何把它添加进stack的应用中,现在让我们创建一个有依赖的服务——Redis。

(二)保留数据

    通过加入Redis服务去储存应用数据

    1)编辑docker-compose.yml文件

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - "/home/docker/data:/data"
    deploy:
      placement:
        constraints: [node.role == manager]
    command: redis-server --appendonly yes
    networks:
      - webnet
networks:
  webnet:

    Redis服务在Docker库中有官方镜像,并且可以直接使用'redis'作为镜像名字,而不需要使用‘用户名/仓库’的形式。6379端口被Redis预配置为从容器暴露到主机的端口,在这里的配置中,我们直接将端口从主机映射到外部——可以直接通过IP地址进入Redis桌面管理端,从而管理Redis实例。

    注意:在Redis规范中,以下几点使数据在stack的不同部署(deployments)中得以保持:

  • 永远运行在管理员机上,从而永远使用相同的文件系统;
  • 访问主机文件系统中一个任意的文件夹作为‘/data’(在容器中)——Redis用来储存数据

    以上两点使得本机的物理文件系统作为Redis数据的储存位置是“唯一真理”,如果没有它们,Redis将会把数据储存在容器的文件系统的/data文件夹中——当容器被重新部署时就会被清空。

    这个“唯一真理”包含两个组件:

  • ‘placement’约束保证了永远使用同一个主机;
  • ‘volume’:让容器将‘./data’(主机上),作为‘data’(Redis容器内部)。无论容器如何变化,储存在特定主机上的‘./data’始终不变,保证了连续性。

    2)在管理员机上创建data文件夹

docker-machine ssh myvm1 "mkdir ./data"

    3)保证当前shell被配置为与myvm1对话,重新部署应用:

docker stack deploy -c docker-compose.yml getstartedlab

    4)运行docker service ls验证服务运行成功;

    5)检查任意节点上的网页,如:http://192.168.99.101,查看visitor统计结果;检查运行在8080端口的观察者服务;

 类似资料: