Docker for Developers: Complete Setup, Dockerfile & Docker Compose Guide

Learn Docker from installation to running real applications with Dockerfiles, images, containers, environment variables, volumes, networking, Docker Compose, logs, debugging, and production basics.

Docker for Developers: Complete Setup, Dockerfile & Docker Compose Guide

Docker for Developers

Docker allows developers to package applications and their dependencies into containers so they can run consistently across different environments.

Docker Compose extends this workflow by allowing multiple services to be defined and managed together.


1. Install Docker

Docker Desktop is the easiest way to get Docker on Windows and macOS and includes Docker Engine, Docker CLI and Docker Compose.

After installation:

docker --version

Check Compose:

docker compose version

2. Run Your First Container

docker run hello-world

Run Nginx:

docker run -d -p 8080:80 nginx

Open:

http://localhost:8080

3. Important Docker Concepts

Image

A read-only template used to create containers.

Container

A running instance of an image.

Dockerfile

Instructions used to build an image.

Volume

Persistent storage outside the container lifecycle.

Network

Allows containers to communicate.

Registry

A location for storing and distributing images.


4. Common Docker Commands

List running containers:

docker ps

List all containers:

docker ps -a

List images:

docker images

Stop a container:

docker stop <container>

Start:

docker start <container>

Remove:

docker rm <container>

Remove image:

docker rmi <image>

View logs:

docker logs <container>

Follow logs:

docker logs -f <container>

Open a shell:

docker exec -it <container> sh

5. Create a Dockerfile

Example Python application:

code
FROM python:3.12-alpine

WORKDIR /app

COPY requirements.txt .

RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]

Build:

docker build -t my-app .

Run:

docker run -p 5000:5000 my-app

6. Environment Variables

Create:

.env

Example:

code
DATABASE_URL=postgresql://localhost/mydb
API_KEY=your-key

Do not commit secrets.

Add .env to .gitignore.


7. Docker Compose

Create:

compose.yaml

Example:

code
services:
  web:
    build: .
    ports:
      - "8000:5000"
    environment:
      REDIS_HOST: redis
      REDIS_PORT: 6379
    depends_on:
      redis:
        condition: service_healthy

  redis:
    image: redis:alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5

Start:

docker compose up

Background mode:

docker compose up -d

Stop:

docker compose down

Docker's current Compose documentation covers services, networks, volumes, health checks, logs, exec, configuration and Compose Watch.


8. Docker Compose Commands

code
docker compose up
docker compose up -d
docker compose down
docker compose ps
docker compose logs
docker compose logs -f
docker compose restart
docker compose build
docker compose pull
docker compose config
docker compose exec

Example:

docker compose exec web sh

9. Persistent Volumes

Without a volume, container data can disappear when containers are removed.

Example:

code
services:
  redis:
    image: redis:alpine
    volumes:
      - redis-data:/data

volumes:
  redis-data:

Start:

docker compose up

Remove containers and volumes:

docker compose down -v

Be careful: -v removes named volumes and their stored data.


10. Docker Debugging

Check containers:

docker ps

View logs:

docker logs <container>

Enter container:

docker exec -it <container> sh

For Compose:

docker compose logs -f

Enter service:

docker compose exec web sh

Check resolved Compose configuration:

docker compose config

11. Docker Development Workflow

code
1. Create Dockerfile
2. Build image
3. Run container
4. Inspect logs
5. Add environment variables
6. Add volumes
7. Add Docker Compose
8. Add health checks
9. Test locally
10. Build production image

Docker Cheat Sheet

code
docker build -t app .
docker run app
docker ps
docker ps -a
docker images
docker logs <container>
docker exec -it <container> sh
docker stop <container>
docker rm <container>
docker rmi <image>

docker compose up
docker compose up -d
docker compose down
docker compose ps
docker compose logs -f
docker compose exec <service> sh
docker compose build
docker compose config