在由 docker 拉取的 Spring Boot 应用程序中实现 LetsEncrypt
Posted
技术标签:
【中文标题】在由 docker 拉取的 Spring Boot 应用程序中实现 LetsEncrypt【英文标题】:Implement LetsEncrypt in Spring Boot app that is being pulled by docker 【发布时间】:2020-05-11 00:55:59 【问题描述】:我正在尝试在 Spring Boot 应用程序上实现 LetsEncrypt
。我正在使用 docker 进行部署,我正在本地创建一个 docker 映像,将其推送到 docker hub,然后使用此 docker 命令在 Ubuntu 中运行它docker run -d -p 80:80 myapp:latest
,这只是http
,所以现在我正在尝试使用LetsEncrypt
但我不知道该怎么做。任何帮助或对某些链接的任何指导将不胜感激。谢谢
【问题讨论】:
【参考方案1】:架构:需要反向代理+容器编排工具
如果您的 Spring-Boot 容器只处理 HTTP 请求,您可以将其与 TLS termination proxy 链接,这将接受传入的 TLS 连接并将请求转发到您的容器。
可以使用许多反向代理的实现,它们可以扮演 TLS 终止代理的角色(请参阅this paragraph on Wikipedia),例如使用让我们按照您的建议进行加密。
这些实现中的大多数也可以作为 Docker 镜像使用,因此您可能需要依赖容器编排工具(例如 docker-compose 以及 docker-compose.yml
)来为两个容器创建专用网络以进行通信(或者,使用更复杂的orchestration solution,例如Kubernetes)。
几个 Docker 实现概述
举几个实现这一点的 Docker 镜像示例,例如,您可以使用这些流行的反向代理之一(前两个在 Gitea's doc 中提到):
NGINX(也捆绑在 https-portal 等项目中以自动生成证书), Apache2 httpd, Træfik,另外提供了一个“监控仪表板”作为 web 应用程序(另请参阅 official doc,它提供了有关自动证书生成的许多详细信息)【讨论】:
【参考方案2】:如果您想保持简单(仅使用 Spring-Boot 应用程序保留 1 个容器,没有 Sidecar),您可以使用库 LetsEncrypt Spring-Boot helper。它允许 Spring-Boot 上的嵌入式 Tomcat 获取 LetsEncrypt 证书并自动更新。
作为它的关键优势 - 它是原生 Java + Spring-Boot,因此不需要 sidecar,只需嵌入库,公开端口 80 和 443,其他一切都会自动完成。
我创建它的原因是所有这些边车只是给应用程序增加了不必要的配置复杂性。对于简单的宠物项目,这种增加的复杂性是不合理的。 Spring-Boot 的嵌入式 Tomcat 对于这类项目来说绰绰有余
【讨论】:
以上是关于在由 docker 拉取的 Spring Boot 应用程序中实现 LetsEncrypt的主要内容,如果未能解决你的问题,请参考以下文章
Docker+Jenkins实现spring-boot项目持续集成