344

When I run docker-compose up in my Docker project it fails with the following message:

Error starting userland proxy: listen tcp 0.0.0.0:3000: bind: address already in use

netstat -pna | grep 3000

shows this:

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -  

I've already tried docker-compose down, but it doesn't help.

5
  • 31
    Run a sudo netstat -pna | grep 3000 to get the process that's listening. Commented Jun 22, 2016 at 15:41
  • 3
    Your output shows some other process is listening on port 3000 already. Can you use some other port? Try with sudo to see the process name. Commented Jun 22, 2016 at 16:02
  • Yep, there was ntop on this port. Thanx! I didn't know sudo can change output :) Commented Jun 22, 2016 at 16:18
  • For me it's port 8888 which is docker proxy Commented Jul 9, 2018 at 20:52
  • I fixed this same issue in this answer: stackoverflow.com/a/58772307/3530707 Commented Nov 11, 2019 at 13:24

43 Answers 43

310

This helped me:

docker-compose down  # Stop container on current dir if there is a docker-compose.yml
docker rm -fv $(docker ps -aq)  # Remove all containers
sudo lsof -i -P -n | grep <port number>  # List who's using the port

and then: kill -9 <process id> (macOS) or sudo kill <process id> (Linux).

Source: comment by user Rub21.

Sign up to request clarification or add additional context in comments.

9 Comments

docker rm -fv $(docker ps -aq) this line was all I needed. Thanks
lsof worked a charm, killed the process and back in action....
Interestingly, each time I kill, it assigned to another port that I find very wired.
sudo lsof -i -P -n | grep <port number> -> this one was good enough to debug on OSX ty :)
For macOS the last step should be google that process first =) This is my case developer.apple.com/forums/thread/682332
|
212

In your case it was some other process that was using the port and as indicated in the comments, sudo netstat -pna | grep 3000 helped you in solving the problem.

While in other cases (I myself encountered it many times) it mostly is the same container running at some other instance. In that case docker ps was very helpful as often I left the same containers running in other directories and then tried running again at other places, where same container names were used.

How docker ps helped me:

docker rm -f $(docker ps -aq) is a short command which I use to remove all containers.

Edit: Added how docker ps helped me.

6 Comments

Actually, I have this problem often. And nothing, but docker-compose down helps
That is sure to help, on the condition that you are running it in the same directory where you ran docker-compose up. While I recommend in my answer to find the container which is already running and take desired action. I felt appropriate to remove them, if someone does not want to remove, then there's instead using rm use stop to stop them.
I have another server running on the same port that tensorflow/tensorflow image are will run. How can I setup my image to run in another port. I've tried this: docker run -it -d -p 8888:8000 tensorflow/tensorflow I binded port 8888 from my image to 8000 on client, but don't work.
@EmanuelFontelles When trying to debug, do not use -d option. Now, ports are exposed as HOST:CONTAINER. Thus you should run docker run -it -p 8000:8888
those who runs on ubuntu willl want to add sudo between each call to docker: sudo docker rm -f $(sudo docker ps -aq)
|
89

I had the same problem. I fixed this by stopping the Apache2 service on my host.

5 Comments

this was my problem too, I forgot I installed Apache
FR: To stop Apache 2 web server, enter: # /etc/init.d/apache2 stop
sudo service apache2 stop && sudo service nginx stop worked for me.
somehow apache was enabled after an update/restart. it was listening on port 80 and impeding an important container from running.
Apache2 came on my machine with installation of PHP8. The problem occured after reboot, when apache2 was auto started on system start. As I don't need it locally on my computer I just removed it via sudo apt remove apache2.
81

You can kill the process listening on that port easily with one command below :

