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
| Platform | Installation |
|---|---|
| Windows | Docker Desktop from docker.com |
| Mac | Docker Desktop for Mac |
| Linux | apt 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
| Image | Command | Port |
|---|---|---|
| Nginx | docker run -p 80:80 nginx | 80 |
| Apache + PHP | docker run -p 8080:80 php:apache | 8080 |
| MySQL | docker run -p 3306:3306 mysql | 3306 |
| PostgreSQL | docker run -p 5432:5432 postgres | 5432 |
| Redis | docker run -p 6379:6379 redis | 6379 |
| MongoDB | docker run -p 27017:27017 mongo | 27017 |
| Node.js | docker run -p 3000:3000 node | 3000 |
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
| Problem | Solution |
|---|---|
| Port already in use | Use different port: -p 8081:80 |
| Container exits immediately | Check logs: docker logs container_id |
| Can't connect to database | Wait for DB to initialize, check network |
| Permission denied | Run Docker Desktop as admin (Windows) |