是否可以在不停机的情况下在 docker 容器之间切换端口绑定?



场景:

有一个容器运行映像版本 1.0,并在 localhost 80 上公开端口 8080。新版本的映像可用,需要切换这些版本。不,任何编排工具都在运行(Kubernetes,OpenShift等)。

是否可以使用 1.1 版启动容器使其正常运行 请记住,我不想保持简单,没有复制等。 只需将绑定端口绑定到本地主机的 docker 容器即可。

问题: 1. 是否可以在不停机的情况下在容器之间切换端口暴露? 2. 如果没有,是否有任何机制与 docker(免费版)实现进行此类切换?

如果没有停机,您需要运行该服务的第二个副本,并在该服务前面有一个代理,用于侦听用户请求并从一个路由到另一个。Swarm Mode 和 Kubernetes 都通过类似的工具提供此功能,公开的端口通过应用程序反向代理或内核中的某些 iptables 规则和 ipvs 条目间接连接到应用程序。

开箱即用,最新版本的 docker 包括对 Swarm 模式的支持,无需安装任何其他内容。您可以运行一个简单的docker swarm init,在不到一秒的时间内启动单节点群集群。然后,您不必切换到docker-compose updocker stack deploy -c docker-compose.yml $stack_name,而是切换到,以使用几乎相同的撰写文件管理项目。对于 swarm 模式,您需要使用版本 3 的撰写文件语法。

对于在 swarm 模式下且更新时没有中断的 v3 语法撰写文件,需要在映像中定义运行状况检查,以监视应用程序,并在应用程序准备好接收请求时进行报告。然后,您需要撰写文件的部署部分具有用于 HA 的多个副本,或者至少将单个副本配置为具有"启动优先"策略,以确保新服务在停止旧服务之前启动。有关要调整的设置,请参阅撰写文档: https://docs.docker.com/compose/compose-file/#update_config

对于 docker 中基于应用程序的反向代理,我真的很喜欢 traefik,但更多的是允许我在打开单个端口的情况下运行多个基于 http 的容器服务。这允许我将基于主机名/路径/http 标头的请求映射到正确的容器,同时提供在不同版本之间迁移的功能,并加权使用哪个后端,这样您就可以在升级期间做更多的事情,而不仅仅是简单的轮询负载平衡。

Docker 原生的机制不允许你用一个容器替换另一个容器而不会中断。另一方面,中断的持续时间可能以毫秒为单位;这是否真的是您的问题完全取决于您的应用程序。

您可以通过在配置中引入动态反向代理(如 Traefik)来获得所需的行为。代理绑定到主机端口并处理来自远程系统的请求,然后将这些请求分发到一个或多个后端容器。

您可以根据需要创建和删除后端容器,只要至少有一个正在运行的后端容器,您的应用程序就会可用。 对于您的特定用例,这意味着您可以先启动应用程序的新版本,然后停用旧版本,所有这些都不会中断服务。

最新更新