將您的 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 上的 localhost。這是正常的,因為您的容器在隔離環境中運行,其中包含網路。停止容器並重新啟動,並在您的本機網路上發佈埠 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 http://localhost:3001

您應該會看到如下輸出。

Hello, Docker!

成功!您能夠連線到在您的容器內埠 8000 上運行的應用程式。切換回運行容器的終端機並停止它。

按 Ctrl-c 停止容器。

在分離模式下執行

到目前為止,這很棒,但是您的範例應用程式是一個網路伺服器,您不必連線到容器。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

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