Skip to main content

Install Docker & Docker Compose

This guide explains how to install Docker and Docker Compose on your Linux VPS.

What is Docker?

Docker allows you to create isolated containers for your applications. Each container includes everything the application needs to run.

Installing Docker

On Ubuntu/Debian

# Update packages
sudo apt update

# Install dependencies
sudo apt install -y ca-certificates curl gnupg lsb-release

# Add Docker's official 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 \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

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

Verify Installation

sudo docker --version
sudo docker compose version

Run Docker Without sudo (optional)

sudo usermod -aG docker $USER
# Log out and log back in to apply

Essential Docker Commands

Container Management

# List active containers
docker ps

# List all containers
docker ps -a

# Start a container
docker start container_name

# Stop a container
docker stop container_name

# Remove a container
docker rm container_name

# View logs
docker logs container_name
docker logs -f container_name # Real-time

Image Management

# List images
docker images

# Download an image
docker pull nginx

# Remove an image
docker rmi nginx

Docker Compose

Docker Compose allows you to manage multiple containers with a YAML file.

Example: Web Server with Database

Create a docker-compose.yml file:

version: '3.8'

services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
restart: unless-stopped

db:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: your_password
MYSQL_DATABASE: my_database
volumes:
- db_data:/var/lib/mysql
restart: unless-stopped

volumes:
db_data:

Docker Compose Commands

# Start services (in background)
docker compose up -d

# Stop services
docker compose down

# View logs
docker compose logs -f

# Rebuild images
docker compose build

# Restart a service
docker compose restart web

Practical Examples

Deploy Portainer (Docker Web Interface)

docker volume create portainer_data

docker run -d \
-p 9000:9000 \
--name portainer \
--restart=unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce

Then access http://YOUR_IP:9000

Deploy a Minecraft Server

version: '3.8'

services:
minecraft:
image: itzg/minecraft-server
ports:
- "25565:25565"
environment:
EULA: "TRUE"
TYPE: "PAPER"
MEMORY: "2G"
volumes:
- ./minecraft-data:/data
restart: unless-stopped

Cleanup

# Remove stopped containers
docker container prune

# Remove unused images
docker image prune

# Remove unused volumes
docker volume prune

# Clean everything (be careful!)
docker system prune -a
Tip

Use docker compose down -v to also remove volumes when stopping, useful for starting fresh.