Lý thuyết
45 phút
Bài 2/15

Docker Basics cho n8n

Hiểu Docker concepts - images, containers, volumes, networks - để deploy n8n hiệu quả

🐳 Docker Basics cho n8n

Docker Containers

Docker là nền tảng để self-host n8n. Bài này covers core concepts bạn cần biết trước khi deploy.

Docker Concepts

What is Docker?

Text
1TRADITIONAL SERVER DOCKER
2───────────────── ──────
3┌─────────────────┐ ┌─────────────────┐
4│ App 1 │ App 2 │ │ Container 1 │
5├─────────────────┤ │ ┌───────────┐ │
6│ Dependencies │ │ │App+Deps │ │
7│ (shared!) │ │ └───────────┘ │
8├─────────────────┤ │ Container 2 │
9│ Host OS │ │ ┌───────────┐ │
10├─────────────────┤ │ │App+Deps │ │
11│ Hardware │ │ └───────────┘ │
12└─────────────────┘ ├─────────────────┤
13 │ Docker Engine │
14❌ Dependency conflicts ├─────────────────┤
15❌ Hard to replicate │ Host OS │
16 ├─────────────────┤
17 │ Hardware │
18 └─────────────────┘
19
20 ✅ Isolated
21 ✅ Reproducible

Core Concepts:

Text
1IMAGE: Blueprint (read-only)
2├── Dockerfile defines it
3├── Downloaded from registry
4└── Versioned with tags
5
6CONTAINER: Running instance
7├── Created from image
8├── Has its own filesystem
9└── Can be started/stopped
10
11VOLUME: Persistent storage
12├── Data survives restarts
13├── Shared between containers
14└── Lives on host filesystem
15
16NETWORK: Communication
17├── Containers can talk
18├── Isolated by default
19└── Custom networks possible

Installing Docker

Ubuntu/Debian:

Bash
1# Update packages
2sudo apt update
3
4# Install prerequisites
5sudo apt install -y \
6 ca-certificates \
7 curl \
8 gnupg \
9 lsb-release
10
11# Add Docker GPG key
12curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
13 sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
14
15# Add repository
16echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
17 https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
18 sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
19
20# Install Docker
21sudo apt update
22sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
23
24# Add user to docker group (no sudo needed)
25sudo usermod -aG docker $USER
26
27# Log out and back in, then verify
28docker --version
29docker compose version

macOS/Windows:

Text
1Download Docker Desktop:
2https://www.docker.com/products/docker-desktop/
3
4Install and run.
5Docker Desktop includes:
6• Docker Engine
7• Docker Compose
8• Docker CLI

Verify Installation:

Bash
1# Test Docker
2docker run hello-world
3
4# Expected output:
5# Hello from Docker!
6# This message shows that your installation...

Docker Commands

Essential Commands:

Bash
1# IMAGES
2docker pull n8nio/n8n # Download image
3docker images # List images
4docker rmi n8nio/n8n # Remove image
5
6# CONTAINERS
7docker run n8nio/n8n # Create & start
8docker ps # List running
9docker ps -a # List all
10docker stop <container> # Stop
11docker start <container> # Start again
12docker rm <container> # Remove
13
14# LOGS & DEBUG
15docker logs <container> # View logs
16docker logs -f <container> # Follow logs
17docker exec -it <container> sh # Shell into container
18
19# CLEANUP
20docker system prune # Remove unused
21docker volume prune # Remove unused volumes

Running n8n with Docker

Simple Run (Testing):

Bash
1docker run -it --rm \
2 --name n8n \
3 -p 5678:5678 \
4 n8nio/n8n
5
6# Options explained:
7# -it : Interactive mode
8# --rm : Remove when stopped
9# --name : Container name
10# -p : Port mapping (host:container)

With Persistent Data:

Bash
1# Create volume
2docker volume create n8n_data
3
4# Run with volume
5docker run -d \
6 --name n8n \
7 -p 5678:5678 \
8 -v n8n_data:/home/node/.n8n \
9 n8nio/n8n
10
11# -d : Detached (background)
12# -v : Mount volume

With Environment Variables:

Bash
1docker run -d \
2 --name n8n \
3 -p 5678:5678 \
4 -e N8N_BASIC_AUTH_ACTIVE=true \
5 -e N8N_BASIC_AUTH_USER=admin \
6 -e N8N_BASIC_AUTH_PASSWORD=secret \
7 -e GENERIC_TIMEZONE=Asia/Ho_Chi_Minh \
8 -v n8n_data:/home/node/.n8n \
9 n8nio/n8n

Docker Volumes Deep Dive

Types of Storage:

