如何在开发中使用docker

时间:2019-03-29 12:46:39

标签: docker

我是docker的新手,我在docker上做了一些基础工作,例如如何构建映像,如何创建容器,dockerfile.yml是什么,docker-compose.yml文件是做什么等。在我的本地机器上。在使用docker进行实时开发时,我遇到以下问题。

1)团队中的每个开发人员都必须在docker上进行开发并在其本地计算机上创建映像并将其推送到docker Registry吗?还是开发人员在没有docker的情况下工作,一个人将根据提交的代码创建最终映像?

2)对于每个发行版,我们都维护该发行版的容器或映像吗?

3)维护数据库的最佳实践是什么,即我们将数据库合并到映像中并构建容器,还是仅包含与应用程序相关的事物并构建映像和容器,并且此容器将与外部的数据库进行通信容器还是物理数据库服务器?

谢谢。

2 个答案:

答案 0 :(得分:1)

此类问题通常没有明确的答案。这在很大程度上取决于您的公司,您的团队,所使用的工具,软件堆栈等。最好的办法是依靠组织中的高级开发资源和高级技术领导力来帮助确定解决方案。这样的问题。

用盐筒仓来回答以下问题,因为无法确切回答这些问题。

1)取决于对开发人员最方便的功能以及所使用的语言。一些开发人员发现全容器工作流程很方便,一些开发人员发现他们可以使用现有的IDE / CLI工作流程更快地进行迭代,并最后对运行的容器映像进行测试。

在大多数情况下,您将希望让CI / CD工具处理要用于生产的版本。

2)是。您可以为此使用容器标记。

3)可以在容器中运行数据库,但是除非您的团队有容器和容器编排方面的经验,否则我会将数据库留在传统的裸机或VM上。

容器是围绕单个Linux进程的精美包装。通常,经验法则是一个过程的一个容器。您不应该在一个容器中合并多个对象。 (当您讨论诸如Red Hat OpenShift或Kubernetes之类的内容时,这个故事会变得稍微复杂一些,因为讨论的重点是每个吊舱有多少个容器)。

答案 1 :(得分:1)

  1. 我习惯的设置是,开发人员通常会忽略Docker,直到他们需要部署它为止。诸如Node的node_modules目录或Python的虚拟环境之类的工具可以帮助将子项目彼此隔离。任何开发人员都应该能够运行docker build来构建映像,但是通常直到测试特定更改的最后阶段才需要这样做。您应该部署一个持续集成系统,该系统将负责测试和构建每个提交的最终Docker映像。

  2. 您永远不会“维护容器”。如果某个容器出了问题,请将其删除并重新开始。您的CI系统应该为每个版本构建一个映像,并且应该部署一个注册表来保存这些映像。

  3. 您永远不应将数据库与应用程序放在同一容器中。 (请参阅前面有关定期删除容器的要点。)我的经验通常是生产数据库非常重要和特殊,可以利用它们自己的专用非Docker主机,但是在Docker中运行数据库实际上并没有错。只要确保您知道如何进行备份,还原和迁移以及其中的其他操作即可。

出于技术原因,您不能使用Docker Compose进行生产,但是如果您最终需要在多个物理服务器上部署应用程序,则可能会遇到限制。 Kubernetes更为复杂,但似乎是该领域的当前赢家。 Docker Swarm势头强劲; Hashicorp Nomad在那里。或者您可以手动构建手动部署系统。 (请注意,至少Kubernetes和Nomad在“发生了一些变化,因此我将要删除并重新创建容器”的概念上都非常重要,并且都使得在准生产设置中进行实时开发变得非常棘手。) / p>

还要注意,在我所说的“部署”中,所有这些东西都有公共云版本(Docker Hub,CircleCI,端到端解决方案,包括注册表以及基于AWS或Azure或GCP构建的Kubernetes)并且,如果您对付出的努力折衷以及在构建/部署链中使用外部服务的含义感到满意,那么这些可以帮助您更快地开始使用