将 Rust 镜像作为容器运行

先决条件

您已完成 构建 Rust 镜像 并且您已经构建了一个镜像。

概述

容器是一个普通的操作系统进程,不同的是 Docker 将此进程隔离,使其拥有自己的文件系统、网络和独立的进程树,与主机分离。

要在容器内运行镜像,可以使用 docker run 命令。docker run 命令需要一个参数,即镜像的名称。

运行镜像

使用 docker run 运行您在 构建 Rust 镜像 中构建的镜像。

$ docker run docker-rust-image

运行此命令后,您会注意到您没有返回到命令提示符。这是因为您的应用程序是一个服务器,它在循环中运行,等待传入请求,直到您停止容器,才会将控制权返回给操作系统。

打开一个新的终端,然后使用 curl 命令向服务器发出请求。

$ curl https://127.0.0.1:8000

您应该看到以下类似的输出。

curl: (7) Failed to connect to localhost port 8000 after 2236 ms: Couldn't connect to server

如您所见,您的 curl 命令失败了。这意味着您无法连接到 localhost 上的端口 8000。这是正常的,因为您的容器在隔离环境中运行,包括网络。停止容器并重新启动,并将端口 8000 发布到您的本地网络。

要停止容器,请按 ctrl-c。这将使您返回到终端提示符。

要发布容器的端口,您将在 docker run 命令上使用 --publish 标志(缩写为 -p)。--publish 命令的格式为 [主机端口]:[容器端口]。因此,如果您想将容器内部的端口 8000 暴露给容器外部的端口 3001,您需要将 3001:8000 传递给 --publish 标志。

您在容器中运行应用程序时没有指定端口,默认端口为 8000。如果您希望先前发送到端口 8000 的请求能够正常工作,您可以将主机的端口 3001 映射到容器的端口 8000

$ docker run --publish 3001:8000 docker-rust-image

现在,重新运行 curl 命令。请记住打开一个新的终端。

$ curl https://127.0.0.1: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://127.0.0.1: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

请注意,您刚刚重启的容器已在分离模式下启动。另外,请观察容器的状态是“已运行 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 是否已删除所有容器。

现在,是时候解决随机命名问题了。标准做法是为容器命名,这样便于识别容器内运行的内容,以及它关联的应用程序或服务。

要命名一个容器,您只需要在 docker run 命令中传递 --name 标志。

$ 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 应用程序。