场景:
有一个运行映像版本1.0并在本地主机80上公开端口8080的容器。映像的新版本可用,因此需要切换这些版本。 否,任何编排工具正在运行(Kubernetes,OpenShift等...)。
是否可以使用1.1版启动容器,使其正常运行 请记住,我不想保持简单,不复制等。 只需将docker容器绑定到本地主机即可。
问题: 1.是否可以在不停机的情况下切换容器之间的端口暴露? 2.如果没有,是否有使用docker(免费版)实现的机制来进行这种切换?
答案 0 :(得分:1)
在没有停机时间的情况下,您需要运行该服务的第二个副本,并在该服务的前面有一个代理,该代理正在侦听用户请求并从一个路由路由到另一个请求。 Swarm Mode和Kubernetes都通过类似的工具提供此功能,公开的端口通过应用程序反向代理或内核中的某些iptables规则和ipvs条目间接连接到应用程序。
开箱即用,最新版本的docker包括对Swarm Mode的支持,无需额外安装。您可以运行一个简单的docker-compose up
以在不到一秒钟的时间内启动单个节点集群。然后,您切换到docker stack deploy -c docker-compose.yml $stack_name
而不是{{1}}来使用几乎相同的撰写文件来管理项目。对于群模式,您将需要使用撰写文件语法的第3版。
对于处于群发模式的v3语法撰写文件,该文件在更新时没有中断,您需要在映像中定义运行状况检查以监视应用程序,并在准备好接收请求时进行报告。然后,您将希望组合文件的部署部分具有HA的多个副本,或者至少将单个副本配置为具有“先启动”策略,以确保新服务在停止旧服务之前已启动。有关调整设置,请参见撰写文档:https://docs.docker.com/compose/compose-file/#update_config
对于docker中基于应用程序的反向代理,我确实很喜欢traefik,但更多的是允许我在打开单个端口的情况下运行多个基于http的容器服务。这使我可以将基于主机名/路径/ http标头的请求映射到正确的容器,同时提供了可以在不同版本之间迁移的功能,并使用了哪个后端的权重,因此您可以做的不仅仅是简单的循环升级过程中的负载平衡。
答案 1 :(得分:0)
Docker本身没有一种机制,允许您通过 no 中断将一个容器替换为另一个容器。另一方面,中断的持续时间可能以毫秒为单位;对您来说这是否真的是一个问题?完全取决于您的应用程序。
可以通过在配置中引入动态反向代理(例如Traefik)来获得所需的行为。代理绑定到主机端口并处理来自远程系统的请求,然后将这些请求分发到一个或多个后端容器。
您可以根据需要创建和删除后端容器,只要至少有一个正在运行的应用程序可用。对于您的特定用例,这意味着您可以先启动新版本的应用程序,然后停用旧版本,所有这些都不会中断服务。