我正在尝试将 Docker 容器集成到我的简单 CI 管道中以部署 web 应用程序。
我有 3 个容器,分别是 nginx、tomcat 和 mysql。
我了解了如何使用 Dockerfiles 创建这些容器并将它们链接在一起的基础知识。
我的工件已上传至 Nexus 服务器,并且我看到了在 Docker 容器上部署工件的不同方法。
一种方法是重建 tomcat 容器,拉取新生成的工件,并使用 Dockerfile 中的 ADD 将其复制到容器中。
另一种方法是启动不变的 Tomcat 容器,并在包含从 nexus 获取的新工件的主机上安装一个卷。
我不明白从“docker 角度”来看什么是正确的方法。我可以看到,在具有某些配置的容器的可重用性与一个固定容器之间存在权衡,我可以直接发送和运行该容器,而无需提供用于部署的 webapp 文件夹等额外流程。
这是我的一个普遍困惑。nginx 容器也一样。配置文件中的特定更改是否会导致容器重建,还是我应该在启动容器时在主机上安装一些文件?
多谢
答案1
Docker 的优势之一是简化和自动化开发过程的各个部分。我认为实现此目标的最佳方法是重建容器。在存储库中管理简单的配置和小文件,将工件作为 Dockerfile 过程的一部分复制到 Docker 容器中。这样,每当您必须进行代码更新时,只需滚动一个新的 Docker 容器即可。共享已安装的卷也可以,但我认为您应该尽可能避免这样做。我这样说的原因是,已安装的卷更难与 SELinux 一起使用。SELinux 现在可以在启动时自动为每个 Docker 容器生成 MCS 标签,这基本上将其限制在其目录中。这大大降低了主机的风险,因为默认情况下容器不以任何有意义的方式包含内容。
答案2
如果你使用可以通过卷访问最新代码的固定容器,或者你构建了嵌入最新代码的新 Docker 镜像,那么这并不重要。
只有在第一种情况下,您只需构建一次并运行多次,而在第二种情况下,您必须每次都构建并运行一次。
如果您使用 Docker 部署到生产环境,那么我会尝试让我的 CI 管道生成 docker 镜像,因为它们将在生产中使用。