kill -9 $(lsof -t -i tcp:<port#>)

ex :

kill -9 $(lsof -t -i tcp:<port#>)

or for ubuntu:

sudo kill -9 `sudo lsof -t -i:8000`

Man page for lsof : https://man7.org/linux/man-pages/man8/lsof.8.html

-9 is for hard kill without checking any deps.


(Not related, but might be useful if its PORT 5000 mystery) - the culprit process is due to Mac OS monterery.

The port 5000 is commonly used to serve local development servers. When updating to the latest macOS operating system, I was unable the docker to bind to port 5000, because it was already in use. (You may find a message along the lines of Port 5000 already in use.)

By running lsof -i :5000, I found out the process using the port was named ControlCenter, which is a native macOS application. If this is happening to you, even if you use brute force (and kill) the application, it will restart itself. In my laptop, lsof -i :5000 returns that Control Center is being used by process id 433. I could do killall -p 433, but macOS keeps restarting the process.

The process running on this port turns out to be an AirPlay server. You can deactivate it in

System Preferences › Sharing, and unchecking AirPlay Receiver to release port 5000.

5 Comments

the best answer for Mac users including M1 chips like my case.
Wow, great catch on the 5000!
Thanks it works! - sudo kill -9 sudo lsof -t -i:8080
nice catch with AirPlay Receiver
Turning off AirPlay receiver was instant fix for me
24

For Linux/Unix:

Simple search for linux utility using following command

netstat -nlp | grep 8888

It'll show processing running at this port, then kill that process using PID (look for a PID in row) of that process.

kill PID

1 Comment

netstat shows the PID/program(e.g. 2714/splunkd).sudo kill 2714 works. Thanks.
24

I had same problem, docker-compose down --rmi all (in the same directory where you run docker-compose up) helps

UPD: CAUTION - this will also delete the local docker images you've pulled (from comment)

3 Comments

Yes, it always helps, but down is the last thing you usually want to do. Losing the current state is not a piece of sugar.
This will also delete the local docker images you've pulled so use it with caution
You should have mentioned it will delete the local docker images in the answer.
16

In some cases it is critical to perform a more in-depth debugging to the problem before stopping a container or killing a process.

Consider following the checklist below:

1) Check you current docker compose environment
Run docker-compose ps.
If port is in use by another container, stop it with docker-compose stop <service-name-in-compose-file> or remove it by replacing stop with rm.

2) Check the containers running outside your current workspace
Run docker ps to see list of all containers running under your host.
If you find the port is in use by another container, you can stop it with docker stop <container-id>.
(*) Because you're not under the scope of the origin compose environment - it is a good practice first to use docker inspect to gather more information about the container that you're about to stop.

3) Check if port is used by other processes running on the host
For example if the port is 6379 run:

$ sudo netstat -ltnp | grep ':6379'
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      915/redis-server 12 
tcp6       0      0 ::1:6379                :::*                    LISTEN      915/redis-server 12

(*) You can also use the lsof command which is mainly used to retrieve information about files that are opened by various processes (I suggest running netstat before that).

So, In case of the output above the PID is 915. Now you can run:

$ ps j 915
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1   915   915   915 ?           -1 Ssl    123   0:11 /usr/bin/redis-server 127.0.0.1:6379

And see the ID of the parent process (PPID) and the execution command.
You can also run: $ pstree -s <PID> to a visual display of the process and its related processes.

In our case we can see that the process probably is a daemon (PPID is 1) - In that case consider running:
A) $ cat /proc/<PID>/status in order to get a more in-depth information about the process like the number of threads spawned by the process, its capabilities, etc'.
B) $ systemctl status <PID> in order to see the unit that caused the creation of a specific process. If the service is not critical - you can stop and disable the service.

4) Restart Docker service
Run: sudo service docker restart.

5) You reached this point and..
Only if its not placing your system at risk - consider restarting the server.

Comments

14

I had apache running on my ubuntu machine. I used this command to kill it!

sudo /etc/init.d/apache2 stop

1 Comment

I had the same issue, but I used "sudo service apache2 stop" to solve the problem.
12

Most probably this is because you are already running a web server on your host OS, so it conflicts with the web server that Docker is attempting to start.

So try this one-liner before trying anything else:

sudo service apache2 stop; sudo service nginx stop; sudo nginx -s stop;

4 Comments

This works for me, but then I can't restart apache2 correctly, when the docker container is running
@r34 This is expected behavior. You can run apache2 either on host OS or via Docker, not both of them simultaneously.
another one to try sudo httpd -k stop as my php switching script re-started apache for me...
Thanks, in my case it was sudo service redis stop
12

If redis server is started as a service, it will restart itself when you using kill -9 <process_id> or sudo kill -9 `sudo lsof -t -i:<port_number>` . In that case you will need to stop the redis service using following command.

sudo service redis-server stop

1 Comment

While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value.
11

In my case it was

Error starting userland proxy: listen tcp 0.0.0.0:9000: bind: address already in use

And all that I need is turn off debug listening in php storm icon

1 Comment

PhpStorm was the culprit
7

I was getting the below error when i was trying to launch a new container -

listen tcp 0.0.0.0:8080: bind: address already in use.

To check which process is running on port 8080, run below command:

netstat -tulnp | grep 8080

i got the output below

[[email protected] (aws_main) ~]# netstat -tulnp | grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN **12749**/java [[email protected] (aws_main) ~]#

run

kill -9 12749

Then try to relaunch the container it should work

1 Comment

Spot on ! your solution helped .
6

Here's yet another answer because it's the only thing that worked for me.

REFERNENCE: https://stackoverflow.com/a/61888620/2027793

I ran this and kept seeing 3 php-fpm services running and listening on port 9000

sudo lsof -i -P -n | grep 9000

If then tried killing all the services, which kept restarting themselves automatically...

sudo kill -9 <process_id>
sudo pkill <process_name>

I decided that since I couldn't kill the beast, I might as well play along with it and figure out how to change the port it was using, which is where I stumbled on the answer referenced above. You find the directory where your php is running.

cd /usr/local/etc/php/<php_version#>/php-fpm.d/

Edit the config file

vi www.conf

Find the line with this and change the port number

listen = 127.0.0.1:9000

