【Docker】(2) 停止运行容器,重新打开容器
·
查看容器状态
STATUS: Up 在运行, Exited 退出了
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb8c03f2b355 gpt "/opt/nvidia/nvidia_…" 4 weeks ago Up 8 minutes gpt_con
7217f169442b huggingface/transformers-pytorch-gpu:latest "/opt/nvidia/nvidia_…" 4 weeks ago Exited (0) 4 weeks ago eloquent_dubinsky
停止
docker stop <容器名 或 容器ID>
重新运行同一个容器
docker start <容器名 或 容器ID>
进入状态是Up的容器的交互模式
完全可以,这个操作在 Docker 中很常用 👍。
如果容器状态是 Up(正在运行),你可以用 docker exec 或 docker attach 进入它的交互模式。下面我给你详细解释:
用 docker exec -it(推荐)
docker exec -it <容器名或ID> /bin/bash
exec→ 在已经运行的容器里执行命令-i→ interactive(保持输入)-t→ tty(分配一个伪终端)/bin/bash→ 进入 bash shell
✅ 优点:安全,不会干扰主进程,可以在容器里执行命令、查看文件、调试程序。
示例:
docker ps
CONTAINER ID NAMES STATUS
a1b2c3d4e5f6 my_app Up 2 hours
docker exec -it my_app /bin/bash
进入容器后,你就能像在 Linux 系统里一样操作:
root@a1b2c3d4e5f6:/# ls
root@a1b2c3d4e5f6:/# python3 trainer_HF.py
进入状态是Exit的容器的交互模式
明白了,你问的是状态是 Exited(已经停止)的容器,想进入交互模式。这个和 Up 容器不一样,因为 Exited 容器主进程已经结束了,所以不能直接用 docker exec 或 docker attach。
我给你整理几种方法:
1️⃣ 使用 docker start -ai(前提是主进程不会立即退出)
docker start -ai <容器名或ID>
-a→ attach(附加到输出)-i→ interactive(交互)
注意:
- 如果容器主进程一启动就退出,容器会瞬间退出,你无法进入。
- 这种方法只适用于容器主进程仍然会运行一段时间的情况。
2️⃣ 启动容器并进入 bash(最常用方法)
因为主进程已经结束,你可以重新启动容器并覆盖主进程,进入 bash:
docker start <container_name>
docker exec -it <container_name> /bin/bash
或者一行:
docker start <container_name> && docker exec -it <container_name> /bin/bash
解释:
docker start <container_name>→ 启动容器(虽然主进程已经结束,但容器文件系统还在)docker exec -it <container_name> /bin/bash→ 启动一个新的 bash 进程,让你进入交互模式
3️⃣ 重新创建一个容器(如果容器立刻退出)
如果容器原来的主进程总是退出,你可以基于这个容器创建一个新的容器来进入:
docker commit <container_name> new_image_name
docker run -it new_image_name /bin/bash
解释:
docker commit→ 把已退出容器的当前状态保存成一个新镜像docker run -it→ 基于这个新镜像启动容器并进入 bash
🔹 总结
| 容器状态 | 是否能进入 | 方法 |
|---|---|---|
| Up | ✅ 可以 | docker exec -it <name> /bin/bash |
| Exited | ❌ 不能直接 exec/attach | 1. docker start <name> && docker exec -it <name> /bin/bash 2. commit 新镜像再 run |
更多推荐
所有评论(0)