docker从零开始(五)堆栈初体验,stacks
先决条件
- 安装Docker 1.13或更高版本。
- 获取Docker Compose,请参考第三节
- 按照第四节中的描述获取Docker Machine。
在第二节中了解如何创建容器。
确保您的图像作为已部署的容器运行。运行此命令,在您的信息槽中
username,repo和tag:docker run -p 80:80 username/repo:tag,然后访问http://localhost/。docker-compose.yml从第3部分获得一份方便的副本。确保您在第四节中设置的计算机正在运行并准备就绪。运行
docker-machine ls以验证这一点。如果计算机已停止,请运行docker-machine start myvm1以引导管理器,然后docker-machine start myvm2再引导该工作程序。- 让你在第四节中创建的swarm 运行并准备就绪。运行
docker-machine ssh myvm1 "docker node ls"以验证这一点。如果群集已启动,则两个节点都会报告ready状态。如果不是,重新初始化群和描述中加入worker。
介绍
在第四节中,您学习了如何设置一个群集,这是一个运行Docker的计算机集群,并为其部署了一个应用程序,其中容器在多台计算机上协同运行。
在第5部分中,您将到达分布式应用程序层次结构的顶部:堆栈。堆栈是一组相互关联的服务,它们共享依赖关系,并且可以协调和缩放在一起。单个堆栈能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能希望使用多个堆栈)。
一些好消息是,从第3部分开始,当您创建Compose文件并使用时,您在技术上一直在使用堆栈docker stack deploy。但这是在单个主机上运行的单个服务堆栈,这通常不会在生产中发生。在这里,您可以学习所学内容,使多个服务相互关联,并在多台计算机上运行它们。
添加新服务并重新部署
将服务添加到我们的docker-compose.yml文件很容易。首先,让我们添加一个免费的可视化服务,让我们看看我们的swarm如何调度容器。
docker-compose.yml在编辑器中打开并用以下内容替换其内容。请务必更换username/repo:tag镜像详细信息。
version: ""
services:
web:
# replace username/repo:tag with your name and image details
image: benjamin77/image:part2
deploy:
replicas:
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管理器上运行 - 绝不是一个工人。
这是因为这个容器是由Docker创建的开源项目构建的,它显示了在图中的swarm上运行的Docker服务。
2.确保您的shell配置为与之通信myvm1
[root@docker11 docker_install]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Running tcp://192.168.99.100:2376 v18.06.0-ce
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v18.06.0-ce
[root@docker11 docker_install]# docker-machine env myvm1
export DOCKER_TLS_VERIFY=""
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell:
# eval $(docker-machine env myvm1)
[root@docker11 docker_install]# eval $(docker-machine env myvm1)
[root@docker11 docker_install [myvm1]]#
3.docker stack deploy在管理器上重新运行该命令,并更新需要更新的任何服务:
[root@docker11 docker_install]# eval $(docker-machine env myvm1)
[root@docker11 docker_install [myvm1]]# docker stack deploy -c docker-compose.yml getstartedlab
Creating service getstartedlab_visualizer
Updating service getstartedlab_web (id: 3gnwxgnc10ie0jgmvq19ws5tb)
[root@docker11 docker_install [myvm1]]#
4.看一下可视化工具。
您在Compose文件中看到了visualizer在端口8080上运行docker-machine ls。通过运行获取其中一个节点的IP地址。转到端口8080的IP地址,您可以看到运行的可视化工具:

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

