You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何通过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 rundocker-compose exec的核心区别:

  • docker-compose run:创建并启动新的容器实例,和原来的服务容器完全独立
  • docker-compose exec:进入已经在运行的现有容器,操作会直接作用于正在提供服务的容器

另外要注意:容器里的PID 1进程就是Nginx主进程,如果你杀掉PID 1,整个容器也会跟着停止,这和宿主机的服务管理逻辑不太一样哦~


内容的提问来源于stack exchange,提问作者Enrique Moreno Tent

火山引擎 最新活动