如何在docker-compose中创建副本(replicas)

352次阅读
没有评论

问题描述

在使用docker-compose时,遇到了一个问题。根据docker-compose的问题#5586,scale选项已经被弃用。替代方案是使用deploy.replicas,但是这个选项只能在docker stack中使用,意味着你必须在swarm模式下运行Docker。
用户提到了两个替代方案,一个是使用命令行选项--scale来缩放服务,但是用户认为这个解决方案不够理想,因为docker-compose.yml应该是自包含的,不应该依赖于命令行选项。
另一个替代方案是在--compatibility模式下运行docker-compose,但是用户认为这不是一个长期解决方案。
用户想知道你有什么建议来替代docker-compose v2中的scale选项。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据github上的一些讨论,可以使用deployreplicas来替代scale选项。同时需要使用--compatibility选项。
让我们来测试一下。首先,我们需要一个docker-compose.yml文件:

version: '3.3'
services:
  nginx:
    image: nginx
    scale: 6

然后运行docker-compose up命令,结果会报错:

ERROR: The Compose file './docker-compose.yml' is invalid because:Unsupported config option for services.nginx: 'scale'

根据@decoomanj的建议,我们将scale替换为replicas

version: '3.3'
services:
  nginx:
    image: nginx
    deploy:
      replicas: 6

然后运行docker-compose --compatibility up命令,会启动6个服务:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f19aa54634d7        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        80/tcp              6233_nginx_5
74cff4ac1c3        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 3 seconds        80/tcp              6233_nginx_3
b86ed7b217fe        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 1 second         80/tcp              6233_nginx_6
0b92e5ef4a0e        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 2 seconds        80/tcp              6233_nginx_2
e414bca52b53        nginx               "nginx -g 'daemon of…"   5 seconds ago       Up 4 seconds        80/tcp              6233_nginx_4
e9f33dc634a8        nginx               "nginx -g 'daemon of…"   6 seconds ago       Up 5 seconds        80/tcp              6233_nginx_1

综上所述,要解决这个问题,需要将scale选项替换为deploy.replicas,并且需要使用--compatibility选项。

方案2

使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。你可以使用docker run命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。

示例:

以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用docker run命令启动容器A,并将其命名为container_a。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo命令来测试)。一旦容器A就绪,我们再使用docker run命令启动容器B,并将其命名为container_b

正文完