原文链接:http://www.dubby.cn/detail.html?id=8739

准备知识

  • 安装Docker(版本最低1.13)。
  • 阅读完Docker入门六部曲——Swarm,并且完成其中介绍的内容。
  • 拷贝一份docker-compose.yml
  • 确保你的虚拟机都是可用的,使用docker-machine ls查看,执行docker-machine start myvm1来启动管理节点,执行docker-machine myvm2启动工作节点。

介绍

Docker入门六部曲——Swarm中,我们学会了如何配置一个swarm集群,并且知道如何在swarm集群上部署应用。

现在,我们开始了解Docker层级关系中的最高一个层级——stack。一个stack就是一组有关联的服务的组合,可以编排在一起,一起管理。

我们在Docker入门六部曲——Swarm中部署的是一个单一的服务。现在我们来尝试部署多个服务。

docker-compose.yml中添加服务是很简单的。首先,我们添加一个可视化的服务来监控我们的swarm中运行了哪些容器。

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
networks:
  webnet:

我们只做了一件事,就是加了一个和web服务平级的服务visualizer。你可以看到一些新的东西:volumes,给这个可视化服务访问宿主机的socket文件的权限;placement,确保这个服务只会运行在swarm的管理节点上。这个可视化服务是一个开源项目,可以用一个图来看到整个swarm上运行的容器。

2、把这个docker-compose.yml拷贝到管理节点上:

docker-machine scp docker-compose.yml myvm1:~

3、使用docker stack deploy部署:

$ docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"
Updating service getstartedlab_web (id: angi1bf5e4to03qu9f93trnxm)
Updating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)

4、可视化服务
使用docker-machine ls查看虚拟机的ip,打开浏览器,访问ip:8080:

visualizer正常运行在管理节点上,还可以看到有5个web的容器在运行。你还可以使用docker stack ps <statck>来证实这个:

docker-machine ssh myvm1 "docker stack ps getstartedlab"

持久化数据

我们继续添加一个服务,来持久化数据。

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:
      - ./data:/data
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

Redis有一个官方的镜像,名字就是redis,没有username/repo。端口是6379,这是预先配置好的。

最重要的是持久化redis的数据:
+ 要保证redis只会运行在管理节点上,这样就可以让redis运行在同一个文件系统上。
+ redis访问的文件路径是一样的,这样就可以从这个路径来读取和存储文件。

2、在管理节点上创建redis的数据持久化路径

$ docker-machine ssh myvm1 "mkdir ./data"

3、上传新的docker-compose.yml

$ docker-machine scp docker-compose.yml myvm1:~

4、再部署一次

$ docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"

5、打开浏览器,访问http://localhost


再使用visualizer来查看一下。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