Now repeat the find and kill actions above and then proceed to get your docker containers starting up again like they should.

Comments

5

Check docker-compose.yml, it might be the case that the port is specified twice.

version: '3'
services:
  registry:
    image: mysql:5.7
        ports:
      - "3306:3306"             <--- remove either this line or next
      - "127.0.0.1:3306:3306"

1 Comment

This one worked for me, I happened to be repeating the ports in my docker-compose.yml
3

I upgraded my docker this afternoon and ran into the same problem. I tried restarting docker but no luck.

Finally, I had to restart my computer and it worked. Definitely a bug.

Comments

2

I ran into the same issue several times. Restarting docker seems to do the trick

2 Comments

i see how to restart a container. How to restart docker?
sudo systemctl restart docker , had the same problem after installing firewalld
2

A variation of @DmitrySandalov's answer: I had tomcat/java running on 8080, which needed to keep going. Looked at the docker-compose.yml file and altered the entry for 8080 to another of my choosing.

nginx:
  build: nginx
  ports:
    #- '8080:80' <-- original entry
    - '8880:80'
    - '8443:443'

Worked perfectly. (The only wrinkle is the change will be wiped if I ever update the project, since it's coming from an external repo.)

1 Comment

make sure comment or remove that line of code that used port, if not it will keep trying use that port.
2

Changing network_mode: "bridge" to "host" did it for me.

This with

version: '2.2'
services:
  bind:
    image: sameersbn/bind:latest
    dns: 127.0.0.1
    ports:
      - 172.17.42.1:53:53/udp
      - 172.17.42.1:10000:10000
    volumes:
        - "/srv/docker/bind:/data"
    environment:
      - 'ROOT_PASSWORD=secret'
    network_mode: "host"

Comments

2

Let me add one more case, because I had the same error and none of the solutions listed so far works:

serv1:
  ...
  networks:
  privnet:
    ipv4_address: 10.10.100.2
  ...

serv2:
  ...
  # no IP assignment, no dependencies
  
networks:
  privnet:
    ipam:
      driver: default
      config:
        - subnet: 10.10.100.0/24

depending on the init order, serv2 may get assigned the IP 10.10.100.2 before serv1 is started, so I just assign IPs manually for all containers to avoid the error. Maybe there are other more elegant ways.

Comments

2

At first, make sure which service you are running in your specific port. In your case, you are already using port number 3000.

netstat -aof | findstr :3000

now stop that process which is running on specific port

lsof -i tcp:3000

Comments

2

For Windows users. This advice from official docker GitHub helped me.

net stop winnat
docker-compose up ...
net start winnat

Comments

2

A very likely reason that you can get that error despite the port not being used if you accidentally try to bind to the same port twice in the same docker run command. For example:

docker run -d -p 80:80 -p 127.0.0.1:80:80 kennethreitz/httpbin

So, -p 80:80 and -p 127.0.0.1:80:80 are both binding to port 80 making it fail.

Comments

1

I resolve the issue by restarting Docker.

Comments

1

Just a side note if you have the same issue and is with Windows:

In my case the process in my way is just grafana-server.exe. Because I first downloaded the binary version and double click the executable, and it now starts as a service by user SYSTEM which I cannot taskkill (no permission)

I have to go to "Service manager" of Windows and search for service "Grafana", and stop it. After that port 3000 is no longer occupied.

Hope that helps.

1 Comment

This helps me, even in my system Grafana was running so I had to uninstall it. Then docker-compose up works perfectly. Thanks @WesternGun. I almost searched 2 days for this issue.
1

It makes more sense to change the port of the docker update instead of shutting down other services that use port 80.

change to port in docker browser

Comments

1

In my case, the issue was that I was running the MongoDB as a root user, and stopping that did the trick.

sudo brew services stop mongodb-community

Comments

1

Stop the apache and it will work like a champ!!

sudo service apache2 stop

Comments

0

The one that was using the port 8888 was Jupiter and I had to change the configuration file of Jupiter notebook to run on another port.

to list who is using that specific port. sudo lsof -i -P -n | grep 9

You can specify the port you want Jupyter to run uncommenting/editing the following line in ~/.jupyter/jupyter_notebook_config.py:

c.NotebookApp.port = 9999

In case you don't have a jupyter_notebook_config.py try running jupyter notebook --generate-config. See this for further details on Jupyter configuration.

1 Comment

Yes I found 8888 was used by Jupyter.
0

Before it was running on :docker run -d --name oracle -p 1521:1521 -p 5500:5500 qa/oracle I just changed the port to docker run -d --name oracle -p 1522:1522 -p 5500:5500 qa/oracle

it worked fine for me !

Comments

0

On my machine a PID was not being shown from this command netstat -tulpn for the in-use port (8080), so i could not kill it, killing the containers and restarting the computer did not work. So service docker restart command restarted docker for me (ubuntu) and the port was no longer in use and i am a happy chap and off to lunch.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.