---
title: "What’s using port 3000 on your Mac. — iSurge"
description: "Find what holds port 3000 on a Mac with one Terminal command, stop it safely, and see which Docker, Podman or Apple containers run and what they cost."
url: https://isurgemac.com/blog/containers-and-ports-mac/
---

[BLOG](https://isurgemac.com/blog/)

# What’s using port 3000 on your Mac. And which containers are running, and what they cost.

Find what holds port 3000 on a Mac with one Terminal command, stop it safely, and see which Docker, Podman or Apple containers run and what they cost.

By Ruthran Baskar · 27 October 2026 · 7 min read

IN SHORT

- To see what is using port 3000, run `lsof -nP -iTCP:3000 -sTCP:LISTEN` in Terminal.

- To stop it, `kill` the number in the PID column. Keep `kill -9` for a program that won’t stop.

- `docker stats --no-stream`, `podman stats --no-stream` and `container stats --no-stream` show what each container uses.

- On a Mac, containers run inside a virtual machine, and that machine can hold more memory than its containers use.

You start a dev server and it says port 3000 is already in use. Something is on it, and the error doesn’t say what. Here’s how to find out in Terminal, how to stop it, and how to see which containers are running and what they take from your Mac. Then, how iSurge shows all of it in one place.

DEV

## What is using port 3000 on my Mac?

Open Terminal and ask `lsof`, the tool that lists open files and network connections:

`lsof -i:3000`

Each line shows a COMMAND (the program’s name), a PID (its number) and the user it runs as. You’ll often see more than one line: the server that listens on the port, and anything connected to it, such as a browser tab that has the page open. To see only the program that holds the port, ask for the one that’s listening:

`lsof -nP -iTCP:3000 -sTCP:LISTEN`

`-n` and `-P` keep addresses and port numbers as numbers, which makes it faster and easier to read. If the line ends in `*:3000`, the server listens on every address, so other devices on your network can reach it. `127.0.0.1:3000` or `localhost:3000` means this Mac only.

If nothing shows but the port is still taken, the program may run as another user, or as part of macOS. `sudo lsof -nP -iTCP:3000 -sTCP:LISTEN` shows those too.

DEV

## How do I stop what’s on the port?

Take the number from the PID column and ask the program to stop:

`kill 12345`

That asks it to quit, and most servers tidy up and go. If it’s still there a few seconds later, `kill -9 12345` stops it at once, without a chance to save anything. If you know which terminal window it runs in, Ctrl-C there does the same as a plain `kill`.

Be careful with the shortcut `kill $(lsof -t -i:3000)`. Without `-sTCP:LISTEN` it also picks up whatever is connected to the port, and that can be your browser.

Two ports are often taken by macOS itself: 5000 and 7000 belong to AirPlay Receiver. To free them, turn off AirPlay Receiver in System Settings › General › AirDrop & Handoff.

DEV

## Which containers are running, and what do they cost?

If the port belongs to a container, `lsof` shows the engine’s own program rather than the container. Ask the engine instead. Each one has a command to list its containers and one to show what they use:

- Docker (and engines that speak Docker’s commands): `docker ps`, then `docker stats --no-stream`

- Podman: `podman ps`, then `podman stats --no-stream`

- Apple’s own `container` tool (macOS 26 and later, Apple silicon): `container list`, then `container stats --no-stream`

`docker ps` also shows each container’s published ports, such as `0.0.0.0:5432->5432/tcp`, so you can match a port to a container. To stop one, use its name: `docker stop storefront-db`, `podman stop` or `container stop`. Stopping doesn’t remove it; `start` brings it back.

The stats show each container’s memory against its limit. What they don’t show is the virtual machine. Containers run Linux, so on a Mac they run inside a small Linux machine, and that machine takes memory from your Mac whatever runs in it. With Docker-style engines, one machine holds all the containers, and it can keep memory after the containers that needed it have stopped. Apple’s tool gives each container its own small machine instead.

Disk is the other cost. `docker system df` shows what images, volumes and the build cache keep, and how much of it nothing uses.

DEV

## Every port, and who holds it, in iSurge

iSurge 0.4 adds Dev to the iSurge window, with side tabs for Running, Containers, Ports and Homebrew. It shows up by itself once you use dev servers, containers or Homebrew.

Ports starts with four cards: how many ports are in use, how many your projects hold, how many others on your network can reach, and how many are left behind by a terminal, agent or editor that has closed. Under them is one wide search: “Who’s on a port? Type its number or a name”. Type 3000 and you get its tile, or “Nothing is on port 3000”, which means a server can start on it.

Every port, grouped by who holds it. Sample data.

Each port is a tile, grouped by who holds it: your projects, left behind, containers, Homebrew services, and apps, programs and macOS. A tile names the project and the program (“storefront-web · next dev”), says who started it and when, and says “This Mac only” or “Others can reach it”. macOS’s own ports are explained, and the AirPlay Receiver tile has a Settings button that opens the right page.

Free is on the tiles of your servers, containers and Homebrew services, and it always asks first. For a server, it asks the program to stop as Ctrl-C would in its terminal. For a container, the engine stops it, as `docker stop` would, and Start brings it back. For a Homebrew service, Homebrew stops it with `brew services stop`.

DEV

## Containers, their memory and their limits

Dev › Containers reads every engine that speaks Docker’s API (Docker Desktop, OrbStack, Colima, Rancher Desktop and Podman) and Apple’s own `container`. You don’t press anything to refresh it: it listens to the engine for containers starting and stopping, and reads memory and CPU every 2 seconds while the page is open.

The top cards show what’s running, the memory the engines hold and how much of it their containers use, the disk taken by images, volumes and build cache, and how much of that could be cleared. Under Machines, each engine says whether it’s “one machine for all” or “a small machine each”, with a bar split by container and the machine’s own share. A shared machine with nothing running in it says so, with a Quit button, and a Restart button gives back memory it holds and doesn’t use.

Containers are grouped by the project they belong to: its Compose folder, or a project folder it mounts. Each has a ring for its memory against its limit. The ring turns orange at 85% and red at 95%, because at its limit the engine stops it. A container can also say:

- “Held back by its CPU limit” for part of the last minute, so it runs slower than it could.

- “Stopped 12 min ago: it ran out of memory”, with Start Again.

- Where its limit is set, such as a line in docker-compose.yml, with Open.

- “Nothing has used it” in days, while it still holds memory.

A project’s containers count towards its memory on Running. Sample data.

Stop and Start use the engine’s own commands, and nothing is removed. Clean Up, for images, volumes and build cache nothing uses, shows what goes and then runs the engine’s own command, such as `docker image prune -a`.

You don’t need the window open to keep an eye on them. In Settings › Dev, under Notify me when, iSurge can tell you when a container is close to its memory limit or runs out of memory, and, if you turn it on, when one is slowed by its CPU limit. iSurge only tells you. It never stops anything by itself. The notch has a Dev tab too, with how many containers run, the memory they hold and how many are near a limit.

Dev in the notch. Sample data.

## Terminal or iSurge?

For one port, once, `lsof` and `kill` are all you need, and they’re already on your Mac. iSurge is for when you run several projects and containers at once and want to see who holds what, which containers are near their limits, and what was left running, without asking each tool in turn. It reads all of this on your Mac and sends none of it anywhere.

If you’ve wondered how iSurge turns hundreds of processes into a few apps, [A thousand processes](https://isurgemac.com/blog/a-thousand-processes/) explains it. Dev is in iSurge 0.4; [see the prices](https://isurgemac.com/pricing/) or [what else is new](https://isurgemac.com/changelog/).

## Get iSurge

Pay once, yours for good.

[Buy iSurge](https://isurgemac.com/pricing/)

Already have it? [Download](https://isurgemac.com/download)

Requires a Mac with Apple silicon (M1 or later) and macOS 15 Sequoia or later. Notch features need a MacBook with a notch; everything else works on any supported Mac.
