将您的 Rust 镜像作为容器运行
先决条件
您已完成构建您的 Rust 镜像,并且已经构建了一个镜像。
概述
容器是一个正常的操作系统进程,只不过 Docker 对此进程进行了隔离,使其拥有自己的文件系统、自己的网络以及独立于主机之外的独立进程树。
要在容器中运行镜像,您可以使用 `docker run` 命令。`docker run` 命令需要一个参数,即镜像的名称。
运行镜像
使用 `docker run` 命令运行您在构建您的 Rust 镜像中构建的镜像。
$ docker run docker-rust-image
运行此命令后,您会注意到没有返回到命令提示符。这是因为您的应用程序是一个服务器,它在循环中运行,等待传入请求,直到您停止容器才会将控制权返回给操作系统。
打开一个新的终端,然后使用 `curl` 命令向服务器发出请求。
$ curl https://:8000
您应该会看到类似以下的输出。
curl: (7) Failed to connect to localhost port 8000 after 2236 ms: Couldn't connect to server
如您所见,您的 `curl` 命令失败了。这意味着您无法连接到端口 8000 上的本地主机。这很正常,因为您的容器是隔离运行的,包括网络。停止容器并重新启动,将端口 8000 发布到您的本地网络上。
要停止容器,请按 Ctrl-C。这会将您返回到终端提示符。
要为您的容器发布端口,您将在 `docker run` 命令上使用 `--publish` 标志(简写为 `-p`)。`--publish` 命令的格式为 `[主机端口]:[容器端口]`。因此,如果您想将容器内部的端口 8000 暴露给容器外部的端口 3001,您将向 `--publish` 标志传递 `3001:8000`。
在容器中运行应用程序时,您没有指定端口,默认端口是 8000。如果您希望之前发送到端口 8000 的请求能够正常工作,您可以将主机的端口 3001 映射到容器的端口 8000。
$ docker run --publish 3001:8000 docker-rust-image
现在,重新运行 curl 命令。请记住打开一个新的终端。
$ curl https://:3001
您应该会看到类似以下的输出。
Hello, Docker!
成功了!您已经能够连接到在容器内部运行的应用程序的端口 8000。切换回运行容器的终端并停止它。
按 Ctrl-C 停止容器。
以分离模式运行
到目前为止一切都很好,但您的示例应用程序是一个 Web 服务器,您不必连接到容器。Docker 可以以分离模式或在后台运行您的容器。为此,您可以使用 `--detach` 或简称 `-d`。Docker 会像以前一样启动您的容器,但这次会“分离”容器并返回到终端提示符。
$ docker run -d -p 3001:8000 docker-rust-image
ce02b3179f0f10085db9edfccd731101868f58631bdf918ca490ff6fd223a93b
Docker 在后台启动了您的容器,并在终端上打印了容器 ID。
再次,确保您的容器正常运行。再次运行 curl 命令。
$ curl https://:3001
您应该会看到类似以下的输出。
Hello, Docker!
列出容器
由于您在后台运行了容器,您如何知道您的容器是否正在运行,或者您的机器上还有哪些其他容器正在运行?要查看机器上正在运行的容器列表,请运行 `docker ps`。这类似于您在 Linux 中使用 `ps` 命令查看进程列表的方式。
您应该会看到类似以下的输出。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3074745e412c docker-rust-image "/bin/server" 8 seconds ago Up 7 seconds 0.0.0.0:3001->8000/tcp wonderful_kalam
`docker ps` 命令提供了关于您正在运行的容器的大量信息。您可以看到容器 ID、容器内运行的镜像、用于启动容器的命令、创建时间、状态、暴露的端口以及容器的名称。
您可能想知道容器的名称从何而来。由于您在启动容器时没有提供名称,Docker 生成了一个随机名称。您稍后会修复这个问题,但首先需要停止容器。要停止容器,请运行 `docker stop` 命令,它就是停止容器。您需要传递容器的名称,或者您可以使用容器 ID。
$ docker stop wonderful_kalam
wonderful_kalam
现在,重新运行 `docker ps` 命令以查看正在运行的容器列表。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
停止、启动和命名容器
您可以启动、停止和重新启动 Docker 容器。当您停止一个容器时,它并没有被移除,只是状态变为已停止,容器内的进程也停止了。当您在上一个模块中运行 `docker ps` 命令时,默认输出只显示正在运行的容器。当您传递 `--all` 或简称 `-a` 时,您会看到机器上的所有容器,无论其启动或停止状态如何。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
3074745e412c docker-rust-image "/bin/server" 3 minutes ago Exited (0) 6 seconds ago
wonderful_kalam
6cfa26e2e3c9 docker-rust-image "/bin/server" 14 minutes ago Exited (0) 5 minutes ago
friendly_montalcini
4cbe94b2ea0e docker-rust-image "/bin/server" 15 minutes ago Exited (0) 14 minutes ago
tender_bose
您现在应该看到列出了几个容器。这些是您已启动和停止但尚未移除的容器。
重新启动您刚停止的容器。找到您刚停止的容器的名称,并将其替换为以下重启命令中的容器名称。
$ docker restart wonderful_kalam
现在,再次使用 `docker ps` 命令列出所有容器。
$ docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
3074745e412c docker-rust-image "/bin/server" 6 minutes ago Up 4 seconds 0.0.0.0:3001->8000/tcp wonderful_kalam
6cfa26e2e3c9 docker-rust-image "/bin/server" 16 minutes ago Exited (0) 7 minutes ago
friendly_montalcini
4cbe94b2ea0e docker-rust-image "/bin/server" 18 minutes ago Exited (0) 17 minutes ago
tender_bose
请注意,您刚刚重新启动的容器已以分离模式启动。此外,请注意容器的状态为“Up X seconds”(已运行 X 秒)。当您重新启动容器时,它会使用与最初启动时相同的标志或命令启动。
现在,停止并移除所有容器,然后查看如何解决随机命名问题。停止您刚刚启动的容器。找到您正在运行的容器的名称,并将其替换为以下命令中您系统上的容器名称。
$ docker stop wonderful_kalam
wonderful_kalam
现在您已经停止了所有容器,接下来移除它们。当您移除一个容器时,它不再运行,也不处于停止状态,但容器内的进程已经停止,并且容器的元数据也已被移除。
要删除容器,请运行 `docker rm` 命令并附带容器名称。您可以通过一个命令向该命令传递多个容器名称。再次,将以下命令中的容器名称替换为您系统中的容器名称。
$ docker rm wonderful_kalam friendly_montalcini tender_bose
wonderful_kalam
friendly_montalcini
tender_bose
再次运行 `docker ps --all` 命令,查看 Docker 是否已移除所有容器。
现在,是时候解决随机命名问题了。标准做法是为容器命名,原因很简单:更容易识别容器中运行的是什么以及它与哪个应用程序或服务相关联。
要命名容器,只需将 `--name` 标志传递给 `docker run` 命令即可。
$ docker run -d -p 3001:8000 --name docker-rust-container docker-rust-image
1aa5d46418a68705c81782a58456a4ccdb56a309cb5e6bd399478d01eaa5cdda
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c68fa18de1f6 docker-rust-image "/bin/server" 7 seconds ago Up 6 seconds 0.0.0.0:3001->8000/tcp docker-rust-container
好多了!您现在可以根据名称轻松识别您的容器。
摘要
在本节中,您了解了运行容器。您还了解了通过启动、停止和重新启动容器来管理容器。最后,您还了解了如何为容器命名,以便它们更容易识别。
相关信息
后续步骤
在下一节中,您将学习如何在容器中运行数据库并将其连接到 Rust 应用程序。