概述

在这篇教程中,我们将学习如何使用交互式外壳运行多个Docker容器。首先,我们将使用简单的docker run命令运行一个Docker容器。随后,我们将使用docker-compose命令运行相同的Docker容器。

Docker 和 Docker Compose

Docker容器允许开发者将可以在不同环境中无缝运行的应用程序打包在一起。实际上,在生产环境部署一个web应用程序可能需要几个服务:

  • 数据库服务器
  • 负载均衡器
  • Web服务器

在这种情况下,Docker Compose是一个非常实用的工具。

Docker Compose主要用于运行多个容器作为单个服务,同时在容器之间维护流畅的连接。

了解 Docker Compose

为了使用docker-compose命令运行Docker容器,我们需要将所有配置添加到单一的docker-compose.yml配置文件中。重要的是,使用docker-compose而不是常规的docker run命令的一个关键优势是在单个文件中进行配置整合,机器和人类都可以阅读这个文件。

让我们创建一个简单的docker-compose.yml文件来展示如何使用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正在运行。然而,这种方法的问题是,一旦退出上述外壳,容器也会停止运行

为了长时间运行Docker容器,我们需要在交互式外壳下运行它。

在Docker中使用交互式外壳

Docker中的交互模式允许我们在容器处于运行状态时执行命令。为了在Docker容器中以交互模式运行,我们使用*-it选项。进一步地,我们通过-it*标志将STDIN和STDOUT通道连接到我们的终端。

Docker Compose使用单主机部署,具有以下优点:

  • 配置快速且容易
  • 促进快速部署
  • 减少完成多项任务所需的时间
  • 所有容器独立运行,降低发生漏洞的风险

现在,让我们使用docker-compose与交互式外壳一起运行之前提到的tomcat容器:

version: "3"
services:
 server:
   image: tomcat:jre11-openjdk
   ports:
     - 8080:8080
   stdin_open: true 
   tty: true

在这个例子中,我们在docker-compose.yml文件中添加了stdin_opentty选项,以便我们可以在Docker Compose设置中拥有交互式外壳

当然,要访问Docker容器,首先需要使用以下命令运行容器:

$ docker-compose up --d

现在,我们可以获取运行docker-compose服务的交互式外壳:

$ docker-compose exec server bash

注意我们使用服务名称而不是容器名称

最后,我们成功地使用上述命令登录到容器中。

结论

在这篇文章中,我们演示了如何使用docker-compose命令获取交互式外壳。首先,我们学习了如何使用docker-compose命令运行Docker容器。之后,我们探索了使用docker exec命令和docker-compose YAML配置的相同方法。