skip to Main Content

I defined a service in docker-compose.yml in the following way:

version : "3"

services:
  web:
    image: nginx
    ports:
      - 8080-8082:80

When I try to start three instances of this service with the command

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

one instance is started, but when docker-compose tries to start the other instances, they produce the error message

ERROR: for nginxtest_web_1  Cannot start service web: Ports are not available: listen tcp 0.0.0.0:8080: bind: Only one usage of each socket address (protocol/network address/port) 
is normally permitted.

Sometimes two instance are started successfully and only one instance fails. The runtime behavior seems to be quite random. Obviously, docker-compose assigns the same host port to multiple nginx instances. When I repeat the above command two more times all instances get started with different host ports assigned. This error also occurs with other docker images. When I omit the host port range in the docker-compose.yml file different random host ports are assigned and everything works as expected.

I use docker version 19.03.12 and docker-compose 1.29.0 on Windows 10 (WSL 2).

Is this a docker-compose bug? Is there any workaround?

Update:
Of course I only scale to 3 instances (the number of ports in my host port range)

docker-compose up -d --scale web=3 -d

2

Answers


  1. It seems that some ports from range 8080-8082 are already used. Also you are specifying only 3 ports when you are scaling to 5 services.

    Use something like this and do not specify the port range to let docker select the available free ports automatically.

    version : "3"
    
    services:
      web:
        image: nginx
        ports:
          - 80
    
    Login or Signup to reply.
  2. After scaling up, you can try:

    docker compose restart
    

    This is the current workaround that I had figured out. Hope it helps.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search