docker容器保持运行不退出

本文介绍了如何使用nsenter工具进入Docker容器,对比了dockerattach和dockerexec的优缺点。详细步骤包括安装nsenter,通过dockerinspect获取容器进程ID,然后使用nsenter命令进入容器的不同命名空间。同时,文章提到了docker容器因主线程结束而退出的问题,以及如何通过交互式启动或使用dockerexec来避免这种情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nsenter工具进入docker容器
概述
对于运行在后台的docker容器,我们经常需要做的事情是进入到容器中,docker为我们提供了docker exec 、docker attach 命令,并且还提供了nsenter工具,外部工具供我们使用。docker attach存在的问题是:当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞,docker attach命令可以说是最不方便的进入后台docker容器的方法。docker exec命令是在docker 1.3之后增加的一个比docker attach命令更加方便的命令。和docker exec差不多方便的命令是nsenter工具。

nsenter安装
$ cd /tmp;
$ curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure --without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin

nsenter使用
在使用nsenter命令之前需要获取到docker容器的进程,然后再使用nsenter工具进去到docker容器中,具体的使用方法如下:

$ docker inspect -f {{.State.Pid}} 容器名或者容器id #每一个容器都有.State.Pid,所以这个命令除了容器的id需要我们根据docker ps -a去查找,其他的全部为固定的格式
$ nsenter --target 上面查到的进程id --mount --uts --ipc --net --pid #输入该命令便进入到容器中

解释nsenter指令中进程id之后的参数的含义:
* –mount参数是进去到mount namespace中
* –uts参数是进入到uts namespace中
* –ipc参数是进入到System V IPC namaspace中
* –net参数是进入到network namespace中
* –pid参数是进入到pid namespace中
* –user参数是进入到user namespace中

在Linux中,最爱简单的查看指定命令参数含义的办法是在终端中输入:

$ nsenter --help #会回显所有与该命令有关的参数
$ man nsenter #能查到更加详细的使用示例和参数说明

现象
启动docker容器
docker run –name [CONTAINER_NAME] [CONTAINER_ID]
查看容器运行状态
docker ps -a
发现刚刚启动的mydocker容器已经退出

原因
docker容器的主线程(dockfile中CMD执行的命令)结束,容器会退出

办法
可以使用交互式启动

docker run -i [CONTAINER_NAME or CONTAINER_ID]

上面的不太友好,建议使用后台模式和tty选项

docker run -dit [CONTAINER_NAME or CONTAINER_ID]

查看容器状态

docker ps -a

docker调出后台容器

docker attach [CONTAINER_NAME or CONTAINER_ID]

TIPs:退出时,使用[ctrl + D],这样会结束docker当前线程,容器结束,可以使用[ctrl + P][ctrl + Q]退出而不终止容器运行

如下命令,会在指定容器中执行指定命令,[ctrl+D]退出后不会终止容器运行

docker exec -it [CONTAINER_NAME or CONTAINER_ID] /bin/bash

<think>我们已知用户希望退出Docker容器的交互式终端但停止容器运行。根据引用内容,我们可以总结以下方法:1.使用`Ctrl+P`然后`Ctrl+Q`组合键(安全退出保持容器运行)[^1]2.使用`exit`命令会退出并停止容器[^1](符合要求)另外,从其他引用中也可以得到印证:-引用[5]提到:使用`-it`参数启动交互式容器,但没有具体说明如何退出。-引用[4]提到:使用`dockerexec-it`进入容器,但没有说明如何退出。因此,最常用的安全退出方法是按下组合键`Ctrl+P`然后`Ctrl+Q`。同时,注意:如果使用`dockerattach`命令进入容器,则使用组合键退出;如果使用`dockerexec`进入容器,同样可以使用组合键退出(因为都是交互式终端)。所以,回答用户:要退出Docker容器的交互式终端而停止容器运行,请按下`Ctrl+P`然后`Ctrl+Q`组合键。为了结构清晰,我们将分步骤说明:步骤1:在容器内部,确保当前焦点在终端上(即你正在与容器交互的终端窗口)。步骤2:按下组合键:先按下`Ctrl`键放,再按下`P`键,然后松开这两个键,再按下`Ctrl`键放,再按下`Q`键。注意:这个操作会在终端显示任何信息,但会返回到宿主机的命令行,而容器仍在后台运行。验证:使用`dockerps`命令可以看到该容器仍然处于运行状态。注意:如果使用`exit`命令,容器会停止运行(如果容器是由`dockerrun-it`启动的,且没有其他进程运行,则容器会停止)。另外,如果使用`dockerrun-it`启动容器,然后使用组合键退出容器会继续运行。同样,使用`dockerexec-it`进入容器后,使用组合键退出,也会影响容器运行。根据引用[2]和[3],我们还可以知道,在dockercompose中要保持交互式容器运行,需要配置`stdin_open:true`和`tty:true`,但这与退出容器无关,而是启动容器时的配置。因此,回答的核心就是组合键`Ctrl+P`然后`Ctrl+Q`。生成相关问题:1.如何进入正在运行Docker容器?2.退出Docker容器交互模式有哪几种方式?它们有什么区别?3.为什么有时候使用`exit`命令退出容器容器会停止?4.如何配置dockercompose文件以保持交互式容器持续运行?5.使用`dockerattach`和`dockerexec`进入容器有什么区别?注意:回答中引用的段落末尾需要添加引用标识,如[^1]。</think>### 如何退出 Docker 容器交互模式并保持容器运行退出 Docker 容器的交互式终端(Shell)而停止容器运行,请按以下步骤操作: 1. **进入容器交互模式后** 确保您已通过以下任一方式进入容器: ```bash docker attach <容器名或ID> # 附加到运行中的容器 docker exec -it <容器名或ID> sh # 通过新进程进入容器 ``` 2. **安全退出操作** - 在容器内部的终端中,**同时按下组合键**: `Ctrl + P` ➔ 松开 ➔ 再按 `Ctrl + Q` - 此时终端会**静默退出**到宿主机命令行,但容器仍在后台运行[^1][^3][^5]。 3. **验证容器状态** 退出后立即执行以下命令确认容器仍在运行: ```bash docker ps # 查看运行中的容器列表 ``` --- ### ⚠️ 注意事项 1. **错误操作会停止容器** 若直接输入 `exit` 或按 `Ctrl + D`,容器会随 Shell 进程一起停止[^1][^5]。 2. **启动容器时需启用交互模式** 若要通过此方式退出,启动容器时必须包含交互参数: ```bash docker run -it <镜像名> # -it 表示交互式终端 ``` 或在 `docker-compose.yml` 中配置: ```yaml services: app: tty: true # 相当于 -t 参数 stdin_open: true # 相当于 -i 参数[^2] ``` --- ### 原理说明 - `Ctrl + P + Q` 是 Docker 的**分离序列**(detach sequence),它会断开终端与容器进程的连接,但保持容器运行[^1][^5]。 - 该操作实际发送 `SIGQUIT` 信号给 Docker 守护进程,而非容器内的进程[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值