Если вы можете запустить все контейнеры в одном и том же файле docker-compose.yml
, тогда вы можете урезать пару параметров, чтобы сделать количество синтаксиса более приемлемым.
Нет конкретного требования c, что процесс внутри контейнера прослушивает тот же порт, который публикуется на хосте, а в современном Docker expose:
почти ничего не значит. Это означает, что вам не нужно специально настраивать переменную окружения PORT
; вы всегда можете запустить контейнерный процесс на порте по умолчанию 1234 и просто переназначить этот контейнер. Вам также не нужно повторять значение по умолчанию CMD
из Dockerfile.
Так что комплексная настройка Docker Compose для того, что вы показываете, может выглядеть как
version: '3' # 2 vs. 3 doesn't really matter here
services:
joe:
build: app
environment:
- NAME=joe
ports: '1234:1234'
jack:
build: app
environment:
- NAME=jack
ports: '1235:1234'
Если вы хотите использовать серию вызовов docker-compose
, как вы показали, у Compose есть внутреннее понятие «проект», и он отслеживает состояние контейнеров в проекте. По умолчанию в качестве имени проекта используется локальное имя текущего каталога. В вашей команде docker-compose up
Compose видит, что вы изменили параметры сопоставления портов и среды для контейнера node
в том же единственном проекте, поэтому он заменяет существующий контейнер.
Чтобы указать Compose, что там это разные проекты, вам нужна опция docker-compose -p
NAME=joe PORT=1234 docker-compose -p joe up -d node
NAME=jack PORT=1235 docker-compose -p jack up -d node
Обратите внимание, что вам нужно будет повторять эту опцию при каждый docker-compose
вызов команды. Если вы используете не-Compose команды, такие как docker ps
, вы сможете увидеть имя проекта, включенное как часть имени контейнера (joe_node_1
, jack_node_1
).