问题描述
正在尝试使用Docker,并希望了解在Jenkins Docker中将构建的应用部署到其他容器的最佳实践。用户的实验环境中有三个Docker容器,目前都在同一台服务器上运行,但未来可能会改变。这三个容器分别是:Git服务器(Gitea)、Jenkins服务器和Web应用(Tomcat)。
用户能够从Git拉取源代码并构建war包,但在部署应用时遇到了困难。用户目前的解决方案是修改Tomcat Docker,以便将构建的war包部署到Tomcat Docker并在Docker内部重新启动。用户已经了解到这种做法是不推荐的,并且理解了其中的原因,因此需要另一种解决方案。
用户还了解到从另一个Docker容器构建Docker容器也被认为是不推荐的做法,并且也理解了其中的原因,因此这也不可行。
用户的另一个想法是通过SSH连接到主机系统,然后将Web应用部署到与Tomcat容器共享的文件夹中,或者重新构建容器。这种方法可能有效,并且如果Tomcat Docker迁移到不同的主机上,也是未来可行的,但从用户有限的Docker理解来看,这种方法不太符合Docker的思想。
最后一个想法是使Tomcat Docker容器自己构建Web应用,即执行git clone、mvn package等操作。但是仍然需要通过SSH连接到主机来触发构建。
在这两种情况下,我需要暴露一个具备Docker能力的用户以进行远程登录,这并不是我真正想要的。
用户只能找到关于不推荐的做法的信息,而没有找到如何以正确方式解决这个特定问题的信息。请问应该如何正确解决这个问题?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
如果你正在使用Jenkins,我建议你利用它支持构建Docker镜像的功能。在构建过程中,添加一个Docker Pipeline步骤来创建你的镜像,并将其推送到你选择的容器注册表。许多企业使用Jenkins构建和Nexus存储JAR和WAR文件,并将Nexus作为容器注册表。他们可以继续使用Jenkins和Nexus,只需重新配置即可进入容器的世界。
方案2
你还可以更加”微服务”地进行部署,跳过安装Tomcat。你可以使用Maven的Jetty插件或Tomcat插件来运行代码,只需运行”mvn jetty:run”或”mvn tomcat7:run”即可。你可以通过插件设置一个完整的配置文件给Servlet容器。Maven允许你设置任何你想要的JVM选项。(注意:在Tomcat 7之后,似乎不再支持这种现代方法,下一段中的主流现在使用Jetty来实现这一点)。
如果你喜欢Spring,你可以使用Spring Boot构建一个可执行的JAR文件来运行你的Web应用。这个JAR文件将包含运行Web应用所需的所有内容,包括Servlet容器,全部打包在一个JAR文件中。你可以使用”java -jar”命令运行它,它会在嵌入的Servlet容器中运行你的Web应用。更好的是,配置Maven插件以创建一个可执行的JAR文件,只需运行”./my-app-1.0.0.jar”即可启动。这使得构建Docker镜像变得非常简单,你只需要一个安装了Java的容器,将你的Spring Boot可执行JAR文件复制进去,并将其作为CMD运行。Spring Boot在Java微服务中非常流行,它在底层使用Jetty。
方案3
你还可以考虑使用Kubernetes或OpenShift等容器编排工具来管理你的容器。这些工具提供了更高级的功能,可以帮助你更好地管理容器之间的依赖关系和部署过程。你可以使用这些工具来定义容器之间的依赖关系,并确保在部署应用时正确的顺序和方式。
以上是几种解决方案,你可以根据你的具体需求和环境选择适合你的方法。希望对你有所帮助!