DEV Community

Savas Vedova
Savas Vedova

Posted on

Docker Port Publishing: A Security Wake-Up Call ๐Ÿšจ

Did you know that ports: "5432:5432" in your docker-compose.yml is exposing your database to the entire internet?

I see this mistake constantly in production environments. Here's what's actually happening:

โŒ What you think you're doing:

services:
  postgres:
    image: postgres:15
    ports:
      - "5432:5432"  # "Just making it accessible to my app"
Enter fullscreen mode Exit fullscreen mode

๐ŸŒ What you're actually doing:

Binding port 5432 to 0.0.0.0:5432 - making your database accessible from ANY IP address that can reach your server.

โœ… Here's how to fix it:

Option 1: Bind to localhost only

ports:
  - "127.0.0.1:5432:5432"  # Only accessible from the host machine
Enter fullscreen mode Exit fullscreen mode

Option 2: Use Docker networks (recommended)

# No ports section needed!
services:
  postgres:
    image: postgres:15
    networks:
      - app-network

  web:
    image: my-app
    networks:
      - app-network
    ports:
      - "80:3000"  # Only expose what users need

networks:
  app-network:
Enter fullscreen mode Exit fullscreen mode

๐Ÿ” Pro tip: Your application containers can communicate with each other using service names as hostnames within the same network. No port publishing required!

The golden rule: Only publish ports that external clients need to access directly.

Have you caught this security issue in your own Docker setups? Share your Docker security tips in the comments! ๐Ÿ‘‡

Top comments (0)