Docker for Local Development

Docker lets you run applications in isolated containers on localhost. Each container has its own environment with specific versions of PHP, Node.js, databases, etc. — no more "works on my machine" problems.

Container on localhost: http://localhost:8080

Why Docker for Development?

  • Consistent environments — Same setup for all team members
  • Isolated projects — Different PHP/Node versions per project
  • Easy cleanup — Delete container, start fresh
  • Production parity — Match production environment locally
  • Quick setup — One command to start entire stack

Install Docker

PlatformInstallation
WindowsDocker Desktop from docker.com
MacDocker Desktop for Mac
Linuxapt install docker.io

Basic Docker Commands

# Run nginx on localhost:8080
docker run -d -p 8080:80 nginx

# Run MySQL on localhost:3306
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql

# Run Node.js app
docker run -d -p 3000:3000 node:18

# List running containers
docker ps

# Stop container
docker stop container_id

# Remove container
docker rm container_id

Docker Compose for Full Stack

Define multi-container apps with docker-compose.yml:

# docker-compose.yml
version: '3.8'
services:
  web:
    image: php:8.2-apache
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
  
  db:
    image: mysql:8
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: myapp
    ports:
      - "3306:3306"
  
  phpmyadmin:
    image: phpmyadmin
    ports:
      - "8081:80"
    environment:
      PMA_HOST: db
# Start all services
docker-compose up -d

# Stop all services
docker-compose down

# View logs
docker-compose logs -f

Popular Docker Images

ImageCommandPort
Nginxdocker run -p 80:80 nginx80
Apache + PHPdocker run -p 8080:80 php:apache8080
MySQLdocker run -p 3306:3306 mysql3306
PostgreSQLdocker run -p 5432:5432 postgres5432
Redisdocker run -p 6379:6379 redis6379
MongoDBdocker run -p 27017:27017 mongo27017
Node.jsdocker run -p 3000:3000 node3000

WordPress with Docker

# docker-compose.yml for WordPress
version: '3.8'
services:
  wordpress:
    image: wordpress
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_PASSWORD: root
    volumes:
      - ./wp-content:/var/www/html/wp-content
  
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress

# Access at http://localhost:8080

Mount Local Files

# Mount current directory to container
docker run -v $(pwd):/app -p 3000:3000 node:18

# Windows (PowerShell)
docker run -v ${PWD}:/app -p 3000:3000 node:18

Troubleshooting

ProblemSolution
Port already in useUse different port: -p 8081:80
Container exits immediatelyCheck logs: docker logs container_id
Can't connect to databaseWait for DB to initialize, check network
Permission deniedRun Docker Desktop as admin (Windows)