將您的 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 應用程式。