【问题标题】:Is it possible to switch port binding between docker containers without downtime?是否可以在不停机的情况下在 docker 容器之间切换端口绑定?
【发布时间】:2019-03-22 20:48:22
【问题描述】:

场景:

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

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

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

【问题讨论】:

    标签: docker


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 2023-03-15
        • 1970-01-01
        相关资源
        最近更新 更多