【问题标题】:Copy / update the code in docker container without stopping container在不停止容器的情况下复制/更新 docker 容器中的代码
【发布时间】:2018-09-25 05:58:00
【问题描述】:
我有一个 docker-composer 设置,我在其中上传服务器的源代码,比如 flask api。现在,当我更改我的 python 代码时,我必须遵循这样的步骤
- 停止正在运行的容器(docker-compose stop)
- 在容器中构建和加载更新的代码 (docker-compose up --build)
这需要一点时间。有没有更好的办法?就像在运行的 docker 中更新代码,然后在不停止整个容器的情况下重新启动 Apache 服务器?
【问题讨论】:
标签:
apache
docker
docker-compose
【解决方案1】:
你可以通过一些肮脏的方式来修改正在运行的容器的文件系统。
首先,您需要找到用作容器运行时根目录的目录路径。运行docker container inspect id/name。在 JSON 输出中查找键 UpperDir。您可以编辑/复制/删除该目录中的文件。
另一种方法是获取容器内运行的进程的进程 ID。转到/proc/process_id/root 目录。这是在 docker 中运行的进程的根目录。您可以即时编辑它,更改将显示在容器中。
【解决方案2】:
您可以在旧容器仍在运行时运行docker build,并且您的停机时间仅限于转换期间。
将负载平衡器放在容器前面可能会有所帮助,原因有很多。根据您的应用程序,这可能是像 HAProxy 这样的“哑”负载平衡器,或者像 nginx 这样的完整 Web 服务器,或者是您的云提供商提供的东西。这允许您一次运行应用程序的多个副本,可能在不同的主机上(有助于扩展和可靠性)。在这种情况下,序列变为:
-
docker build新头像
-
docker run它
- 将其附加到负载平衡器(现在流量会同时流向新旧容器)
- 测试新容器是否正常工作
- 从负载平衡器中分离旧容器
-
docker stop && docker rm旧货柜
如果您不介意较重的基础架构,那么这个顺序基本上与您在 Kubernetes 部署对象中更改映像标签时发生的情况完全相同,但采用 Kubernetes 是一项重大承诺。