何时从Docker仓库拉取,何时从Git仓库拉取并构建?

30
假设我有一台机器。可以是单个生产服务器、集群中的一个生产节点、某种类型的演示服务器、用于测试的服务器或集群,或者是开发人员工作站。或者其他类型的机器。
现在我想将应用程序部署到这台机器上并运行它。我可以使用 git pull && docker build 命令,也可以只使用 docker pull 命令。或者我可以使用 git pull 命令将代码拉到另一台机器上,然后使用 scp 命令进行传输。或者我可以将 Docker 镜像文件导出为 tar 文件,然后使用 docker load 命令而不是 docker pull 命令进行部署。
当然,Git 和 Docker 是完全不同的工具,通常同时使用。但是,两者都有仓库,并且都可以用来存储和交付代码。甚至命令本身都叫做 push 和 pull。Docker 甚至有类似于提交的镜像标签,因为标签还有助于保留应用程序的几个版本。
甚至有一款完全基于 Git 的应用程序交付工具,名为 Capistrano。Capistrano 使用 git pull 命令将代码拉到另一个目录,然后将符号链接重定向到该目录以进行部署。
问题是在决定是否使用 git pulldocker pull 命令来交付代码时应该考虑哪些原因?
3个回答

39

像其他答案所说,Git是用于版本控制,例如文本文件。

你可以从“Dockerfile”(一种文本文件)构建一个docker容器。 这个“Dockerfile”与许多其他文件和文件夹放在同一个目录中。

因此,如果您将包含Dockerfile的目录放入Git存储库中,则可以让所有有权限的人使用相同的配置构建相同的docker容器。

这就是你的意思吗?

那么,Docker容器是一个“建筑物”,而DOCKER存储库是可以从其中下载已构建的建筑物(图像)的市场。您可以使用GIT存储库中的文件(类似于大型文档存档)来创建“建筑计划”。您可以通过Git“共享”不同版本的“建筑计划”,以便每个人都可以建造每个版本的建筑物。

示例工作流程:

在您的开发环境(本地计算机)中:

  1. git pull - 从git存储库(例如dockerfile)拉取“建筑指令”
  2. docker build - 从Dockerfile指令构建Docker映像
  3. docker push myDockerRepo/myDockerImage:latest - 将新构建的Docker映像推送到DOCKER存储库(而不是Git存储库)

在您的生产环境中:

  1. docker pull myDockerRepo/myDockerImage:latest - 从DOCKER存储库中拉取最新的Docker映像
  2. docker run - 从Docker映像运行新的容器化实例(基本上是一个虚拟机)

1
是的,那就是我的意思。在生产环境中构建镜像也可以吗?还是应该拉取它们?什么时候拉取镜像是有用的? - Gherman
1
这正是我在寻找的答案!(: 谢谢 - LeaveAirykson
1
@eli 为什么不直接在生产环境使用git pull并构建镜像,而不使用docker hub呢?抱歉,我只是两天前开始学习docker。为什么需要dockerhub?从git获取的镜像和本地推送到dockerhub的镜像有什么区别吗? - Arbin Shrestha
1
你当然可以这样做。但是你安装在电脑上的每个应用程序都是自己构建的吗?还是只是下载和安装应用程序?我认为确实有人会从源代码构建每个应用程序。我认为这里的问题更加普遍 - 或者说是“最佳实践”。所以再次强调:你可以做你所要求的事情,这完全是可能的 - 但在生产环境中(指公司/严肃的上下文),(我认为!)这将不被建议。也许一个实际的答案是:构建东西比使用最终产品更复杂/需要更多时间。 - MacMartin
谢谢。这确实帮助我澄清了一些事情。 - Cyrill
显示剩余5条评论

18

Docker和Git是两种完全不同的技术。 Git是源代码管理解决方案,而在docker中你可以在docker容器中运行应用程序。把它看作是一种“新的”虚拟化技术。 你可以同时使用两者,没有问题。

....编辑....

Docker不会保留您的源代码副本。使用docker,您可以基于源代码构建镜像并将其放入存储库中。从该镜像中,您可以在docker容器中运行应用程序。因此,就工作流程而言,您只需使用git进行开发,然后使用Docker进行部署...


1
我很清楚它们是什么以及它们如何工作。但我不知道该如何使用它们,两者都不知道。具体来说,就是git+docker的工作流程。 - Gherman
3
Docker 不会保存源代码的副本。使用 Docker,您可以基于源代码构建一个镜像并将其放入仓库中。从该镜像中,您可以在 Docker 容器中运行应用程序。因此,就工作流程而言,您只需使用 git 进行开发,使用 Docker 进行部署... - Run CMD
2
这就是我想知道的全部。只需将最后一句话放到答案中即可。我的问题有什么问题吗? - Gherman
3
我不知道,也许不够清楚。但我没有点踩…… - Run CMD

2
Docker的push命令将您的镜像推送到Docker仓库,镜像不是源代码,尽管可能包含源代码,并且连续推送镜像会覆盖彼此而且不提供版本控制。它用于拉取镜像和运行容器。Docker Repo更多信息 另一方面,git push将您的源代码和其他文件推送到远程存储库。这是为了版本控制。您可以从源代码构建应用程序并拉取、分叉或拉取请求到远程git存储库。Git Repo更多信息 它们可以一起使用,并且实际上被许多开发人员一起使用。它们旨在解决不同的问题。

1
假设我是一个两人开发团队中的开发人员。我对代码进行了更改,另一个开发人员希望在他的机器上使用我的更改。我们都使用 Docker 和 Git。我是应该将更改 push 到 git 上?还是 push 镜像?他是应该从镜像获取代码?还是从 git 上获取?他是否需要从 Docker 仓库拉取镜像?还是总是根据 Dockerfile 构建它?我是否应该在生产环境中使用 Git?还是只拉取镜像? - Gherman
1
如果你修改了代码,你应该想要将其放在版本控制环境中,因此你应该使用git来推送你的代码,这样你的同事就可以拉取你的代码。当你想要部署你的项目到测试环境时,你可以创建一个工作镜像并将其推送到Docker仓库,然后从测试环境中拉取它并创建一个容器。 - Murat Güvenç

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接