Docker 容器化部署完整指南

前言

Docker 已经成为现代应用部署的标准。本文从零开始,介绍如何使用 Docker 容器化部署应用,包含实战案例和最佳实践。

一、Docker 基础概念

1. 什么是容器?

容器是一种轻量级的虚拟化技术,它将应用及其依赖打包在一起,确保在任何环境中都能一致运行。

2. Docker vs 虚拟机

• 容器共享宿主机内核,启动速度快(秒级)

• 虚拟机需要完整操作系统,资源占用大

• 容器更轻量,同样配置可以运行更多实例

二、安装 Docker

Ubuntu/Debian 系统

# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

# 添加官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 添加 Docker 仓库
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

# 安装 Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 验证安装
docker --version
sudo docker run hello-world

配置非 root 用户

sudo usermod -aG docker $USER
newgrp docker

三、创建第一个 Dockerfile

以 Node.js 应用为例:

FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

EXPOSE 3000

USER node

CMD ["node", "server.js"]

构建镜像

docker build -t myapp:1.0 .
docker images

四、运行容器

# 基础运行
docker run -d -p 3000:3000 --name myapp myapp:1.0

# 带环境变量
docker run -d -p 3000:3000   -e NODE_ENV=production   -e DB_HOST=localhost   --name myapp myapp:1.0

# 挂载卷
docker run -d -p 3000:3000   -v /data:/app/data   --name myapp myapp:1.0

五、Docker Compose 多容器编排

创建 docker-compose.yml:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
    depends_on:
      - db
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=myapp
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    restart: unless-stopped

volumes:
  pgdata:

启动服务

docker compose up -d
docker compose ps
docker compose logs -f web

六、最佳实践

1. 使用 .dockerignore

node_modules
npm-debug.log
.git
.env
*.md

2. 多阶段构建

FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm ci --only=production
CMD ["node", "dist/server.js"]

3. 健康检查

HEALTHCHECK --interval=30s --timeout=3s   CMD curl -f http://localhost:3000/health || exit 1

七、常用命令速查

# 查看容器
docker ps
docker ps -a

# 查看日志
docker logs myapp
docker logs -f myapp --tail 100

# 进入容器
docker exec -it myapp sh

# 停止/删除
docker stop myapp
docker rm myapp

# 清理资源
docker system prune -a

八、生产环境注意事项

• 使用具体版本标签,避免使用 latest

• 限制容器资源(CPU、内存)

• 配置日志驱动和日志轮转

• 使用 secrets 管理敏感信息

• 实施容器安全扫描

总结

Docker 极大简化了应用部署流程。掌握 Dockerfile 编写、镜像构建和容器管理是现代开发者的必备技能。建议从简单应用开始实践,逐步深入学习编排和生产部署。

← 返回首页

💬 评论 (8)

T
Thomas Anderson
2026-02-26
Excellent guide! The multi-stage build example is particularly useful. We reduced our image size from 1.2GB to 180MB.
王建国
2026-02-26
写得非常详细!docker compose 那部分特别实用,正好公司项目要用。
S
Sofia Rodriguez
2026-02-26
Quick question: what's the best way to handle secrets in Docker? Environment variables or Docker secrets?
张伟(博主)
2026-02-26
@Sofia For production, use Docker Swarm secrets or Kubernetes secrets. For development, env files are fine but never commit them to git!
李雷
2026-02-26
健康检查那部分学到了!之前容器挂了都不知道。
K
Kumar Patel
2026-02-26
Very helpful! Can you write a follow-up on Docker networking and service discovery?
陈明
2026-02-26
收藏了!正在学 Docker,这篇文章来得太及时了 👍
张伟(博主)
2026-02-26
@Kumar Good idea! Docker 网络确实值得单独写一篇,已加入计划。

发表评论