Post

Navigating Network Bindings: Understanding `localhost`, `127.0.0.1`, `0.0.0.0`, and `*`

Navigating Network Bindings: Understanding localhost, 127.0.0.1, 0.0.0.0, and *

When you run multiple services on your local machine that need to listen on network ports, understanding network binding addresses is crucial for avoiding conflicts and ensuring your applications connect to the correct service.

Step 1: Demystifying Localhost vs. 127.0.0.1

TermTypeIP AddressMySQL Client Behavior
localhostHostnameUsually 127.0.0.1Often tries a Unix socket connection (not TCP/IP), which can fail for Docker or SSH tunnels.
127.0.0.1IPv4 Loopback127.0.0.1Always forces a TCP/IP connection (recommended for local testing).

Step 2: Understanding 0.0.0.0 and * Bindings

These addresses specify which network interfaces a service should listen on.

TermMeaningInterfaces Covered
0.0.0.0IPv4 WildcardListens on all available IPv4 interfaces, including 127.0.0.1 and your external network IP.
*Shorthand WildcardActs the same as 0.0.0.0 or :: (IPv6 wildcard) in most contexts—listens on all interfaces.

Step 3: The Port Conflict Scenario & Identifying the Full Command

A port conflict is often avoided because two services listen on different interfaces, such as one on the universal 0.0.0.0:3306 and one on the specific 127.0.0.1:3306.

To confirm exactly which process is which, you must inspect the full command.

Identifying the Full Process Command

The lsof tool shows the PID, but the ps tool shows the full command associated with that PID.

  1. Run lsof to find the PIDs listening on the port (e.g., 3306):

    1
    
    sudo lsof -i :3306 -t
    
  2. Run ps to see the full command for those PIDs:

    1
    
    ps -fp $(sudo lsof -i :3306 -t)
    
Command Snippet in ps OutputService Confirmed
docker-proxy -host-ip 0.0.0.0 -container-port 3306 ...Docker Container
ssh -L 3307:localhost:3306 user@...SSH Tunnel
/usr/sbin/mysqld --daemonize --pid-file=...Local/Host MySQL Server

Step 4: Connecting to the Correct MySQL Instance

Use the -h (host) and -P (port) flags on the mysql client to connect explicitly to the correct service.

  • To Docker (using the global binding): Connect using your machine’s actual network IP address (e.g., 192.168.1.10) to ensure you hit the Docker proxy.

    1
    
    mysql -h 192.168.1.10 -P 3306 -u docker_user -p
    
  • To SSH Tunnel (using the loopback binding): Connect using the loopback IP address.

    1
    
    mysql -h 127.0.0.1 -P 3306 -u remote_user -p
    

Step 5: The Golden Rule - Avoid Port Conflicts Entirely 🛡️

To maintain a stable development environment, always configure a unique host port for each service.

ServiceHost PortSSH Command / Docker ConfigMySQL Connection Command
Docker DB3306-p 3306:3306mysql -h 127.0.0.1 -P 3306 -u user -p
SSH Tunnel3307ssh -L 3307:remote_db:3306 user@hostmysql -h 127.0.0.1 -P 3307 -u user -p
This post is licensed under CC BY 4.0 by the author.