docker-compose, створюючи кілька екземплярів для одного зображення


78

Мені потрібно запустити кілька контейнерів для одного зображення. Якщо я створив свій файл для написання, як показано нижче, він працює нормально.

version: '2'

services:
  app01:
    image: app
  app02:
    image: app
  app03:
    image: app
  app04:
    image: app
  app05:
    image: app  

Чи є для мене простий спосіб згадати кількість екземплярів композиції замість копіювання та вставлення кілька разів?

Відповіді:


90

Оновлена ​​відповідь (жовтень 2017)

Як згадували інші, API докера змінився. Я оновлюю свою відповідь, оскільки саме на неї, напевно, подивиться більшість людей.

docker-compose up -d --scale app=5

На жаль, ми не можемо вказати це у файлі docker-compose.yml (станом на версію 3.5).

Подробиці:
Вони представили scaleопцію для версій 2.2 та 2.3 docker-compose, але видалили її для версії 3.0. Крім того, для використання версії 2.2 або 2.3 вам потрібно буде завантажити стару версію інструмента складання докера. Поточна версія не підтримує 2.2 або 2.3 (однак підтримує 2.0 або 2.1). Також є новий deployрозділ з, replicas: 5але це лише для режиму рою.

--- Стара відповідь --------------------------------------

docker-compose scale app=5

Див. Https://docs.docker.com/compose/reference/scale/

Тоді вам потрібен лише цей файл для створення докера

version: '2'

services:
  app:
    image: app

4
Чи є спосіб вказати це у файлі складання докера, щоб при запуску docker-compose upвін запускав попередньо налаштовану кількість екземплярів?
серпень

1
Як встановити діапазон портів для контейнерів?
Мухаммед Абрар

1
@MuhammadAbrar Ви вказуєте порти так само, як і для будь-якої служби. Або використовуйте expose:для розкриття портів іншими службами в тій же мережі, або для відкриття портів ports:хосту (загальнодоступний). docs.docker.com/compose/compose-file/#short-syntax-1
Бернард

1
Зверніть увагу, що опускання -d(режим демона) означає, що всі контейнери, розпочаті за допомогою одного і того ж docker-composeфайлу, зупиняться, як тільки Ctrl + C використовується для завершення останнього масштабованого контейнера. Дуже небезпечно. Я пропоную додати -dдо docker-compose upу відповіді вище, щоб уникнути копіювання / вставки лиха.
Marco Chiappetta

1
@MarcoChiappetta хороший момент. Я зазвичай це роблю up -d. Опечатка цього разу.
Бернард

29

Тепер scaleкоманда застаріла, upзамість неї слід використовувати .

docker-compose up --scale app=2

докладніше на https://docs.docker.com/compose/reference/up


Це насправді проблематично, і це не висвітлено у документі. Якщо у нас є служби A, B, C і ми складаємо докер - масштаб В = 2, це почне всі A, В, С, то це еквівалентно складенню докера - масштаб А = 1 - шкала B = 2 - шкала C = 1. Я майже впевнений, що користувач у багатьох випадках хоче не цього.
Шива Ву

@fssilva, Ця команда спрацювала у моєму випадку. Однак мені доведеться змінити свій файл створення. (1) видалити ім’я контейнера з файлу композиції, щоб вирішити „ім’я вже використовується помилкою контейнера“. (2) видалити явні прив’язки портів, щоб вирішити помилку „не вдалося: порт вже виділено“.
harshit2811

24

Ви можете зробити це, replicaяк зазначено в https://docs.docker.com/compose/compose-file/#replicas

version: '3'
services:
  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 6

Редагувати (з коментарів): можна використовувати, docker-compose --compatibility upщоб докер прийняв розділ розгортання, не використовуючи рій.


24
Репліки призначені лише для розгортання у рої.
Ken J

3
Так, якщо параметр ігнорується звичайними docker-compose upкомандами.
giorgiosironi

3
Документи deployвступу / заголовка стверджують, що весь розділ ігнорується docker-compose up( docs.docker.com/compose/compose-file/#deploy )
hcarty

21
Можна використовувати, docker-compose --compatibility upщоб докер прийняв deployрозділ, не використовуючи рій.
Нікола Петканський

2
@NikolaPetkanski, ваш коментар повинен бути позначений як правильна відповідь. Дякую!
Рінор,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.