Raf*_*ues 5 docker docker-compose
我有一个 docker-compose 文件,它创建 3 个 Hello World 应用程序并使用 nginx 来负载平衡不同容器之间的流量。
docker-compose 代码如下:
version: '3.2'
services:
backend1:
image: rafaelmarques7/hello-node:latest
restart: always
backend2:
image: rafaelmarques7/hello-node:latest
restart: always
backend3:
image: rafaelmarques7/hello-node:latest
restart: always
loadbalancer:
image: nginx:latest
restart: always
links:
- backend1
- backend2
- backend3
ports:
- '80:80'
volumes:
- ./container-balancer/nginx.conf:/etc/nginx/nginx.conf:ro
Run Code Online (Sandbox Code Playgroud)
我想验证该restart: always政策是否确实有效。
我尝试的方法如下:
docker-compose up;docker container ps;标识容器 IDdocker stop ID_Container或杀死/停止其中一个容器docker kill ID_Container。我期待在第 3 步之后(停止/杀死容器。这使它与代码 137 一起存在),重新启动策略将启动并再次创建一个新容器。
然而,这不会发生。我读到这是故意的,因为有一种方法可以手动停止具有重启策略的容器。
尽管如此,我想知道如何以触发重启策略的方式杀死容器,以便我可以实际验证它是否正常工作。
感谢您的帮助。
如果您ps在主机上运行,您将能够看到所有 Docker 容器中的实际进程。一旦你找到了一个容器的主进程的进程 ID,你就sudo kill可以(你必须是 root)。这看起来更像是“崩溃”,特别是如果您kill -13发送 SIGSEGV。
对于这样的验证场景,有一个端点会导致您的应用程序崩溃,您可以在测试版本和其他一些类似的愚蠢事情中启用它,这对于此类验证场景非常有用。只需确保您确实有一个门,以便在生产版本中不存在这些端点。(在老式的 C 中, an#ifdef TEST可以完成这项工作;有些语言有等价物,但许多没有。)
您可以docker exec进入正在运行的容器并终止进程。如果您的入口点进程(pid 1)启动了一个子进程,找到它并杀死它
docker exec -it backend3 /bin/sh
ps -ef
Run Code Online (Sandbox Code Playgroud)
找到pid 1是其父进程的进程和kill -9它。
如果您的入口点位于唯一进程(pid 1)中,则该kill命令无法将其杀死。考虑用调用实际流程的脚本替换入口点,这将允许您使用我上面建议的想法。
这应该模拟崩溃的容器并应该启动重新启动过程。
笔记:
| 归档时间: |
|
| 查看次数: |
1443 次 |
| 最近记录: |