Skip to content
beginner Phase 1 · Docker Fundamentals

Docker Installation

Install Docker on Windows, macOS, and Linux with proper configuration.

30m
0 problems
Topic Progress 0%

Installing Docker on Linux

Installing Docker on Linux

Linux is the native platform for Docker containers. Docker Engine runs directly on the Linux kernel without a VM layer.

Ubuntu/Debian

# Remove old versions
sudo apt-get remove docker docker-engine docker.io containerd runc

# Install prerequisites
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg

# Add Docker GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add Docker repository
echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

RHEL/CentOS/Fedora

# Remove old versions
sudo yum remove docker docker-client docker-client-latest \
  docker-common docker-latest docker-latest-logrotate \
  docker-logrotate docker-engine

# Install dnf-plugins-core (Fedora)
sudo dnf install -y dnf-plugins-core

# Add repository
sudo dnf config-manager --add-repo \
  https://download.docker.com/linux/fedora/docker-ce.repo

# Install Docker Engine
sudo dnf install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

# Start and enable Docker
sudo systemctl start docker
sudo systemctl enable docker

Post-Installation (All Linux)

# Verify installation
docker --version
Docker version 24.0.7, build afdd53b

# Run without sudo (add your user to docker group)
sudo usermod -aG docker $USER
# Log out and log back in for group changes to take effect

# Test
docker run hello-world

Verify Docker Daemon

$ docker info
Client: Docker Engine - Community
 Version:    24.0.7
 Context:    default
 Server Version: 24.0.7
 Storage Driver: overlay2
 Logging Driver: json-file
 Cgroup Driver: systemd

If the daemon fails to start, check: sudo journalctl -xeu docker.service

Installing Docker Desktop (macOS & Windows)

Installing Docker Desktop

macOS

Docker Desktop for Mac runs Docker in a Linux VM using Apple's Virtualization Framework (Apple Silicon) or HyperKit (Intel).

  1. Download Docker Desktop from https://docker.com/products/docker-desktop
  2. Open the .dmg file and drag Docker.app to Applications
  3. Launch Docker Desktop from Applications
  4. Accept the service agreement

System Requirements (Apple Silicon):

  • macOS 12.0 or later
  • 4 GB RAM minimum, 8 GB recommended
  • Apple Silicon (M1/M2/M3) processor

Verify:

$ docker --version
Docker version 24.0.7, build afdd53b

$ docker run --rm alpine cat /etc/os-release
NAME="Alpine Linux"
ID=alpine

Windows

Docker Desktop for Windows uses WSL 2 (Windows Subsystem for Linux 2) as its backend.

Prerequisites:

  • Windows 10/11 Pro, Enterprise, or Education (build 19044+)
  • WSL 2 enabled
  • Hyper-V enabled (Windows Pro/Enterprise)
# Enable WSL 2
wsl --install

# Enable Hyper-V
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

# Install Docker Desktop
# Download from https://docker.com/products/docker-desktop
# Run the installer with WSL 2 backend selected

Verify in PowerShell:

PS> docker --version
Docker version 24.0.7, build afdd53b

PS> docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

Docker Desktop Settings

Key settings to configure:

  • Resources > Advanced: Allocate CPU cores and memory (4 GB+ for most workloads)
  • Resources > Disk image size: Increase if building large images
  • Docker Engine: Edit daemon.json for custom configuration
  • Features in Development: Enable Docker Scout, BuildKit

Licensing

Docker Desktop is free for personal use, education, and small businesses (fewer than 250 employees and less than $10M annual revenue). Larger organizations need a paid subscription. For servers, Docker Engine is fully open-source under the Apache 2.0 license.

Configuring the Docker Daemon

Configuring the Docker Daemon

The Docker daemon is configured through /etc/docker/daemon.json on Linux, or through Docker Desktop settings on macOS/Windows.

Basic daemon.json

{
  "data-root": "/mnt/docker",
  "storage-driver": "overlay2",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "dns": ["8.8.8.8", "8.8.4.4"],
  "bip": "172.17.0.1/16",
  "max-concurrent-downloads": 10,
  "max-concurrent-uploads": 5,
  "default-shm-size": "128M"
}

Key Configuration Options

Option Description Default
data-root Root directory for images/containers /var/lib/docker
storage-driver Storage driver to use overlay2
log-driver Default logging driver json-file
log-opts Options for the log driver {}
dns DNS servers for containers host DNS
bip Bridge IP for default network 172.17.0.1/16
insecure-registries Registries allowing HTTP []
registry-mirrors Registry mirrors for pulls []

Apply Changes

# Edit configuration
sudo nano /etc/docker/daemon.json

# Restart Docker daemon
sudo systemctl restart docker

# Verify changes
docker info | grep -A 5 "Storage Driver"
docker info | grep -A 5 "Logging Driver"

Useful Configurations

Use a registry mirror (faster pulls in certain regions):

{
  "registry-mirrors": ["https://mirror.gcr.io"]
}

Enable experimental features:

{
  "experimental": true
}

Configure live restore (containers survive daemon restarts):

{
  "live-restore": true
}

Set default log rotation to prevent disk exhaustion:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "5"
  }
}

Without log rotation, container logs grow unbounded and can fill the disk. Always configure max-size and max-file in production.

Post-Installation Steps

Post-Installation Steps

Enable Non-Root Docker Access

By default, Docker requires root privileges. To run Docker commands as your regular user:

# Create docker group (if it doesn't exist)
sudo groupadd docker

# Add your user to the docker group
sudo usermod -aG docker $USER

# Activate the group changes (or log out and back in)
newgrp docker

# Verify
docker run hello-world
# Should work without sudo

Security Note: The docker group grants root-equivalent access. Any user in this group can run docker run -v /:/host -it alpine chroot /host to get full host root access. Only add trusted users.

Configure Docker to Start on Boot

# Systemd (Ubuntu, Fedora, RHEL)
sudo systemctl enable docker.service
sudo systemctl enable containerd.service

# Verify
systemctl is-enabled docker.service

Verify Installation

# Check Docker version
docker --version

# Check daemon information
docker info

# Run diagnostic test
docker run --rm hello-world

# Check Docker Compose
docker compose version

# List images (should be empty or show hello-world)
docker images

Troubleshooting Common Issues

Permission denied:

# Error: Got permission denied while trying to connect to the Docker daemon socket
# Fix: Ensure your user is in the docker group
sudo usermod -aG docker $USER
newgrp docker

Daemon not starting:

# Check daemon logs
sudo journalctl -xeu docker.service

# Common issue: conflicting daemon.json
sudo cat /etc/docker/daemon.json | python3 -m json.tool

Port 53 already in use:

# Error: listen tcp 0.0.0.0:53: bind: address already in use
# Fix: Disable systemd-resolved DNS stub
sudo mkdir -p /etc/systemd/system/docker.service.d
echo '[Service]
ExecStart=
ExecStart=/usr/bin/dockerd' | \
  sudo tee /etc/systemd/system/docker.service.d/docker-overlay.conf
sudo systemctl daemon-reload
sudo systemctl restart docker

Slow image pulls:

# Add a registry mirror in /etc/docker/daemon.json
{
  "registry-mirrors": ["https://mirror.gcr.io"]
}
sudo systemctl restart docker