将你的 Rust 镜像作为容器运行

前提条件

你已完成构建你的 Rust 镜像并已构建了一个镜像。

概述

容器是一个正常的操作系统进程,不同之处在于 Docker 会隔离此进程,使其拥有自己的文件系统、自己的网络以及与主机分离的隔离进程树。

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

运行镜像

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

$ 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。这将使你返回终端提示符。

要为你容器发布端口,请在 docker run 命令上使用 --publish 标志(简写为 -p)。--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 可以在分离模式(detached mode)或后台运行你的容器。为此,你可以使用 --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

现在你应该看到列出了几个容器。这些是你启动后又停止但尚未删除的容器。

重新启动你刚刚停止的容器。找到你刚刚停止的容器的名称,并在以下 restart 命令中替换容器名称。

$ 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”。当你重新启动容器时,它会使用最初启动时相同的标志或命令启动。

现在,停止并删除所有容器,然后看一下如何解决随机命名的问题。停止你刚刚启动的容器。找到正在运行的容器的名称,并在以下命令中用你系统上的容器名称替换。

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

页面选项