Docker 入门教程:从安装到容器化部署 Web 应用

Docker 已经成为了现代软件部署的标配技术。它将应用及其依赖打包成一个标准化的容器,确保应用在任何环境中都能一致地运行。

一、Docker 核心概念

1.1 什么是容器

传统部署:
应用 → 依赖库 → 操作系统 → 服务器
(环境差异导致"在我机器上能跑"的问题)

容器部署:
Docker 容器(应用 + 依赖包)→ Docker 引擎 → 操作系统
(标准化,环境一致)

1.2 核心术语

术语 说明 类比
镜像(Image) 应用及其依赖的只读模板 安装光盘
容器(Container) 镜像的运行实例 运行中的程序
Dockerfile 构建镜像的指令文件 食谱
Docker Hub 镜像仓库 应用商店
Docker Compose 多容器管理工具 一键启动

二、安装 Docker

# macOS
brew install docker --cask
# 或访问 https://www.docker.com/products/docker-desktop

# Ubuntu
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER  # 免 sudo 运行 docker

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

三、第一个 Docker 应用

3.1 创建一个简单的 Web 应用

# Dockerfile
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]
// server.js
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello Docker!');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

3.2 构建和运行

# 构建镜像
docker build -t my-web-app .

# 运行容器
docker run -d -p 3000:3000 --name my-app my-web-app

# 查看运行中的容器
docker ps

# 查看日志
docker logs my-app

# 停止容器
docker stop my-app

# 删除容器
docker rm my-app

四、Docker Compose:多服务管理

4.1 什么是 Docker Compose

Docker Compose 用一个 YAML 文件定义和运行多个容器,适用于 Web 应用 + 数据库 + 缓存等多服务场景。

4.2 docker-compose.yml 示例

version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DB_HOST=db
      - DB_USER=app
      - DB_PASSWORD=secret
    depends_on:
      - db
    volumes:
      - .:/app
      - /app/node_modules

  db:
    image: mysql:8.0
    environment:
      - MYSQL_DATABASE=app
      - MYSQL_USER=app
      - MYSQL_PASSWORD=secret
      - MYSQL_ROOT_PASSWORD=rootsecret
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "3306:3306"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  db_data:

4.3 启动多服务

# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f web

# 停止所有服务
docker-compose down

五、部署到服务器

5.1 使用 Docker 部署到 VPS

# 1. 服务器上安装 Docker

# 2. 传输项目文件
scp -r ./my-app user@server:/var/www/

# 3. 服务器上运行
ssh user@server
cd /var/www/my-app
docker-compose up -d --build

5.2 使用 Docker 优化部署

# 多阶段构建(减小镜像体积)
# 第一阶段:构建
FROM node:18-alpine 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 --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./

EXPOSE 3000
CMD ["node", "dist/server.js"]

六、常用 Docker 命令

# 镜像管理
docker images                    # 列出本地镜像
docker pull nginx                # 拉取镜像
docker rmi <image_id>            # 删除镜像

# 容器管理
docker run -d nginx              # 后台运行
docker exec -it <id> /bin/bash   # 进入容器
docker logs -f <id>              # 查看日志
docker cp <id>:/path /local      # 复制文件

# 清理
docker system prune              # 清理未使用的容器和镜像
docker volume prune              # 清理未使用的卷

七、最佳实践

1. 镜像瘦身:
   - 使用 Alpine 基础镜像
   - 多阶段构建
   - 合并 RUN 命令减少层数

2. 安全:
   - 不使用 root 用户运行容器
   - 定期更新基础镜像
   - 使用 .dockerignore 排除敏感文件

3. 数据持久化:
   - 数据库等有状态服务使用卷(volumes)
   - 配置文件使用挂载(bind mounts)

4. 日志:
   - 容器内日志输出到 stdout/stderr
   - 使用 Docker 的日志驱动收集

八、总结

Docker 是现代化应用部署不可或缺的工具。掌握 Docker 的基本概念和使用方法,可以让你轻松实现"构建一次,到处运行"。从简单的单容器 Web 应用开始,逐步学习 Docker Compose 多服务编排,最终实现完整的 CI/CD 流水线。