介绍
在本实验中,你将学习如何使用 docker create 命令来准备 Docker 容器而不立即启动它们。这使你能在执行前配置容器和卷(volume)。你将首先从 Ubuntu 镜像创建一个容器,验证其创建状态,然后启动并连接到已创建的容器。
此外,你还将探索如何使用 docker create 初始化卷(volume),并随后在另一个容器中使用这个已初始化的卷。这一实践将展示 docker create 命令在管理容器生命周期和数据持久化方面提供的灵活性与控制力。
创建容器但不启动
在这一步中,你将学习如何创建一个 Docker 容器而不立即启动它。这在你想先配置容器或设置卷(volume)时非常有用。
首先,让我们从 Docker Hub 拉取 ubuntu 镜像。这个镜像将用于创建我们的容器。
docker pull ubuntu:latest
你会看到镜像正在下载的输出信息。下载完成后,可以通过列出镜像来验证本地是否已存在该镜像。
docker images
现在,我们将基于 ubuntu 镜像创建一个名为 my-ubuntu-container 的容器。我们将使用 docker create 命令来完成这个操作。-it 参数通常用于交互式容器,但 docker create 仅会设置容器而不会运行它。这里我们包含这些参数是为了与你最终可能运行容器的方式保持一致。
docker create -it --name my-ubuntu-container ubuntu:latest
docker create 命令会在指定镜像上创建一个可写的容器层,并为其运行指定命令做好准备。它不会启动容器。你会看到一长串字符作为输出,这就是容器 ID。
要验证容器已创建但未运行,可以列出所有容器(包括已停止的容器)。
docker ps -a
在输出中,你应该能看到一个名为 my-ubuntu-container 的容器,其状态为 Created。这确认容器已成功创建但尚未运行。
启动已创建的容器并附加到容器
在上一步中,你创建了一个名为 my-ubuntu-container 的 Docker 容器但并未启动它。本步骤将指导你如何启动这个已创建的容器,并将你的终端连接到容器的标准输入、输出和错误流。
使用 docker start 命令后接容器名称来启动容器:
docker start my-ubuntu-container
该命令会启动容器,但默认在后台运行。要与容器交互,你需要附加(attach)到容器。
使用 docker attach 命令后接容器名称来连接到正在运行的容器:
docker attach my-ubuntu-container
执行此命令后,你的终端将连接到容器的 shell。你会看到类似 root@<容器ID>:/# 的容器内部命令提示符。
现在你已进入容器内部,可以执行命令。例如检查操作系统版本:
lsb_release -a
你将看到显示容器内 Ubuntu 版本的输出信息。
若需退出容器但不停止它,请按 Ctrl + P 后接 Ctrl + Q。这会断开终端与容器的连接,使容器继续在后台运行。
如果在连接状态下直接输入 exit 或按 Ctrl + D,容器将会停止。
断开连接后,你可以通过列出运行中的容器来验证容器是否仍在运行:
docker ps
你应该能看到 my-ubuntu-container 被列出,并显示为运行状态。
使用 docker create 初始化数据卷
在本步骤中,你将学习如何使用 docker create 命令初始化 Docker 数据卷。这种方法允许你专门创建一个容器,用容器镜像中的初始数据来填充数据卷。
首先,让我们基于 ubuntu 镜像创建一个名为 volume-initializer 的新容器。这个容器将临时用于初始化数据卷。我们将使用 -v 参数来指定要初始化的数据卷及其在容器内的挂载点。我们将数据卷命名为 my-initialized-volume,并将其挂载到容器内的 /app_data 目录。
docker create -v my-initialized-volume:/app_data --name volume-initializer ubuntu:latest
该命令会创建容器和卷(如果卷尚不存在)。-v my-initialized-volume:/app_data 部分告诉 Docker 创建一个名为 my-initialized-volume 的数据卷,并将其挂载到容器内的 /app_data 目录。
现在,让我们启动这个容器。当带有数据卷的容器首次启动时,如果数据卷为空,Docker 会将镜像中挂载点指定目录的内容复制到数据卷中。
docker start volume-initializer
由于这个容器仅用于初始化且没有长期运行的进程,它可能会启动后立即停止。
你可以通过列出所有容器来验证容器是否已停止。
docker ps -a
你应该能看到状态为 Exited 的 volume-initializer 容器。
要确认 my-initialized-volume 数据卷已创建,可以列出所有 Docker 数据卷。
docker volume ls
你应该能在数据卷列表中看到 my-initialized-volume。
此时,my-initialized-volume 数据卷已包含 ubuntu:latest 镜像中 /app_data 目录的初始数据。
在其他容器中使用 docker create 初始化的数据卷
在上一步中,你通过创建并启动临时容器初始化了一个名为 my-initialized-volume 的 Docker 数据卷。现在,你将学习如何在另一个容器中使用这个已初始化的数据卷。这展示了数据卷如何持久化数据并在容器间共享。
首先,让我们基于 ubuntu 镜像创建一个名为 data-consumer 的新容器。这次我们将直接运行容器,并将现有的 my-initialized-volume 挂载到新容器的 /data 目录。
docker run -it --name data-consumer -v my-initialized-volume:/data ubuntu:latest /bin/bash
让我们分解这个命令:
docker run:创建并启动新容器-it:分配伪终端并保持标准输入打开,支持交互式操作--name data-consumer:为新容器指定名称-v my-initialized-volume:/data:关键部分,将现有数据卷挂载到容器内的/data目录ubuntu:latest:指定容器使用的镜像/bin/bash:在容器内运行的命令,启动 bash shell
执行此命令后,你将连接到 data-consumer 容器内的 bash shell。
现在你已进入容器,请导航到挂载了 my-initialized-volume 的 /data 目录:
cd /data
你可以列出该目录内容,查看上一步初始化的数据。具体内容取决于初始化时 ubuntu:latest 镜像中 /app_data 目录的内容。
ls -l
你应该能看到从 Ubuntu 镜像的 /app_data 目录复制到 my-initialized-volume 的文件和目录。这确认了数据卷已成功初始化并被新容器使用。
要退出容器,只需输入:
exit
这将停止 data-consumer 容器并返回主机终端。
你可以通过列出所有容器来验证容器状态:
docker ps -a
你应该能看到状态为 Exited 的 data-consumer 容器。my-initialized-volume 数据卷仍然存在并保留着数据。
总结
在本实验中,你学习了如何使用 docker create 命令来准备 Docker 容器而不立即启动它。这包括拉取镜像、使用 docker create 从该镜像创建容器,以及验证其 "Created" 状态。随后你学习了如何启动已创建的容器并附加到它,展示了容器创建与执行之间的分离。
此外,本实验还涵盖了使用 docker create 初始化 Docker 数据卷,并随后在另一个容器中使用这个已初始化的数据卷。这演示了如何利用 docker create 来设置基础设施组件(如数据卷),然后再将它们挂载到运行中的容器使用。



