compose: Port conflict with multiple "host::port" services
Description of the issue
If a compose file defines multiple services that share an overlapping port range, a port conflict occurs when docker-compose up
is executed. This behavior started to happen for me when upgrading to Docker Desktop 2.2.0 (Stable) for Mac. The version I was previously running (I believe 2.1.5) was able to select distinct ports for the two services without conflicting. Here is a POC Docker Compose file:
version: '2.1'
services:
postgres-foo:
image: postgres
ports:
- "127.0.0.1:32768-61000:5432"
postgres-bar:
image: postgres
ports:
- "127.0.0.1:32768-61000:5432"
Context information (for bug reports)
Output of docker-compose version
docker-compose version 1.25.2, build 698e2846
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.1d 10 Sep 2019
Output of docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:22:34 2019
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.5
API version: 1.40 (minimum version 1.12)
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:29:19 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.2.10
GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339
runc:
Version: 1.0.0-rc8+dev
GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
docker-init:
Version: 0.18.0
GitCommit: fec3683
Output of docker-compose config
(Make sure to add the relevant -f
and other flags)
services:
postgres-bar:
image: postgres
ports:
- 127.0.0.1:32768-61000:5432/tcp
postgres-foo:
image: postgres
ports:
- 127.0.0.1:32768-61000:5432/tcp
version: '2.1'
Steps to reproduce the issue
docker-compose up
Observed result
Services fail to start and a port conflict error occurs
Expected result
Services start up. An available port within the overlapping range is selected for each service.
Stacktrace / full error message
docker-compose up
Starting docker-bug-poc_postgres-foo_1 ...
Starting docker-bug-poc_postgres-bar_1 ... error
Starting docker-bug-poc_postgres-foo_1 ... error
ERROR: for docker-bug-poc_postgres-bar_1 Cannot start service postgres-bar: Ports are not available: listen tcp 127.0.0.1:32768: bind: address already in use
ERROR: for docker-bug-poc_postgres-foo_1 Cannot start service postgres-foo: Ports are not available: listen tcp 127.0.0.1:37587: socket: too many open files
ERROR: for postgres-bar Cannot start service postgres-bar: Ports are not available: listen tcp 127.0.0.1:32768: bind: address already in use
ERROR: for postgres-foo Cannot start service postgres-foo: Ports are not available: listen tcp 127.0.0.1:37587: socket: too many open files
ERROR: Encountered errors while bringing up the project.
Additional information
I uploaded diagnostic information with the ID 37C41A27-71E7-4431-AFBE-5DA0EEC74A3C/20200126225028
About this issue
- Original URL
- State: open
- Created 4 years ago
- Reactions: 17
- Comments: 30 (1 by maintainers)
I am experiencing a similar issue that may come from the same cause. The context is the same: upgrading to Docker Desktop 2.2.0 on MacOS breaks the port publishing when trying to run an NFS server container. To reproduce:
The error shown:
I have already taken down every component related to NFS on the Mac itself, and nothing is occupying that port. The output of
sudo lsof -iTCP -sTCP:LISTEN -n -P
:Just downgrading to Docker Desktop 2.1.x solves everything. Does anybody have any idea for a workaround?
Same problem on MacOS with Docker Desktop v3.1.0 (51484) with the following docker-compose.yml:
First call fails, second call works:
So I tried:
docker-compose up -d kafka && docker-compose up -d --scale kafka=3 --scale zookeeper=2 kafka
and this works as well. It seems there is a problem with initial start & scaling and the same time.The error occurs whenever a services which exposes a host port range is scaled, e. g.
Running 3 instances of this services with
results in a port conflict. Running this command three times resolves the problem.
I use docker version 19.03.12 and docker-compose 1.29.0 on Windows 10 (WSL 2).
Still occurs on docker version v20.10.7, docker-compose 1.29.2 on Windows 10 (WSL 2).
I found a setting that works, at least for the abovementioned problem (replicas causing port conflict). Just leave the
published
ports unassigned (host-side ports), which forces Docker itself to randomly assign them. In other words:Works:
or:
Does Not Work:
or:
or:
Wondering how this would’ve worked before, as it wouldn’t be possible to have two processes listening on the same port 🤔