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).
- Download Docker Desktop from https://docker.com/products/docker-desktop
- Open the
.dmgfile and drag Docker.app to Applications - Launch Docker Desktop from Applications
- 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