使用 Docker Compose 的交互式 Shell
一、概述
在本教程中,我們將學習如何使用交互式 shell 運行多個 Docker 容器。首先,我們將使用簡單的docker run
命令運行 Docker 容器。稍後,我們將使用docker-compose
命令運行相同的 Docker 容器。
2. Docker 和 Docker Compose
Docker 容器允許開發人員打包跨不同環境無縫工作的應用程序。事實上,在生產環境中典型的 Web 應用程序部署可能需要幾個服務:
- 數據庫服務器
- 負載均衡
- 網絡服務器
在這種情況下,Docker Compose 是一個非常方便的工具。
Docker Compose 主要用於將多個容器作為單個服務運行,同時保持容器之間的平滑連接。
3. 了解 Docker Compose
要使用docker-compose
命令運行 Docker 容器,我們需要將所有配置添加到單個docker-compose.yml
配置文件中。重要的是,與普通docker run
命令相比,使用docker-compose
的主要好處之一是將配置整合到一個文件中,機器和人類都可以閱讀。
讓我們創建一個簡單docker-compose.yml
來展示如何使用 docker docker-compose up
命令運行 Docker 容器:
version: "3"
services:
server:
image: tomcat:jre11-openjdk
ports:
- 8080:8080
在這裡,我們使用tomcat
作為基礎鏡像,並在主機上暴露了8080
端口。要查看它的實際效果,讓我們使用docker-compose up
命令構建並運行此映像:
$ docker-compose up
Pulling server (tomcat:jre11-openjdk)...
jre11-openjdk: Pulling from library/tomcat
001c52e26ad5: Pull complete
...
704b1ae41f0e: Pull complete
Digest: sha256:85bfe38b723bc864ed594973a63c04b112e20d6d33eee57cd5303610d8e3dc77
Status: Downloaded newer image for tomcat:jre11-openjdk
Creating dockercontainers_server_1 ... done
Attaching to dockercontainers_server_1
server_1 | NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
server_1 | 03-Aug-2022 06:22:17.259 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/10.0.23
至關重要的是,我們應該從包含docker-compose.yml
文件的目錄中運行上述命令。
在上面的輸出中,我們可以看到dockercontainers_server_1
已啟動並正在運行。但是,這種方法的一個問題是,一旦我們退出上述 shell,容器也會停止。
要長期運行 Docker 容器,我們需要使用交互式 shell 運行它。
4. Docker 中的交互式 Shell
Docker 中的交互模式允許我們在容器處於running
狀態時執行命令。要以交互模式運行 Docker 容器,我們使用-it
選項。此外,我們使用-it
標誌將 STDIN 和 STDOUT 通道附加到我們的終端。
Docker Compose 使用具有多個優點的單主機部署:
- 快速且易於配置
- 實現快速部署
- 減少完成多項任務所需的時間
- 所有容器獨立運行,從而降低了違規風險
現在讓我們使用帶有交互式 shell 的docker-compose
運行之前的tomcat
容器:
version: "3"
services:
server:
image: tomcat:jre11-openjdk
ports:
- 8080:8080
stdin_open: true
tty: true
在這種情況下,我們**在 docker docker-compose.yml
文件中添加了stdin_open
和tty
選項,以便我們可以使用 docker docker-compose
setup 擁有一個交互式 shell** 。
當然,要訪問 Docker 容器,我們首先需要使用以下命令運行容器:
$ docker-compose up --d
現在,我們可以獲得正在運行的docker-compose
服務的交互式 shell:
$ docker-compose exec server bash
請注意我們如何使用服務名稱而不是容器名稱。
最後,我們使用上面的命令成功登錄到容器中。
5. 結論
在本文中,我們演示瞭如何使用docker-compose
命令獲取交互式 shell。首先,我們學習瞭如何使用docker-compose
運行 Docker 容器。之後,我們使用docker exec
命令和docker-compose
YAML 配置對交互式 shell 進行了同樣的探索。