Docker容器随着SSH客户端连接退出而结束的问题

本文解析了Docker容器的运行机制,强调容器并非虚拟机,而是类似终端,需特别注意命令执行完毕后容器会自动退出。文章分享了使容器在执行shell命令后持续运行的方法,包括使用docker run -t命令及docker compose文件中的tty:true配置。

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

在没有 docker 容器的时候,在终端(terminal)中运行 shell 命令,我们知道当终端退出时(比如关闭终端窗口或退出 ssh 会话),终端中执行的命令也会结束。所以,当我们在终端中执行持续运行的任务或服务时,我们需要让其跳出当前 shell 进程,在后台运行(比如以 daemon 方式运行)。

在最近刚接触 docker 容器时,我误以为 docker 容器是一个轻量级的虚拟机(vm),容器启动后,只要我不把容器关闭,可以在其中任意执行 shell 命令,想干啥就干啥。于是,遇到了容器启动后自动退出的问题,比如:如何让docker容器在执行shell命令后不退出运行。

后来明白了,docker 容器不是一个轻量级的虚拟机(vm),而是一个轻量级的终端(terminal):

1)它是一个只给你一次机会运行 shell 命令的终端

2)它是一个与其中运行的 shell 命令共存亡的终端(命令结束容器退出,命令运行容器运行)。

如果一个容器启动后不运行任何 shell 命令怎么办,可以通过 docker run -t 命令或 docker compose 文件中的 tty: true 配置解决。

如果一个容器启动后其中运行的 shell 命令会结束怎么办,想尽一切办法不让 shell 命令结束。

### 如何进入和退出Docker容器 #### 进入Docker容器 要进入正在运行Docker容器并与其交互,可以使用`docker exec`命令。此命令允许用户在一个已经存在的容器内执行命令。对于希望获得一个交互式的Bash会话的情况,可采用如下方式: ```bash docker exec -it <container_id> /bin/bash ``` 这里的选项 `-it` 结合了两个标志:`-i` 和 `-t`。前者使得能够建立交互式连接,而后者则分配了一个伪TTY给新的容器实例[^2]。 如果目标是在特定容器中启动SQL Plus客户端来访问数据库,则相应的命令形式为 `docker exec -it <container_id> sqlplus user/password@database`[^3]。 #### 启动新容器并立即进入 另一种方法是从头开始创建一个新的容器,并立刻打开一个shell会话。这可以通过下面这条指令实现: ```bash docker run -it ubuntu /bin/bash ``` 这里同样包含了 `-it` 参数用于提供交互功能和支持终端操作,同时指定了基础镜像 (`ubuntu`) 及其内部应启动的过程 (`/bin/bash`)。 #### 退出Docker容器 当处于容器内的Shell环境中时,有几种不同的方式可以选择离开该环境而不终止容器本身: - 输入 `exit` 命令或按组合键 `Ctrl+D` 来正常结束当前session; - 使用快捷键序列 `Ctrl+p` followed by `Ctrl+q` 实现脱离(detach),这样可以让容器继续后台运行的同时返回到宿主机的命令提示符下。 需要注意的是,在某些情况下直接关闭SSH窗口可能会导致前台进程被意外中断,因此建议总是通过上述安全的方法之一显式地退出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值