运行你的第一个服务

DockerBeginner
立即练习

简介

在现代软件开发中,容器已经成为打包和部署应用程序的常用方式。容器不是完整的虚拟机。它与主机共享内核,但会在隔离的进程环境中运行应用程序,并拥有独立的文件系统视图和网络配置。

在本实验中,你将通过运行一个现实中常用的应用程序——Nginx Web 服务器——迈出使用 Docker 的第一步。许多容器并不是执行一次就结束的命令,而是会作为长期运行的服务持续工作,因此你需要理解容器的生命周期。

这与 hello-world 示例有一个重要区别。hello-world 容器启动、打印信息后就退出;现在你要使用的是服务容器,只要其主进程仍在运行,容器就会持续保持活动状态。

你将学习如何:

  • 在后台启动容器(分离模式)。
  • 查看正在运行的容器状态。
  • 完成操作后停止容器。
  • 删除容器以释放系统资源。

完成本实验后,你将理解 Docker 容器的完整生命周期:创建、运行、停止和删除。

在后台运行 Web 服务器

在此步骤中,你将启动 Nginx Web 服务器。

在终端中运行命令时,命令通常会一直占用屏幕,直到执行完成。但是,对于 Web 服务器这类服务,你通常希望它持续在后台运行,这样就可以继续使用终端执行其他任务。在 Docker 中,这称为「分离模式」。

使用 -d 选项可以让容器以分离模式运行。我们还会使用 --name 选项,为容器指定一个易于记忆的名称。

分离模式不会改变容器执行的任务,只会改变终端与容器的连接方式。服务会继续运行,但命令行提示符会立即返回。

运行以下命令,启动一个名为 my-nginx 的 Nginx 容器:

docker run --name my-nginx -d nginx

命令解析:

  • docker run:创建并启动新容器的命令。
  • --name my-nginx:为容器指定名称「my-nginx」。如果省略此选项,Docker 会分配一个随机名称,例如 happy_hopper。
  • -d:让容器以分离模式(后台)运行。
  • nginx:要使用的镜像。Docker 会先在本地查找该镜像;如果找不到,就会从 Docker Hub 下载。

输出结果:

终端会打印一串很长的字符。这就是容器 ID。命令行提示符立即返回,说明容器正在后台运行。

容器 ID 是 Docker 内部使用的标识符,容器名称则是便于人阅读的标签。在日常工作中,使用名称通常比使用很长的 ID 更方便。

检查容器状态

启动容器后,需要确认它是否按预期运行。docker ps 命令会列出所有处于活动状态的容器。

执行以下命令:

docker ps

你应该会看到类似以下内容的输出:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS      NAMES
a1b2c3d4e5f6   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 10 seconds   80/tcp     my-nginx

理解输出内容:

  • CONTAINER ID:此容器的唯一 ID,是之前看到的长字符串的截短版本。
  • IMAGE:正在运行的镜像(nginx)。
  • STATUS:Up 表示容器正在正常运行。
  • NAMES:为容器指定的名称(my-nginx)。

如果看到这条记录,就说明 Web 服务器已成功在后台运行!

docker ps 的输出是日常运维中最主要的查看信息之一。它会告诉你当前哪些容器处于活动状态、这些容器来自哪个镜像,以及它们已经运行了多长时间。

停止服务

完成服务操作或需要重新配置服务时,必须停止正在运行的容器。

docker stop 命令会向容器发送信号,请求其正常关闭。你可以使用容器 ID 或名称指定目标容器。由于我们为容器指定了名称 my-nginx,这里使用该名称。

正常停止很重要,因为许多服务需要时间关闭文件、释放端口或完成正在处理的工作。停止容器不只是「关闭它」,而是请求其主进程正常退出。

运行以下命令:

docker stop my-nginx

终端会打印 my-nginx,确认已经收到该命令。

验证容器是否已停止:

再次运行 docker ps。列表应为空,或者不再显示 my-nginx。

要确认容器仍然存在但已停止,请使用 -a(全部)选项:

docker ps -a

此时,你会看到 my-nginx,其状态为 Exited。

清理资源

停止容器不会删除容器。容器仍会保留在磁盘上,其日志和配置也会继续保存。如果你想稍后使用 docker start 重新启动它,这一特性会很有用。

这是另一个需要记住的生命周期区别:创建/运行、停止和删除是彼此独立的操作。Docker 将这些状态分开保存,这样你就可以在删除容器之前检查或重新启动它们。

但是,如果你已经完全不再需要该容器,就应该将其删除,以保持系统整洁。docker rm 命令用于删除已停止的容器。

执行以下命令,删除 my-nginx:

docker rm my-nginx

终端会打印 my-nginx,确认容器已被删除。

最终检查:

最后再运行一次 docker ps -a。你会看到该容器已经完全消失。

注意:通常不能使用 docker rm 删除正在运行的容器。必须先停止容器(如本实验所做),或者使用 -f(强制)选项;不过,优先采用正常停止的方式。

总结

在本实验中,你成功管理了 Docker 容器的完整生命周期。你学会了如何:

  • 使用 docker run -d 运行后台服务。
  • 使用 docker ps 检查活动容器的状态。
  • 使用 docker stop 正常停止服务。
  • 使用 docker rm 删除已停止的容器,以释放资源。

这四个命令是所有 Docker 用户日常工作中最常用的命令。现在,你已经可以进一步探索如何更深入地与正在运行的容器交互。