Back to blog

Docker Cơ Bản: Hướng Dẫn Toàn Diện

dockercontainersdevopsbackendtutorial
Docker Cơ Bản: Hướng Dẫn Toàn Diện

Chào mừng đến Giai đoạn 1 của Lộ Trình Học Docker & Kubernetes! Trong hướng dẫn này, bạn sẽ làm chủ các kiến thức cơ bản về Docker—nền tảng cho mọi phát triển và triển khai dựa trên container.

Bạn Sẽ Học Được

✅ Hiểu containers vs virtual machines
✅ Cài đặt Docker trên mọi nền tảng
✅ Làm việc với Docker images và layers
✅ Chạy, dừng và quản lý containers
✅ Map ports và expose services
✅ Lưu trữ dữ liệu với volumes
✅ Thành thạo các lệnh Docker thiết yếu


Docker Là Gì?

Docker là nền tảng đóng gói ứng dụng và dependencies vào containers—môi trường nhẹ, portable và isolated chạy nhất quán trên mọi hệ thống.

Vấn Đề Docker Giải Quyết

Trước containers:

Developer: "Nó chạy trên máy tôi!"
Ops: "Nhưng nó không chạy trên server."

Docker giải quyết bằng cách đóng gói mọi thứ ứng dụng cần vào container.


Containers vs Virtual Machines

Đặc ĐiểmVirtual MachineContainer
Kích thướcGBs (full OS)MBs (app + deps)
Khởi độngPhútGiây
IsolationHoàn toàn (hardware)Process-level
Hiệu suất~5-10% overheadGần native
Mật độ~10s/host~100s/host

Kiến Trúc Docker

Các Thành Phần Chính

1. Docker Client (docker) - Giao diện command-line

2. Docker Daemon (dockerd) - Service quản lý containers, images

3. Docker Registry (Docker Hub) - Lưu trữ Docker images


Cài Đặt Docker

macOS và Windows: Docker Desktop

# Tải từ docker.com/products/docker-desktop
# Cài đặt và khởi động
 
# Kiểm tra
docker --version
docker run hello-world

Linux: Docker Engine

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
 
# Thêm user vào docker group
sudo usermod -aG docker $USER

Docker Images

Image là template read-only chứa code, runtime, libraries và config.

Các Lệnh Image

# Pull image
docker pull nginx:1.25
 
# Liệt kê images
docker images
 
# Xóa image
docker rmi nginx:1.25
 
# Xóa images không dùng
docker image prune

Image Naming

registry/repository:tag
 
Ví dụ:
nginx:1.25                        # Official image
myregistry.com/team/app:v1.0      # Private registry

Docker Containers

Container là instance đang chạy của image.

Chạy Container

# Chạy container
docker run nginx
 
# Chạy ở background
docker run -d nginx
 
# Chạy với tên
docker run -d --name my-nginx nginx
 
# Interactive mode
docker run -it ubuntu bash

Quản Lý Container

# Liệt kê containers đang chạy
docker ps
 
# Liệt kê tất cả containers
docker ps -a
 
# Dừng container
docker stop my-nginx
 
# Khởi động lại
docker start my-nginx
 
# Xóa container
docker rm my-nginx
 
# Xóa container đang chạy
docker rm -f my-nginx

Logs và Exec

# Xem logs
docker logs my-nginx
docker logs -f my-nginx  # Follow
 
# Chạy lệnh trong container
docker exec -it my-nginx bash

Port Mapping

# Map port 8080 host → 80 container
docker run -p 8080:80 nginx
 
# Nhiều ports
docker run -p 80:80 -p 443:443 nginx
 
# Xem ports
docker port container_name

Data Persistence với Volumes

1. Named Volumes (Khuyến nghị)

# Tạo volume
docker volume create my-data
 
# Sử dụng volume
docker run -v my-data:/var/lib/postgresql/data postgres:15
 
