简介
在本实验中,你将学习如何使用 docker container start
命令来重启已停止的容器。首先,你将使用 hello-world
和 ubuntu
镜像创建并停止容器。
之后,你将探索多种启动已停止容器的方式,包括直接启动容器、启动并附加到其输出,以及以交互模式启动容器。这将展示 docker container start
命令在管理容器生命周期方面的灵活性。
在本实验中,你将学习如何使用 docker container start
命令来重启已停止的容器。首先,你将使用 hello-world
和 ubuntu
镜像创建并停止容器。
之后,你将探索多种启动已停止容器的方式,包括直接启动容器、启动并附加到其输出,以及以交互模式启动容器。这将展示 docker container start
命令在管理容器生命周期方面的灵活性。
在这一步骤中,你将学习如何创建和停止 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 run
或 docker 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 run
和 docker stop
命令创建和停止 Docker 容器。你练习了通过 docker pull
拉取镜像,并使用 docker ps -a
验证容器状态。你还创建了一个立即退出的容器(hello-world
)和一个持续运行一段时间的容器(带 sleep
命令的 ubuntu
)。
接着,你探索了使用 docker start
命令重新启动已停止容器的不同方法。你学习了如何简单地启动容器、如何使用 -a
参数启动并附加到容器输出,以及如何使用 -i
参数以交互模式启动容器,从而让你能够在运行中的容器内执行命令。