Docker-Compose运行多个实例的同一镜像在不同端口上

17

我有一个Python Flask应用程序,希望在同一服务器上拥有多个实例,每个容器都有自己的输出端口(或DNS)和依赖项。我使用了docker-compose并且它工作得很好。 我看到scale参数,但我认为它适用于类似负载均衡的情况,而不是拥有应用程序的不同版本。另一个解决方案是为一个应用程序拥有多个服务,并通过终端以其名称运行每个实例。

2个回答

28

docker-compose scale 命令已经过时,文档建议使用 docker-compose up --scale SERVICE=NUM。但是,在指定端口进行扩展时需要小心。如果您尝试将容器放在端口 80 上五次,则其中四个将失败 - 该端口已被占用。但是有一个解决方案。

我刚刚测试了这种方法,它有效。下面是我测试的 docker-compose.yml 文件:

version: '3.7'
services:
  test_app:
    image: <my_custom_image>
    ports:
      - 10000-10003:80

然后我使用 docker-compose up --scale test_app=4 命令运行它,它在四个预先指定的端口上部署了 4 个实例的 test_app 应用程序: 10000, 10001, 1000210003

希望我回答了你的问题。


谢谢!这真的很有帮助。但是依赖项怎么办?我为该应用程序使用了一个数据库,并使用depends_on指定其为依赖项。我希望所有容器之间都是隔离的。 - Artin Falahi
不会发生这种情况。所有容器都将在同一个网络上,因此它们将彼此知晓。通常,默认情况下,您在 docker-compose.yml 中放置在 services 中的所有内容都将在同一个网络上,无论是否进行扩展。您可以通过在列出容器时看到的名称连接另一个容器。 - Kevin Kopf
你能在docker-compose.yaml中为单个服务进行扩容吗?比如说我想扩容我的实际服务,但是所有读取都来自于单个数据库? - mike01010
@mike01010 我的回答适用,但要注意竞态条件。 - Kevin Kopf

2

一种选择是在您的Docker Compose文件中复制服务。这不是最优雅的选项,但是您可以指定容器正在侦听的端口。 例如:

services:
  app1:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:8000"  # Map host port 8000 to container port 8000

  app2:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8001:8000"  # Map host port 8001 to container port 8000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接