# Liệt kê volumes
docker volume ls
 
# Xóa volume
docker volume rm my-data

2. Bind Mounts

# Mount thư mục hiện tại
docker run -v $(pwd):/app node:20
 
# Read-only
docker run -v $(pwd)/config:/etc/app:ro my-app

Environment Variables

# Đơn lẻ
docker run -e DATABASE_URL=postgres://localhost/db my-app
 
# Nhiều biến
docker run \
    -e DATABASE_URL=postgres://localhost/db \
    -e NODE_ENV=production \
    my-app
 
# Từ file
docker run --env-file .env my-app

Các Lệnh Thiết Yếu

Images

docker pull nginx:1.25       # Pull image
docker images                # Liệt kê
docker rmi nginx:1.25        # Xóa
docker image prune           # Dọn dẹp

Containers

docker run -d --name app nginx    # Chạy
docker ps                          # Liệt kê
docker stop app                    # Dừng
docker start app                   # Khởi động
docker rm app                      # Xóa
docker logs app                    # Logs
docker exec -it app bash           # Exec

System

docker system df             # Disk usage
docker system prune          # Dọn dẹp
docker version               # Version

Ví Dụ Thực Hành

Nginx Web Server

docker run -d --name web -p 8080:80 nginx:1.25
curl http://localhost:8080
docker logs web
docker stop web && docker rm web

PostgreSQL Database

# Với persistent storage
docker volume create pgdata
docker run -d \
    --name postgres \
    -e POSTGRES_USER=admin \
    -e POSTGRES_PASSWORD=secret \
    -e POSTGRES_DB=myapp \
    -v pgdata:/var/lib/postgresql/data \
    -p 5432:5432 \
    postgres:15
 
# Kết nối
docker exec -it postgres psql -U admin -d myapp

Redis Cache

docker run -d \
    --name redis \
    -v redis-data:/data \
    -p 6379:6379 \
    redis:7 \
    redis-server --appendonly yes

Lỗi Thường Gặp

❌ Sử dụng :latest tag

# Tránh
docker run nginx:latest
 
# Nên dùng
docker run nginx:1.25.3

❌ Không dùng volumes

# Dữ liệu mất khi xóa container
docker run postgres:15
 
# Nên dùng volumes
docker run -v pgdata:/var/lib/postgresql/data postgres:15

❌ Không dọn dẹp

# Chạy định kỳ
docker system prune --volumes

Best Practices

Images

✅ Dùng tag version cụ thể
✅ Ưu tiên official images
✅ Dùng base images nhỏ (alpine, slim)

Containers

✅ Chạy detached mode (-d) cho services
✅ Luôn đặt tên containers (--name)
✅ Dùng --rm cho lệnh một lần

Data

✅ Dùng named volumes cho data persistent
✅ Bind mounts chỉ cho development
✅ Backup volumes định kỳ


Tóm Tắt

✅ Docker đóng gói ứng dụng vào containers portable
✅ Containers nhẹ hơn VMs (MB vs GB)
✅ Docker dùng kiến trúc client-server
✅ Images là templates; containers là instances đang chạy
✅ Port mapping expose containers ra host network
✅ Volumes lưu trữ dữ liệu persistent
✅ Environment variables cấu hình containers


Series: Lộ Trình Docker & Kubernetes
Tiếp theo: Giai đoạn 2: Docker Compose & Multi-Container Apps


Đọc bản đầy đủ bằng tiếng Anh: Docker Fundamentals

📬 Đăng ký nhận bản tin

Nhận những bài viết mới nhất qua email mỗi tuần. Không spam, hủy đăng ký bất cứ lúc nào.

Chúng tôi tôn trọng quyền riêng tư của bạn. Hủy đăng ký bất cứ lúc nào.

💬 Comments

Đăng nhập để bình luận

Chúng tôi sẽ không đăng bất cứ điều gì mà không có sự cho phép của bạn.