docker 入门5 - 栈 【翻译】
入门,第 5 部分:堆栈
先决条件
安装 Docker 版本 1.13 或更高版本。
获取第 3 部分先决条件中所述的 Docker Compose。
获取 Docker Machine,如第 4 部分先决条件中所述。
阅读第 1 部分中的方向。
了解如何在第 2 部分中创建容器。
确保通过将
friendlyhello镜像推送到registry来发布您创建的friendlyhello镜像。我们在这里使用那个共享镜像。确保镜像用作已部署的容器。运行此命令,在信息中键入
username,repo, 和tag:docker run -p 80:80 username/repo:tag,然后访问http://localhost/。请从第 3 部分获得
docker-compose.yml的副本。确保第 4 部分中设置的机器已运行并准备就绪。运行
docker-machine ls来验证这一点。如果machines停止,则运行docker-machine start myvm1以启动管理器,然后运行docker-machine start myvm2以启动辅助角色。让你在第4部分创建的群运行并准备就绪。运行
docker-machine ssh myvm1 "docker node ls"来验证这一点。如果群已启动,则两个节点都会报告ready。如果没有,请重新初始化群并加入工作人员,如设置群中所述。
介绍
在第 4 部分中,您学习了如何设置一个swarm,即运行 Docker 的machines群集,并将应用程序部署到该swarm,容器在多台计算机上协同运行。
在第 5 部分中,您将到达分布式应用程序的层次结构的顶部: stack。stack是一组共享依赖项的相互关联的服务,可以一起编排和缩放。单个stack能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能希望使用多个stack)。
一些好消息是,自第 3 部分以来,您一直在使用stack,此时您创建了一个Compose文件并使用 docker stack deploy。但是,这是在单个主机上运行的单个服务stack,这通常不是生产环境中发生的情况。在这里,您可以获取所学知识,使多个服务彼此相关,并在多台计算机上运行它们。
你做得很好,这是the home stretch!
添加新服务并重新部署
很容易将服务添加到我们的 docker-compose.yml 文件中。首先,让我们添加一个免费的可视化工具服务,让我们看看我们的群是如何调度容器的。
在编辑器中打开
docker-compose.yml,并将其内容替换为以下内容。请务必将username/repo:tag替换为image详细信息。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
networks:
webnet:这里唯一的新东西是对
Web的平级服务,名为visualizer。请注意两个新内容:volumes关键字,允许可视化工具访问 Docker 的主机套接字文件,以及placement关键字,确保此服务仅在swarm manager上运行 - 从不为worker运行。这是因为此容器由 Docker 创建的开源项目构建,显示在关系图中的swarm上运行的 Docker 服务。我们马上就更多地讨论placement constraints和volumes。
确保shell配置为与
myvm1对话(完整示例在此处)。运行 docker-machine ls 列出计算机并确保已连接到 myvm1,如其旁边的星号所示。
如果需要,请重新运行 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
在manager上重新运行
docker stack deploy命令,并且需要更新的任何服务都得到更新:$ docker stack deploy -c docker-compose.yml getstartedlab
Updating service getstartedlab_web (id: angi1bf5e4to03qu9f93trnxm)
Creating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)看看visualizer可视化工具。
您在Compose文件中看到可视化工具
visualizer在端口 8080 上运行。通过运行 docker-machine ls 获取其中一个节点的 IP 地址。转到端口 8080 中的任一 IP 地址,您可以看到可视化工具正在运行:
可视化工具
visualizer的单个副本正按预期在manager上运行,并且Web的 5 个实例分布在swarm中。您可以通过运行docker stack ps <stack>来证实此可视化效果:docker stack ps getstartedlab
可视化工具
visualizer是一个独立的服务,可以在包含它在stack中的任何应用中运行。它不依赖于任何其他内容。现在,让我们创建一个确实具有依赖项的服务:提供访问者计数器的 Redis 服务。
保留数据
让我们再次通过相同的工作流来添加用于存储应用数据的 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 库中具有官方镜像,并且被授予了刚刚 redis 的简短image名称,因此这里没有用username/repo表示法。Redis 端口 6379 已由 Redis 预配置,以便从容器向主机公开,在我们的Compose文件中,我们将从主机向世界公开它,因此您可以实际将任何节点的 IP 进入 Redis Desktop Manager 并管理此 Redis实例,如果您选择。
最重要的是,
redis有一些使数据在此stack部署之间持久的规范:redis 始终在manager上运行,因此始终使用相同的文件系统。
redis 在容器内以
/data挂载主机文件系统中的任意目录,这是 Redis 存储数据的地方。
总之,这在主机的物理文件系统中为 Redis 数据创建了一个"真相源"。如果没有此,Redis 会将其数据存储在容器文件系统中的
/data中,如果重新部署该容器,该文件系统将消失。这个真理之源有两个组成部分:
在 Redis 服务上标记 placement constraint,确保它始终使用相同的主机。
创建一个 volume ,路径
./data(在主机上)作为/data(在 Redis 容器内)的volume。当容器被拆掉和重新部署时,存储在指定主机上./data上的文件将保留,从而实现连续性。
您已准备好部署新的 Redis-using stack。
在manager上创建 ./data目录:
docker-machine ssh myvm1 "mkdir ./data"
确保shell配置为与
myvm1对话(完整示例在此处)。运行 docker-machine ls 列出计算机并确保已连接到 myvm1,如其旁边的星号所示。
如果需要,请重新运行 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
再运行
docker stack deploy一次。$ docker stack deploy -c docker-compose.yml getstartedlab
运行 docker service ls 以验证三个服务是否按预期运行。
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
x7uij6xb4foj getstartedlab_redis replicated / redis:latest *:->/tcp
n5rvhm52ykq7 getstartedlab_visualizer replicated / dockersamples/visualizer:stable *:->/tcp
mifd433bti1d getstartedlab_web replicated / gordon/getstarted:latest *:->/tcp检查其中一个节点,如
http://192.168.99.101,并查看访问者计数器的结果,该计数器现在实时显示并存储在 Redis 上的信息。
此外,请检查任一节点的 IP 地址端口 8080 处的可视化工具,并注意到
redis服务与Web和visualizer服务一起运行。
回顾(可选)
您了解到, stacks是相互关联的服务,都协同运行,这 - 惊喜!-- 自本教程的第三部分以来,您一直在使用stack。您了解到,要向stack添加更多服务,请将它们插入到Compose文件中。最后,您了解到,通过使用放置placement constraints 和 volumes的组合,您可以创建永久的永久主状态数据,以便在容器被拆掉和重新部署时,应用的数据能够存活下来。
docker 入门5 - 栈 【翻译】的更多相关文章
- 学习Mysql过程中拓展的其他技术栈:Docker入门介绍
一.Docker的介绍和安装 1. Docker是什么 百度百科的介绍: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linu ...
- docker 入门1 - 方向 【翻译】
开始,第 1 部分:方向和设置 欢迎!我们很高兴您想学习 Docker.Docker 入门教程将教您如何: 设置 Docker 环境(当前步骤) 生成映像并将其作为一个容器运行 缩放应用以运行多个容器 ...
- Docker入门教程(五)Docker安全
Docker入门教程(五)Docker安全 [编者的话]DockOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第五篇,介绍了Docker的安全问题,依然是老话重谈,入门者可以通 ...
- Docker入门(七):部署app
这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...
- Docker入门教程(九)10个镜像相关的API
Docker入门教程(九)10个镜像相关的API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第九篇,重点介绍了镜像相关的Docker Remote ...
- Docker入门教程(八)Docker Remote API
Docker入门教程(八)Docker Remote API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第八篇,重点介绍了Docker Remote ...
- Docker入门教程(七)Docker API
Docker入门教程(七)Docker API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第七篇,重点介绍了Docker Registry API和 ...
- Docker入门教程(六)另外的15个Docker命令
Docker入门教程(六)另外的15个Docker命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第六篇,继续介绍Docker命令.之前的第二篇文章 ...
- Docker入门教程(四)Docker Registry
Docker入门教程(四)Docker Registry [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第四篇,介绍了Docker Registry,它 ...
随机推荐
- [题解] [CF1037D] Valid BFS?
题面 题解 一个是模拟BFS的过程 还有一个是可以根据给出的BFS序构树, 再看两棵树是否相同 判断相同的话, 以同一个点为根, 看两棵树中1−
- Protocol Buffers学习笔记
Protocol Buffers学习笔记 1. 简介 Protocol Buffers是google发明的一种数据交换格式,独立于语言,独立于平台.与其他的数据交换格式有所不同,Protocol Bu ...
- nltk data 离线安装
运行程序时发现如下错误: 在命令行下载速度太慢,因此需要离线安装: 按照:http://www.nltk.org/data.html 中manual installation的方法, 将包下载好后解压 ...
- IDEA版本控制工具VCS中使用Git,以及快捷键总结(不使用命令)
场景介绍: 工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 ...
- SQL-W3School-高级:SQL 数据类型
ylbtech-SQL-W3School-高级:SQL 数据类型 1.返回顶部 1. Microsoft Access.MySQL 以及 SQL Server 所使用的数据类型和范围. Microso ...
- 【思考】为什么说Bagging减少variance,Boosting减少bias?(转载)
具体讨论可见于此知乎问题,有很多种理解方向,甚至这一个命题可能本来就不成立!
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_01-页面静态化需求分析
上半部分就是静态化 业务流程如下: 1.获取模型数据 2.制作模板 3.对页面进行静态化 4.将静态化生成的html页面存放文件系统中 5.将存放在文件系统的html文件发布到服务器
- kubernetes监控(12)
一.Weave Scope 1. weave scope 容器地图 创建 Kubernetes 集群并部署容器化应用只是第一步.一旦集群运行起来,我们需要确保一起正常,所有必要组件就位并各司其职,有足 ...
- Linux信号、信号处理和信号处理函数
信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可 ...
- 双目结构光三维扫描仪获得的三维点云模型(GIF)