将 Rust 镜像作为容器运行

先决条件

您已完成 构建 Rust 映像并构建了一个映像。

概述

容器是一个普通的操作系统进程,只不过 Docker 隔离了该进程,使其拥有自己的文件系统、自己的网络以及与主机分离的自己的隔离进程树。

要在容器内运行映像,请使用该docker run命令。该docker run命令需要一个参数,即图像的名称。

运行图像

用于运行您在构建 Rust 映像docker run中构建的映像 。

$ docker run docker-rust-image

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

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

$ curl http://localhost:8000

您应该看到如下所示的输出。

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

正如您所看到的,您的curl命令失败了。这意味着您无法连接到端口 8000 上的本地主机。这是正常的,因为您的容器是独立运行的,其中包括网络。停止容器并使用本地网络上发布的端口 8000 重新启动。

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

要为容器发布端口,您将在命令中使用标志--publish-p简称)docker run。命令的格式--publish[host port]:[container port].因此,如果您想将容器内的端口 8000 公开到容器外的端口 3001,则需要传递3001:8000--publish标志。

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

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

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

$ curl http://localhost: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 http://localhost: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 秒”。当您重新启动容器时,它将以最初启动时相同的标志或命令启动。

现在,停止并删除所有容器,然后看看修复随机命名问题。停止刚刚启动的容器。找到正在运行的容器的名称,并将以下命令中的名称替换为系统上容器的名称。

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