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 流水线。