部署Docker前必须问自己的四个问题
2013年4月Docker被正式发布开源,所以在软件行业中Docker还很年轻。像我这样的网虫(nerds),对于这么明星耀眼的软件,首先看到的是它的潜质,并思考如何开始在各种场景下的使用它。
现在很多博主仍在聚焦Docker的优势,而我们感觉到已经是时候认真的询问在什么场景下、为什么这是我们最佳的选择方案。而且更重要的是,当你可能在两者之间做出最好抉择的时候。在慎重思考以下几点后,我们最终没有将Docker用于生产环境。但是,如果你已经将Docker用于生产,我们也愿意听一下你的原因。
我将在这篇文章中分享一下我们的一些发现和一些关键问题的概括,如果你也有计划实施使用Docker,这些问题你应该会遇到的。
我们也希望从你们那里听到:你认为是什么驱动你采用Docker的?你怎么看待未来工具的变化?你期望它们能做到什么地步?
1-你到底需要做多少?
Docker提供功能广泛,这里有几个的例子:
Images(镜像):Docker可以通过Pull和Push命令构建对象到服务中心
Containers(容器):Docker可以通过Start/Stop命令管理容器的生命周期
Logging(日志):Docker可以通过stdout,stderro捕获输出所有的容器内部信息
Volumes(存储):Docker可以创建和管理容器的相关文件存储
Networking(网络):Docker可以创建管理虚拟的接口和内部所有容器之间的网络桥接
RPC:Docker服务器提供允许外部程序去控制所有容器的行为的API
提供的功能越多必然会增加一定程度的复杂度,据使用sloccount 统计,仅仅在main repo中就有97100行代码。它们在Docker中全有或者全部没有关系。所有的特性被打包到一个二进制的文件中,没有方法可以实现只打进去一半。所以,如果你准备开始使用Docker,就应该考虑是否需要它提供的这些功能。
2-搞这么复杂值得吗?
一年前,我们为了寻找方法简化构建运行时的管理,开始了Docker跟Jenkins结合使用。开始这个想法后我们不得不开始担忧构建依赖或同时构建造成的环境污染等问题。每一次在新容器的构建,Docker将被隔离。这个做法(指隔离Docker的操作,译者注)在我们仅仅需要Java和Docker而不必处理其它的冲突依赖时简化了我们的设置。
做了这些工作良好的运行了一段时间后,也引入了不少的问题。管理运行时容器并非是不重要的,我们要清理掉旧的容器会留下的文件目录,否则可能最终引起机器故障。
为了解决这些问题,我们不得不构建了一个包装工作(参考cide)来管理Docker容器的每次构建。
当cide构建时,我们也会和Dockerfile构建者关注一些灵活性问题,它不能较好的使用Gemfiles来适应私有库的依赖管理。仅仅是获取运行时和清理工作至少要花费三次的不同迭代。
最终新的解决方案要比先前的好。但是我们觉到这些可以更加简单 ,可以跟工具集更紧密的结合。像所有优秀的开发者一样,你可以在一个在抽象层寻找一个解决方案,但是它并不是那么完美。
3–你能处理故障吗?
Pusher的例子略微小众化,因为我们有长期运行的客户端连接,这些连接有偿提供给我们的客户以便可靠快速的使用。我们必须先限制分发用户的数量。实际上,当我们部署时就已经采取额外的步骤去限制故障了(参考crank的实例)。
Docker是按一个月或者两个月的频次发布新的版本,你很可能像通过二进制更新到最新版。但是,由于Docker是结构化层次的,要想升级就必须关闭宿主机上的所有的容器。这就必然会增加引入新的故障挑战。
目前,这是我们放弃在主生产环境使用Docker最大的原因。我们计划通过替换整个机器环境,通过重定向转换DNS流量,但是直到现在我们也没有解决这个问题。依据你应用程序的架构,这些经验也可以为提供一些建议。
如果你在此处不太注意,就会发现自己重建整个应用程序只是为了适应这种模式而已。这也是我们决定放弃使用Docker的另一个原因。我们怀疑它能添加延迟和一些额外的开销。
4–你有技术支持吗?
最终还是想想看吧,你需要扪心自问你具有操作知识吗?我们发现找到详细的实例Docker部署信息非常困难。我们遇到的都是一些操作的问题以及如何处理它们。
一旦你深入发掘Docker的更多操作,你就发现网上的一点点文档完全不够的。所以有两种方式获得问题的解答:要么多花费时间思考问题,多去论坛交流刷刷问题,或者你总是能搜索到Docker提供的专门支持问题。
本质上,能搜索的是有很多的基础入门信息,但是很少量的信息是在最优解和可操作性上是可用的。超过现在的水平去理解它是一个长期的实用解决方案这个问题是很难做到的。我们想给正在做出决定的人提供一点力所能及的帮助,这也是我们分享这篇文章其中原因之一。
那么我们应该部署Docker吗?
最后这是一个你自己能回答的问题。根据你的使用情况,Docker中无所不包的方法是完美的。 如果说万丈高楼平地起,它确实是一个不错的开端。
但是如果你已经有一个已经发布架构,你就应该问一下自己到底是否真的合适了。我们建议先规划好你的应用程序蓝图,确认你应该需要什么功能,然后检测这些功能Docker是否提供。如果你在构建一些很简单的应用,它可能不是你的理想工具。如果上线的时间是一个障碍,它可能也不是你的理想工具。
对于那些已经运行在Docker生产环境的,我们很乐意想听你们对于工具的发现和怎么在社区交流中得到一个真实的交流从而改善社区的经验。
本文作者:佚名
来源:51CTO
如何正确地使用 Docker 在云服务器上部署 MongoDB v6 数据库并连接 本篇文章将向各位读者介绍使用 Docker 在云服务器上部署 MongoDB v6,并使用免费的 Studio 3T 连接数据库。本文弥补了网上既有方案的一些不足,解决了一些部署中的常见问题,有助于提升部署效率。
17-微服务技术栈(高级):Docker部署RabbitMQ镜像模式 默认情况下,队列只保存在创建该队列的节点上。而镜像模式下,创建队列的节点被称为该队列的主节点,队列还会拷贝到集群中的其它节点,也叫做该队列的镜像节点。但是,不同队列可以在集群中的任意节点上创建,因此不同队列的主节点可以不同。甚至,一个队列的主节点可能是另一个队列的镜像节点。用户发送给队列的一切请求,例如发送消息、消息回执默认都会在主节点完成,如果是从节点接收到请求,也会路由到主节点去完成。镜像节点仅仅起到备份数据作用。当主节点接收到消费者的ACK时,所有镜像都会删除节点中的数据
TencentOS Server 配置 docker / docker-compose 一键部署 redis,rabbitmq 容器 TencentOS Server (tlinux 3.1)配置 docker,compose 工具,并一键部署多容器(redis,rabbitmq)。TencentOS Server 是腾讯公司自主研发的定制化服务器操作系统。该系统集成了众多服务 器系列的优点,加入自主研发的软件,便于用户操作使用,提供全方位(内核及用户态)的 操作系统支持...
相关文章
- 【教程分享】一键部署MySQL,轻松搞定Docker安装和配置!
- Docker介绍,常用命令,应用部署,迁移与备份,Dockerfile,私有仓库
- Docker Compose:链接外部容器的几种方式
- Got permission denied while trying to connect to the Docker daemon socket
- openwrt ipv6 docker的问题
- Jenkins+Docker+Gitee+SpringBoot自动化部署
- 快点来学吧!docker部署jar包分离
- Docker Oracle DataBase
- Liveness 探测 - 每天5分钟玩转 Docker 容器技术(143)
- Calico 的默认连通性 - 每天5分钟玩转 Docker 容器技术(69)
- 如何自定义容器网络?- 每天5分钟玩转 Docker 容器技术(33)
- Docker 运行 MongoDB的简单办法
- Docker容器进入-命令行只显示-bash-4.1#
- Docker 系列七(Dubbo 微服务部署实践).
- 部署私有Docker Registry
- 【DevOps】docker安装nexus3,配置nginx代理(更新于2022.04.30)
- Docker compose 调用外部文件,指定hosts,部署数量,指定部署节点例子
- 使用普通用户执行 docker
- AspNetCore容器化(Docker)部署(四) —— Jenkins自动化部署
- docker:从零开始部署一个python的hello world并debug(其他语言同理)
- 通过Docker来部署Mesos集群
- Docker自动部署Apache Tomcat
- 用Puppet和Docker构建工具来自动化容器产品部署
- Docker 在 Uber 服务部署中的应用
- windows上部署docker小记录
- DolphinScheduler 之Docker 部署
- 在容器部署上Docker不一定最佳
- docker 在centos7中设置 DOCKER_OPTS
- Docker系统知识整理(从安装到熟练操作)
- 离线安装docker最新版,记得要以下三个包。
- docker+docker-compose+nginx前后端分离项目部署
- ASP.NET Core开发-Docker部署运行
- 基于网络安全的 Docker 逃逸