如何通过Bash关闭运行中Docker容器内的Nginx Web服务器?
问题:Docker Compose启动的Nginx容器内无法通过
service nginx stop关闭服务 我用下面的docker-compose.yml配置启动了带PHP的Web服务:
version: "2.0" services: nginx: image: nginx ports: - "8000:80" volumes: - ./web:/web - ./nginx/default.conf:/etc/nginx/conf.d/default.conf php: image: php:${PHP_VERSION}-fpm volumes: - ./web:/web
执行docker-compose up后能正常访问http://localhost:8000,但通过docker-compose run nginx bash进入Nginx容器后执行service nginx stop,完全达不到关闭服务的效果,请问怎么通过Bash正确关闭运行中的容器内Web服务器?
解决方案
嘿,你踩的这个坑其实是对Docker Compose命令的一个常见误解!我来给你拆解清楚:
为什么service nginx stop没用?
你用docker-compose run nginx bash的时候,Docker其实是给你启动了一个全新的Nginx容器实例,根本不是之前docker-compose up启动的那个正在运行的服务容器!你在这个新容器里执行停止命令,当然不会影响到真正提供服务的那个容器啦。
正确的操作方式有两种:
1. 直接在宿主机停止容器(最推荐,简单高效)
如果你只是想关闭Nginx服务,完全不用进入容器,直接在宿主机执行:
# 优雅停止Nginx容器(保留容器,之后可以用start重启) docker-compose stop nginx # 如果要彻底移除容器(连容器文件都删掉,下次启动会重新创建) docker-compose down nginx
2. 进入正在运行的容器内部停止服务
如果你一定要进入容器操作,得先进入正在运行的那个容器,步骤如下:
- 先确认正在运行的Nginx容器状态(可选,主要是确认容器名称/ID):
docker-compose ps nginx
- 用
exec命令进入这个已运行的容器(这才是正确进入正在服务的容器的方式):
docker-compose exec nginx bash
- 进入容器后,你有两种安全的方式停止Nginx:
- 方式一:用Nginx自带的优雅停止命令(推荐,会等待当前请求处理完成再关闭)
# 立即停止 nginx -s stop # 优雅退出(等待请求处理完毕) nginx -s quit- 方式二:如果上面的命令失效,也可以直接杀掉Nginx进程(不推荐,强制终止可能导致请求中断)
pkill nginx
划重点!
docker-compose run和docker-compose exec的核心区别:
docker-compose run:创建并启动新的容器实例,和原来的服务容器完全独立docker-compose exec:进入已经在运行的现有容器,操作会直接作用于正在提供服务的容器
另外要注意:容器里的PID 1进程就是Nginx主进程,如果你杀掉PID 1,整个容器也会跟着停止,这和宿主机的服务管理逻辑不太一样哦~
内容的提问来源于stack exchange,提问作者Enrique Moreno Tent




