Docker 基本命令( Version:18.09.2,Win10,堆)

在此部分中,您将学习分布式应用程序层次结构的顶层:堆栈。堆是一组相互关联的服务,它们共享依赖关系,并且可以放在一起协调工作。单个堆栈能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能希望使用多个堆栈)。

好消息是,当您创建Compose文件并使用时,docker stack deploy命令一直在使用堆栈。但这是在单个主机上运行的单个服务堆栈,这通常在生产中是不会发生的。在这里,您可以学习使多个服务相互关联,并在多台计算机上运行。

添加新服务并重新部署

将服务添加到我们的docker-compose.yml文件很容易。首先,让我们添加一个免费的可视化服务,让我们看看swarm如何调度容器。

  1. docker-compose.yml在编辑器中打开并用以下内容替换其内容。请务必更换username/repo:tag镜像详细信息。

    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为键的键值,让可视化工具访问Docker的主机套接字文件,以及placement为键的键值,确保该服务只能在swarm管理器上运行 - 绝不能是一个worker。这是因为这个服务的镜像是由Docker创建的一个开源项目构建的,它用图将在swarm运行的Docker服务展示出来

  2. 确保您的shell配置为与myvm1通信,(完整示例在此处)。

    • 运行docker-machine ls以列出计算机并确保已连接到myvm1,注意命令输出的myvm1行active列为*时才代表你将当前shell配置成功。

    • 运行docker-machine env myvm1,然后运行给定命令以配置shell。

      Mac或Linux上,命令是:

      eval $(docker-machine env myvm1)
      
      

      Windows上,命令是:

      & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
      
      
  3. 在Swarm管理器上运行docker stack deploy命令,并更新服务:

    $ docker stack deploy -c docker-compose.yml getstartedlab
    Updating service getstartedlab_web (id: angi1bf5e4to03qu9f93trnxm)
    Creating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)
    
    
  4. 查看可视化工具。

    在Compose文件中我们定义的visualizer服务的发布在端口8080上。通过运行docker-machine ls获取其中一个节点的IP地址加上端口8080,您可以看到visualizer可视化工具:

    Visualizer

    visualizer正如您所期望的那样,以单个副本运行在管理器上,并且5个web实例分布在整个集群中。您可以通过运行docker stack ps <stack>来证实:

    docker stack ps getstartedlab
    

    visualizer可视化工具是一个独立的服务,可以在任何app的堆栈中添加visualizer服务,它不依赖于任何其他东西。现在让我们给我们的应用添加一个依赖的服务:Redis的服务,提供访客计数器。

持久化数据

让我们再次通过相同的工作流程来添加Redis数据库来存储应用数据。

  1. 保存这个新docker-compose.yml文件,最后添加一个Redis服务。请务必更换username/repo:tag镜像详细信息。

    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,因此username/repo这里没有注释。Redis端口6379已由Redis预先配置为从容器暴露给主机,在我们的Compose文件中,我们将它从主机暴露给外界,因此您实际上可以输入任何节点的IP将节点导入Redis Desktop Manager并管理此Redis实例。

    最重要的是,redis规范中有一些事情会使数据在此堆栈的部署保持不变:

    • redis 总是在管理器上运行,所以它总是使用相同的文件系统。
    • redis定义本机文件系统中任意目录作为Redis存储数据的位置。(回想一下docker-machine env myvm1输出的命令将当前命令行配置为与myvm1通信)

    总之,这是在本机的物理文件系统中为Redis数据创建“真实来源”。如果没有这个,Redis会将其数据存储到容器的文件系统的 /data目录,如果重新部署该容器,数据将会被删除。

    真相:

    • 在Redis服务上的placement约束,确保它始终使用相同的主机。
    • 您创建的容器允许容器访问./data(在本机上)作为容器内的/data(在Redis容器内)。当堆栈部署后时,存储在./data本机上的文件仍然存在,从而实现持久性。

    你现在可以开始部署一个依赖于redis服务的堆栈。

  2. 在管理器上创建一个目录./data

    docker-machine ssh myvm1 "mkdir ./data"
    
    
  3. 确保您的shell配置为与myvm1通信(完整示例在此处)。

    • 运行docker-machine ls以列出计算机并确保已连接到myvm1,(active 列值为*)。

    • 如果需要,请重新运行docker-machine env myvm1,然后运行给定命令以配置shell。

      Mac或Linux上,命令是:

      eval $(docker-machine env myvm1)
      
      

      Windows上,命令是:

      & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
      
      
  4. 再执行一次docker stack deploy

    $ docker stack deploy -c docker-compose.yml getstartedlab
    
    
  5. 运行docker service ls以验证三个服务是否按预期运行。

    $ docker service ls
    ID                  NAME                       MODE                REPLICAS            IMAGE                             PORTS
    x7uij6xb4foj        getstartedlab_redis        replicated          1/1                 redis:latest                      *:6379->6379/tcp
    n5rvhm52ykq7        getstartedlab_visualizer   replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
    mifd433bti1d        getstartedlab_web          replicated          5/5                 gordon/getstarted:latest    *:80->80/tcp
    
    
  6. 检查一个节点上的网页,例如http://192.168.99.101,查看访问者计数器的结果,该计数器现已存在并在Redis上存储信息。

    redis

同时,检查在任一节点的IP地址,端口8080的可视化工具,并注意看rediswebvisualizer服务。

visualizer

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容