持久化数据
让我们再次通过相同的工作流程来添加Redis数据库来存储应用数据。
保存这个新
docker-compose.yml文件,最后添加一个Redis服务。请务必更换username/repo:tag图像详细信息。
version: ""
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas:
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库中有一个官方图像,并且已被授予imagejust 的简称redis,所以username/repo这里没有注释。Redis端口6379已由Redis预先配置为从容器暴露给主机,在我们的Compose文件中,我们将它从主机暴露给全世界,因此您实际上可以输入任何IP的IP如果您愿意,可以将节点导入Redis Desktop Manager并管理此Redis实例。
最重要的是,redis规范中有一些事项会使数据在此堆栈的部署之间保持不变:
redis总是在管理器上运行,所以它总是使用相同的文件系统。redis访问主机文件系统中的任意目录作为/data容器内部,这是Redis存储数据的位置。
总之,这是在主机的物理文件系统中为Redis数据创建“真实来源”。如果没有这个,Redis会将其数据存储 /data在容器的文件系统中,如果重新部署该容器,将会被删除。
这个真相来源有两个组成部分:
- 您放置在Redis服务上的放置约束,确保它始终使用相同的主机。
- 您创建的容器允许容器访问
./data(在主机上)/data(在Redis容器内)。当容器来来往往时,存储在./data指定主机上的文件仍然存在,从而实现连续性。
您已准备好部署新的Redis-using堆栈。
在管理器上创建一个目录./data:
docker-machine ssh myvm1 "mkdir ./data"
确保您的shell配置为与之通信myvm1
运行
docker-machine ls以列出计算机并确保已连接到myvm1,如下一个星号所示。如果需要,请重新运行
docker-machine env myvm1,然后运行给定的命令来配置shell。eval $(docker-machine env myvm1)
4.再跑
docker stack deploy一次。[root@docker11 docker_install [myvm1]]# docker stack deploy -c docker-compose.yml getstartedlab
5.运行
docker service ls以验证三个服务是否按预期运行。
6.检查一个节点上的网页,例如
http://192.168.99.100,并查看访问者计数器的结果,该计数器现已存在并在Redis上存储信息。
每刷新一次网页 Visits 值会加 1
同时,检查在上的任一节点的IP地址,端口8080的可视化工具,并注意看
redis与一起运行服务web和visualizer服务
docker从零开始(五)堆栈初体验,stacks的更多相关文章
- Docker深入浅出系列 | 容器初体验
目录 Docker深入浅出系列 | 容器初体验 教程目标 预备工作 容器与虚拟化技术 什么是Docker 为什么要用Docker 事例 什么是容器镜像和容器 容器与虚拟机的区别 Vagrant与Doc ...
- docker入门2---docker的初体验
Tomxin7 Simple, Interesting | 简单,有趣 第一个Docker镜像? 尝试运行docker自带的镜像"hello-world",了解docker镜像的下 ...
- Docker初体验
## Docker初体验 安装 因为我用的是mac,所以安装很简单,下载dmg下来之后拖拽安装即可完成. 需要注意的就是由于之前的docker是基于linux开发,不支持mac,所以就出现了docke ...
- VSTO学习笔记(十五)Office 2013 初体验
原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 201 ...
- Python+Flask+Gunicorn 项目实战(一) 从零开始,写一个Markdown解析器 —— 初体验
(一)前言 在开始学习之前,你需要确保你对Python, JavaScript, HTML, Markdown语法有非常基础的了解.项目的源码你可以在 https://github.com/zhu-y ...
- 2.Docker初体验【Docker每天5分钟】
原文:2.Docker初体验[Docker每天5分钟] Docker给PaaS世界带来的“降维打击”,其实是提供了一种非常便利的打包机制.该机制打包了应用运行所需要的整个操作系统,从而保证了本地环境和 ...
- 【docker Elasticsearch】Rest风格的分布式开源搜索和分析引擎Elasticsearch初体验
概述: Elasticsearch 是一个分布式.可扩展.实时的搜索与数据分析引擎. 它能从项目一开始就赋予你的数据以搜索.分析和探索的能力,这是通常没有预料到的. 它存在还因为原始数据如果只是躺在磁 ...
- SpringCloud初体验:五、Sidecar 将 PHP 这类非 Java 生态语言的服务接入 Spring Cloud
先起一个 Sidecar 服务,一个PHP服务一个应用,和PHP服务部署在同一台机子,通过 localhost 访问,这样就解决了网络开销,相当于本地进程间调用 Sidecar 服务比较简单, 1.这 ...
- 五、MyBatis缓存初体验
缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存, 我们可以避免频繁的与数据库进行交互, 进而提高响应速度. 一级缓存初体验(session,默认打开) 同一查询执行两次以上:selec ...
随机推荐
- uva 116 Unidirectional TSP(动态规划,多段图上的最短路)
这道题目并不是很难理解,题目大意就是求从第一列到最后一列的一个字典序最小的最短路,要求不仅输出最短路长度,还要输出字典序最小的路径. 这道题可以利用动态规划求解.状态定义为: cost[i][j] = ...
- 高效的序列化组件 Protobuf-net
什么是ProtoBuf-net Protobuf是google开源的一个项目,用户数据序列化反序列化,google声称google的数据通信都是用该序列化方法.它比xml格式要少的多,甚至比二进制数据 ...
- BZOJ2437 NOI2011兔兔与蛋蛋(二分图匹配+博弈)
首先将棋盘黑白染色,不妨令空格处为黑色.那么移动奇数次后空格一定处于白色格子,偶数次后空格一定处于黑色格子.所以若有某个格子的棋子颜色与棋盘颜色不同,这个棋子就是没有用的.并且空格与某棋子交换后,棋子 ...
- 【题解】POI2014FAR-FarmCraft
这题首先手玩一下一下数据,写出每个节点修建软件所需要的时间和到达它的时间戳(第一次到达它的时间),不难发现实际上就是要最小化这两者之和.然后就想到:一棵子树内,时间戳必然是连续的一段区间,而如果将访问 ...
- BZOJ4569 [SCOI2016]萌萌哒 【并查集 + 倍增】
题目链接 BZOJ4569 题解 倍增的思想很棒 题目实际上就是每次让我们合并两个区间对应位置的数,最后的答案\(ans = 9 \times 10^{tot - 1}\),\(tot\)是联通块数, ...
- 洛谷 P2611 [ZJOI2012]小蓝的好友 解题报告
P2611 [ZJOI2012]小蓝的好友 题目描述 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事,为了回馈各位比赛选手,此题的主角是贯穿这次比赛的关键人物--小蓝的好友. 在帮小 ...
- 一些比较高效的CSS写法建议
当浏览器解析html的时候,它构造了一个文档树来展现所有被显示的元素. 它在特定的样式表中去匹配元素,根据标准的css的层叠,继承和顺序规则, 在mozilla的实现中(可能其他的也是这样),对于每一 ...
- Ubuntu下使用find / -name aaa* 提示“find: 路径必须在表达式之前: XXXX”
在使用find命令查找文件时,出现了如题所示的错误提示,因为之前都是这样用的,也没出过错,这次语法都是一样的居然不行了,很是纳闷. 后来了解到如下的情况: 如果当前所在目录存在要查找的目标文件时会出现 ...
- linux内存条排查
已发现2个内存错误,应用名称(kernel:),日志内容(hangzhou-jishuan-DDS0248 kernel: sbridge: HANDLING MCE MEMORY ERROR han ...
- nginx压力测试和优化配置
115 yum -y install gcc automake autoconf libtool make 116 yum install ctags 117 mkdir -m 644 -p /usr ...