如何确定扩展服务的副本数

时间:2019-10-30 02:35:25

标签: docker docker-compose

我有一个docker-compose文件,其中包含2个服务,一个主服务和一个从服务。我希望能够使用

将奴隶服务扩展到一些实例
docker-compose up --scale slave=N

但是,我必须在主服务中运行的命令上指定的选项之一是期望的从属实例数。例如。如果我缩放slave = 10,则需要在主服务上的命令中设置--num-slaves = 10。

是否可以通过docker-compose文件本身或自定义的入口点shellscript确定给定服务的实例数?

我面临的问题是,由于尚未找到从docker-compose文件格式本身指定缩放实例数的方法,因此我依靠运行命令的人输入比例因子始终如一,并使该值与我需要告诉主节点期望的值保持一致。信任用户做正确的事是灾难的根源。如果我可以继续让用户在命令行上指定比例值,则需要一种方法来确定运行时该比例值是什么。

2 个答案:

答案 0 :(得分:0)

scale并未从撰写版本3开始添加,但您可以使用replicas

version: "3.7"
services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1

并使用以下命令运行它:

docker-compose --compatibility up -d
  

docker-compose 1.20.0引入了一个新的--compatibility标志   帮助开发人员更轻松地过渡到版本3。启用后,   docker-compose读取每个服务定义的deploy部分   并尝试将其转换为等效的版本2参数。   当前,以下部署密钥已翻译:

resources limits and memory reservations
replicas
restart_policy condition and max_attempts

但是:

  

请勿在生产中使用它!

     

我们建议不要在生产中使用--compatibility模式。因为   使用non-Swarm所得的配置只是一个近似值   模式属性,可能会产生意外的结果。

请参阅this

PS:

  

Docker容器名称必须唯一,如果您指定了一个容器名称,则不能将服务扩展到超过1个容器   自定义名称。尝试这样做会导致错误。

答案 1 :(得分:0)

不幸的是,无法为docker compose定义副本。 仅适用于DOCKER群” 文档将其指定为link

提示:或者,在Compose文件版本3.x中,您可以在deploy键下指定副本,作为Swarm模式的服务配置的一部分。部署密钥及其子选项(包括副本)仅适用于docker stack deploy命令,不适用于docker-compose up或docker-compose run。

因此,如果您在yaml中有deploy部分,但是使用docker-compose运行它,那么它将不会生效。

version: "3.3"

services:
  alpine1:
    image: alpine
    container_name: alpine1
    command: ["/bin/sleep", "10000"]
    deploy:
      replicas: 4
  alpine2:
    image: alpine
    container_name: alpine2
    command: ["/bin/sleep", "10000"]
    deploy:
      replicas: 2

因此,在docker compose中进行扩展的唯一方法是手动运行scale命令。

docker-compose scale alpine1=3

注意:我从事的工作是他们喜欢docker-compose,因此我们有bash脚本来执行诸如您所描述的操作。例如,我们会有类似./controller-app.sh scale test_service=10的东西,它将运行docker-compose scale test_service=10

更新 要检查副本数,可以将docker套接字安装到容器中。然后运行docker ps --format {{ .Names }} | grep $YOUR_CONTAINER_NAME

这是安装插座的方式。

docker run -v  /var/run/docker.sock:/var/run/docker.sock -it alpine sh

安装docker

apk update
apk add docker