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.