Text
1VOLUME TYPES
2────────────
3
41. NAMED VOLUME (Recommended)
5 docker volume create mydata
6 -v mydata:/path/in/container
7
8 ✅ Docker manages location
9 ✅ Easy backup/restore
10 ✅ Works on all platforms
11
122. BIND MOUNT
13 -v /host/path:/container/path
14
15 ✅ Direct file access
16 ⚠️ Platform-specific
17 ⚠️ Permission issues
18
193. TMPFS (Memory)
20 --tmpfs /path
21
22 ✅ Fast, ephemeral
23 ❌ Lost on restart

n8n Data Structure:

Text
1/home/node/.n8n/
2├── config # Settings
3├── database.sqlite # Workflows, creds (SQLite mode)
4├── .n8n/
5│ ├── crash.journal
6│ └── ssh/ # SSH keys
7└── custom/ # Custom nodes

Volume Commands:

Bash
1# Create
2docker volume create n8n_data
3
4# List
5docker volume ls
6
7# Inspect
8docker volume inspect n8n_data
9
10# Backup (copy to host)
11docker run --rm \
12 -v n8n_data:/source \
13 -v $(pwd):/backup \
14 alpine tar cvf /backup/n8n_backup.tar /source
15
16# Restore
17docker run --rm \
18 -v n8n_data:/target \
19 -v $(pwd):/backup \
20 alpine sh -c "cd /target && tar xvf /backup/n8n_backup.tar --strip 1"

Docker Networks

Network Types:

Text
1BRIDGE (default)
2└── Containers can reach each other by IP
3└── Need port mapping to reach from host
4
5HOST
6└── No isolation from host
7└── Container uses host's network
8└── No port mapping needed
9
10CUSTOM BRIDGE (Recommended)
11└── Containers reach by name
12└── Isolated from other networks

Create Custom Network:

Bash
1# Create network
2docker network create n8n-network
3
4# Run containers on same network
5docker run -d \
6 --name postgres \
7 --network n8n-network \
8 -e POSTGRES_PASSWORD=secret \
9 postgres:15
10
11docker run -d \
12 --name n8n \
13 --network n8n-network \
14 -p 5678:5678 \
15 -e DB_TYPE=postgresdb \
16 -e DB_POSTGRESDB_HOST=postgres \
17 n8nio/n8n
18
19# n8n can reach postgres by hostname "postgres"

Dockerfile (Reference)

n8n's Dockerfile (simplified):

dockerfile
1FROM node:18-alpine
2
3# Install dependencies
4RUN apk add --update graphicsmagick tzdata git
5
6# Set user (not root)
7USER node
8
9# Set working directory
10WORKDIR /home/node
11
12# Install n8n
13RUN npm install n8n
14
15# Expose port
16EXPOSE 5678
17
18# Start command
19CMD ["n8n", "start"]

Building Custom Image:

dockerfile
1# Dockerfile.custom
2FROM n8nio/n8n
3
4# Install custom node
5RUN npm install n8n-nodes-custom
6
7# Or add files
8COPY ./custom-nodes /home/node/.n8n/custom
Bash
1# Build
2docker build -t my-n8n -f Dockerfile.custom .
3
4# Run
5docker run -d --name n8n -p 5678:5678 my-n8n

Common Issues

Port Already in Use:

Bash
1# Error: port 5678 already in use
2
3# Find what's using it
4sudo lsof -i :5678
5# or
6sudo netstat -tulpn | grep 5678
7
8# Kill or change port
9docker run -p 5679:5678 n8nio/n8n

Permission Issues:

Bash
1# Error: permission denied
2
3# Check volume permissions
4docker exec n8n ls -la /home/node/.n8n
5
6# Fix ownership
7docker exec -u root n8n chown -R node:node /home/node/.n8n

Container Won't Start:

Bash
1# Check logs
2docker logs n8n
3
4# Common issues:
5# - Port conflict
6# - Volume mount error
7# - Environment variable typo
8# - Missing dependencies

Practice Exercise

Hands-On Practice

Complete these steps:

  1. Install Docker on your machine
  2. Pull n8n image:
    Bash
    1docker pull n8nio/n8n
  3. Run n8n locally:
    Bash
    1docker run -p 5678:5678 n8nio/n8n
  4. Access http://localhost:5678
  5. Create a simple workflow
  6. Stop and restart container
  7. Notice workflow is gone (no volume!)
  8. Run with volume:
    Bash
    1docker volume create n8n_data
    2docker run -p 5678:5678 -v n8n_data:/home/node/.n8n n8nio/n8n
  9. Verify workflow persists after restart

You now understand Docker basics! 🐳

Key Takeaways

Remember
  • 🐳 Images are blueprints, containers are running instances
  • 💾 Volumes persist data across restarts (essential!)
  • 🔗 Networks let containers communicate
  • 🔒 Don't run as root in production
  • 📝 Always check logs when debugging

Tiếp Theo

Bài tiếp theo: Docker Compose - Orchestrate n8n với database và reverse proxy trong một file config.