以交互方式启动 Docker 容器

24
我有一个非常简单的Dockerfile,只有一行代码,即“FROM ubuntu”。我通过命令docker build -t ubuntu_ .从这个Dockerfile创建了一个镜像。
我知道我可以使用命令docker run -it my_new_container从这个镜像创建一个新的Docker容器,并以交互方式运行它。
我之后可以使用命令start my_new container启动这个新容器。
据我所知,我还应该能够使用命令start -i my_new container以交互方式使用此容器。但是,它不起作用。它只是运行并退出。与使用run时进入容器命令提示符不同。我做错了什么?

从概念上来说,将Docker容器视为某个单一进程及其所有数据和运行时依赖项的包装器可能更容易理解。你的容器正在运行什么进程? - David Maze
不确定您的意思。容器正在运行Ubuntu... - Henrik Leijon
"Ubuntu" 不是一个应用程序。更典型的设置是让容器运行 Nginx、PostgreSQL 或您编写的 Flask 应用程序;这些不是具有交互式 shell 的东西,您也不需要“登录”它们。删除和重新创建容器也非常常见:在几乎所有情况下,我会使用 docker rm; docker run 而不是 docker start - David Maze
4个回答

17

如果我理解正确,您想在终端中查看容器的日志,就像使用docker run运行映像时一样。 如果是这种情况,请尝试使用

docker start -a my_docker_container

7

直接回答:

要为未运行的容器运行交互式 shell,请先找到该容器所基于的镜像。

然后执行以下步骤:

docker container run -it [yourImage] bash

如果您最终的容器是基于alpine镜像的,则将bash替换为sh。
从技术上讲,这将创建一个新的容器,但它可以完成工作。
编辑[首选方法]:
更好的方法是给容器一些无关紧要的任务。来自VSCode文档的一个不错的解决方案是将以下命令放入docker-compose.yml文件的服务定义中:
services:
   my-app-service:
      command: ["sleep", "infinity"]
      # other relevant parts of your service def...

这里的想法是让你告诉容器睡眠一段时间(无限期),具有讽刺意味的是,这将迫使容器保持运行状态。

这就是我运行容器的方式。祝愿需要这个信息的人一切顺利。我们都在学习 :)


4

您可以使用以下命令进入正在运行的容器:

docker exec -it my_new_container /bin/bash

如果容器中���有安装 bash,你可以将其替换为 sh


要稍后连接到正在运行的容器,请使用-a / --attach选项:

docker start -a  my_new_container

如果你需要明确地使用UID,比如root = UID 0,你可以指定如下:

docker exec -it -u 0 my_new_container /bin/bash

这将以root身份记录您的信息


感谢您的评论。然而,容器没有在运行。如果我执行“start my_new container”命令,容器会启动并立即退出。这与执行“docker run --name mybox1 busybox”,然后执行“docker start mybox1”相同。 (在第一种情况下,您可以使用“docker run -it --name mybox1 busybox”进行交互式操作,但在第二种情况下,我不知道如何做到这一点。) - Henrik Leijon
如果您希望容器不退出,您需要确保任何正在运行的主进程在前台运行且永远不会退出。 - Ron
但有时我需要关闭我的计算机,包括容器,并希望能够交互地重新启动它... - Henrik Leijon
那么我该如何以交互方式启动它?你所说的“你需要确保无论什么主进程正在运行,都在前台并且永远不会退出。”是什么意思?谢谢! - Henrik Leijon
你已经知道如何交互式地启动容器(例如,使用 TTY)。认识一下文档,以便了解 Docker 的工作原理。你无法与已经退出的东西进行交互。因此,你需要让容器无限期地运行,然后才能 exec 命令或 shell 进入其中,或者 attach 到正在运行的容器。但你需要阅读文档。 - Ron
我注意到进入交互模式不需要/bin/bash。 - Phil O

0

在容器停止状态下,您无法进入容器的 shell 或直接使用其他入口点重新启动它。如果容器一直退出并且您需要检查它,则我所知道的唯一选项是将容器提交为新镜像,然后使用该镜像启动新容器,如 相关答案 所述。

如果您不再需要该容器,只想让它保持运行状态,则应使用不会退出的进程运行它。例如,在 Ubuntu 镜像中,您可以这样做(无需 Dockerfile):

docker run -d ubuntu --name carrot tail -f /dev/null

你会看到这个容器保持开启状态,现在你可以运行bash,以便访问CLI:

docker exec -ti carrot bash

如果容器因任何原因停止,例如机器重新启动,您可以将其重新启动:

docker start carrot

它将继续保持稳定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接