將 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 命令失敗了。這意味著您無法連線到 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://: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

請注意,您剛剛重啟的容器已在分離模式下啟動。另外,請觀察容器的狀態是“已執行 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 應用程式。