如何使用 docker container start 命令重启容器

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 docker container start 命令来重启已停止的容器。首先,你将使用 hello-worldubuntu 镜像创建并停止容器。

之后,你将探索多种启动已停止容器的方式,包括直接启动容器、启动并附加到其输出,以及以交互模式启动容器。这将展示 docker container start 命令在管理容器生命周期方面的灵活性。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/attach("Attach to Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555122{{"如何使用 docker container start 命令重启容器"}} docker/ps -.-> lab-555122{{"如何使用 docker container start 命令重启容器"}} docker/start -.-> lab-555122{{"如何使用 docker container start 命令重启容器"}} docker/stop -.-> lab-555122{{"如何使用 docker container start 命令重启容器"}} docker/attach -.-> lab-555122{{"如何使用 docker container start 命令重启容器"}} docker/pull -.-> lab-555122{{"如何使用 docker container start 命令重启容器"}} end

创建并停止容器

在这一步骤中,你将学习如何创建和停止 Docker 容器。容器是镜像的可运行实例,你可以通过 Docker API 或 CLI 来创建、启动、停止、移动或删除容器。

首先,让我们从 Docker Hub 拉取 hello-world 镜像。这是一个非常小的镜像,适合用于测试。

docker pull hello-world

你会看到镜像正在被拉取和解压的输出信息。

Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

现在,让我们基于 hello-world 镜像创建并运行一个容器。当你执行这个命令时,Docker 会创建一个新容器并运行镜像中指定的命令。对于 hello-world 镜像,这个命令只是打印一条消息然后退出。

docker run hello-world

你应该会看到类似这样的输出:

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

这个输出确认容器已成功运行并打印了消息。由于容器中的命令已经执行完毕,容器也随之停止。

要查看系统中的所有容器(包括已停止的),可以使用 docker ps -a 命令。

docker ps -a

你会看到一个容器列表。hello-world 容器应该在其中,状态为 Exited

CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                      PORTS    NAMES
...            hello-world   "/hello"   About a minute ago   Exited (0) 58 seconds ago            ...

现在让我们创建另一个容器,这次使用 ubuntu 镜像并运行一个能让容器短暂保持运行的命令。我们将使用 sleep 10 命令让容器存活 10 秒钟。

首先拉取 ubuntu 镜像:

docker pull ubuntu

你会看到镜像正在被拉取的输出信息。

Using default tag: latest
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

现在基于 ubuntu 镜像运行一个容器并执行 sleep 10 命令。我们将使用分离模式 (-d) 运行,这样容器会在后台运行而不会阻塞终端。

docker run -d ubuntu sleep 10

这个命令会输出容器的 ID。

[container_id]

使用 docker ps 查看正在运行的容器。

docker ps

你应该能看到 ubuntu 容器在列表中,状态为 Up

CONTAINER ID   IMAGE    COMMAND       CREATED         STATUS         PORTS    NAMES
[container_id]   ubuntu   "sleep 10"   About a minute ago   Up 5 seconds            ...

大约 10 秒后,sleep 10 命令执行完毕,容器会停止。再次使用 docker ps -a 查看所有容器(包括已停止的)。

docker ps -a

现在 ubuntu 容器的状态应该显示为 Exited

CONTAINER ID   IMAGE    COMMAND       CREATED         STATUS                      PORTS    NAMES
[container_id]   ubuntu   "sleep 10"   About a minute ago   Exited (0) 5 seconds ago             ...
...

最后,让我们使用 docker stop 命令手动停止 ubuntu 容器。你可以通过容器 ID 或名称来停止正在运行的容器。我们将使用运行容器时输出的容器 ID。请将 [container_id] 替换为你实际的 ubuntu 容器 ID。

docker stop [container_id]

这个命令会输出被停止的容器 ID。

[container_id]

再次使用 docker ps 确认容器已停止运行。

docker ps

ubuntu 容器不应该出现在运行中的容器列表里。

启动已停止的容器

在上一步骤中,我们创建并停止了一个基于 ubuntu 镜像的容器。本步骤将教你如何启动已停止的容器。

首先,让我们列出所有容器(包括已停止的),找到之前创建的 ubuntu 容器的 ID。

docker ps -a

查找镜像为 ubuntu 且状态为 Exited 的容器,记录下它的 CONTAINER ID

CONTAINER ID   IMAGE    COMMAND       CREATED          STATUS                      PORTS    NAMES
[container_id]   ubuntu   "sleep 10"   About 5 minutes ago   Exited (0) 4 minutes ago             ...
...

现在,我们可以使用 docker start 命令加上容器 ID 来启动这个已停止的容器。请将 [container_id] 替换为你实际的 ubuntu 容器 ID。

docker start [container_id]

该命令会输出被启动的容器 ID。

[container_id]

使用 docker ps 验证容器是否正在运行。

docker ps

你应该能看到 ubuntu 容器出现在列表中,状态为 Up

CONTAINER ID   IMAGE    COMMAND       CREATED          STATUS         PORTS    NAMES
[container_id]   ubuntu   "sleep 10"   About 5 minutes ago   Up 5 seconds            ...

由于该容器原本执行的命令是 sleep 10,它会在运行 10 秒后再次停止。几秒后再次运行 docker ps -a 查看其状态。

docker ps -a

此时 ubuntu 容器的状态应该又变回了 Exited

CONTAINER ID   IMAGE    COMMAND       CREATED          STATUS                       PORTS    NAMES
[container_id]   ubuntu   "sleep 10"   About 5 minutes ago   Exited (0) 5 seconds ago              ...
...

启动已停止的容器非常有用,特别是当你想要恢复之前容器实例的工作状态而不想创建新容器时。

启动容器并附加到其输出

在前面的步骤中,我们创建并启动了容器。当我们使用 docker rundocker start 的分离模式 (-d) 时,容器会在后台运行。有时,你可能希望在容器运行时查看其输出内容。本步骤将教你如何启动容器并附加到其标准输出和标准错误流。

首先,让我们创建一个新容器,它会每秒打印一条消息,持续 5 秒。我们将再次使用 ubuntu 镜像。

docker run -d ubuntu /bin/bash -c 'for i in {1..5}; do echo "Hello from container $i"; sleep 1; done'

这个命令以分离模式 (-d) 创建并运行容器。容器内执行的命令是一个 bash 脚本,循环 5 次,每次迭代打印一条消息并休眠 1 秒。请记下输出的容器 ID。

[container_id]

现在,让我们附加到这个正在运行的容器以查看其输出。使用 docker attach 命令加上容器 ID。请将 [container_id] 替换为你实际的 ubuntu 容器 ID。

docker attach [container_id]

你应该能在终端看到容器的输出内容:

Hello from container 1
Hello from container 2
Hello from container 3
Hello from container 4
Hello from container 5

循环结束后,容器会停止,你将返回到终端提示符。

如果你尝试附加到一个已经停止的容器,docker attach 命令会立即退出。

让我们通过列出所有容器来验证容器是否已停止:

docker ps -a

你应该能看到执行命令 /bin/bash -c 'for i in {1..5}; do echo "Hello from container $i"; sleep 1; done' 的容器处于 Exited 状态。

CONTAINER ID   IMAGE    COMMAND                  CREATED         STATUS                      PORTS    NAMES
[container_id]   ubuntu   "/bin/bash -c 'for i…"   About a minute ago   Exited (0) 5 seconds ago             ...
...

附加到容器对于监控长时间运行进程的输出或进行调试非常有用。

以交互模式启动容器

在前面的步骤中,我们运行的容器要么执行完命令就退出,要么在后台运行。通常你会希望像操作虚拟机或远程服务器那样与容器进行交互。本步骤将教你如何以交互模式启动容器,并在其中获取 shell 提示符。

要以交互模式运行容器,我们需要在 docker run 命令中使用 -i-t 参数:

  • -i 参数保持标准输入(STDIN)开启,即使没有附加连接。这对交互式进程是必需的
  • -t 参数分配一个伪终端(pseudo-TTY),这是获取 shell 提示符的必要条件

我们将运行一个 ubuntu 容器并执行 /bin/bash 命令来获取容器内的 bash shell:

docker run -it ubuntu /bin/bash

执行该命令后,你会看到如下 shell 提示符:

root@[container_id]:/#

这表示你现在已作为 root 用户进入了正在运行的 ubuntu 容器内部。你可以在这个容器中运行标准的 Linux 命令。例如,让我们查看操作系统版本:

cat /etc/os-release

你应该会看到类似以下的输出,确认你正在 Ubuntu 容器中运行:

NAME="Ubuntu"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 22.04.3 LTS"
VERSION_ID="22.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=jammy
UBUNTU_CODENAME=jammy

你还可以尝试其他命令,比如列出当前目录的文件:

ls

你会看到 Ubuntu 系统的标准根目录内容。

要退出容器并返回主机终端,你可以在容器的 shell 提示符下输入 exit

exit

当你退出 shell 时,容器会停止,因为主进程(/bin/bash)已经结束。

让我们通过列出所有容器来验证容器是否已停止:

docker ps -a

你应该能看到执行 /bin/bash 命令的容器处于 Exited 状态:

CONTAINER ID   IMAGE    COMMAND       CREATED         STATUS                      PORTS    NAMES
[container_id]   ubuntu   "/bin/bash"   About a minute ago   Exited (0) 5 seconds ago             ...
...

以交互模式运行容器对于探索容器镜像、调试容器内应用程序以及执行管理任务至关重要。

总结

在本实验中,你学习了如何使用 docker rundocker stop 命令创建和停止 Docker 容器。你练习了通过 docker pull 拉取镜像,并使用 docker ps -a 验证容器状态。你还创建了一个立即退出的容器(hello-world)和一个持续运行一段时间的容器(带 sleep 命令的 ubuntu)。

接着,你探索了使用 docker start 命令重新启动已停止容器的不同方法。你学习了如何简单地启动容器、如何使用 -a 参数启动并附加到容器输出,以及如何使用 -i 参数以交互模式启动容器,从而让你能够在运行中的容器内执行命令。