Docker 容器化技术详解:从入门到实战
Docker 是一个开源的容器化平台,它使用容器来打包、分发和运行应用程序。本文将深入介绍 Docker 的核心概念、常用命令和实际应用场景。
2025年9月18日
DocsLib Team
Docker容器化DevOps微服务
Docker 容器化技术详解:从入门到实战
什么是 Docker?
Docker 是一个开源的容器化平台,它使用容器来打包、分发和运行应用程序。容器是一种轻量级、可移植的封装技术,能够将应用程序及其依赖项打包在一起,确保在任何环境中都能一致地运行。
Docker 的核心概念
- 镜像(Image):只读的模板,用于创建容器
- 容器(Container):镜像的运行实例
- Dockerfile:用于构建镜像的文本文件
- 仓库(Repository):存储镜像的地方
- 注册表(Registry):管理仓库的服务
Docker 的优势
- 一致性:确保应用在不同环境中的一致性
- 可移植性:容器可以在任何支持 Docker 的平台上运行
- 资源效率:比虚拟机更轻量,启动更快
- 可扩展性:易于水平扩展和负载均衡
- 版本控制:镜像支持版本管理
- 隔离性:容器之间相互隔离,提高安全性
安装 Docker
Windows 安装
- 下载 Docker Desktop for Windows
- 运行安装程序
- 启用 WSL 2(推荐)
- 重启计算机
macOS 安装
- 下载 Docker Desktop for Mac
- 拖拽到 Applications 文件夹
- 启动 Docker Desktop
Linux 安装(Ubuntu 示例)
# 更新包索引
sudo apt update
# 安装必要的包
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
# 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker
# 将用户添加到 docker 组
sudo usermod -aG docker $USER
验证安装
# 查看 Docker 版本
docker --version
# 运行测试容器
docker run hello-world
基础命令
镜像管理
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 列出本地镜像
docker images
# 删除镜像
docker rmi nginx:latest
# 构建镜像
docker build -t myapp:1.0 .
# 给镜像打标签
docker tag myapp:1.0 myapp:latest
容器管理
# 运行容器
docker run -d --name mynginx -p 8080:80 nginx
# 列出运行中的容器
docker ps
# 列出所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop mynginx
# 启动容器
docker start mynginx
# 重启容器
docker restart mynginx
# 删除容器
docker rm mynginx
# 进入容器
docker exec -it mynginx /bin/bash
# 查看容器日志
docker logs mynginx
# 查看容器详细信息
docker inspect mynginx
数据管理
# 创建数据卷
docker volume create myvolume
# 列出数据卷
docker volume ls
# 使用数据卷运行容器
docker run -d -v myvolume:/data nginx
# 绑定挂载
docker run -d -v /host/path:/container/path nginx
# 删除数据卷
docker volume rm myvolume
Dockerfile 详解
Dockerfile 是用于构建 Docker 镜像的文本文件,包含了一系列指令。
基本指令
# 基础镜像
FROM node:16-alpine
# 设置工作目录
WORKDIR /app
# 复制文件
COPY package*.json ./
# 运行命令
RUN npm install
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 设置环境变量
ENV NODE_ENV=production
# 设置用户
USER node
# 启动命令
CMD ["npm", "start"]
多阶段构建
# 构建阶段
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 生产阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
最佳实践
- 使用官方基础镜像
- 最小化层数:合并 RUN 指令
- 利用缓存:将变化频率低的指令放在前面
- 使用 .dockerignore:排除不必要的文件
- 不要在容器中存储数据:使用数据卷
- 使用非 root 用户:提高安全性
Docker Compose
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。
安装 Docker Compose
# Linux
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
docker-compose.yml 示例
version: '3.8'
services:
# Web 应用
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
- redis
volumes:
- ./logs:/app/logs
networks:
- app-network
# 数据库
db:
image: postgres:13
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app-network
# 缓存
redis:
image: redis:alpine
networks:
- app-network
# 反向代理
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- web
networks:
- app-network
volumes:
postgres_data:
networks:
app-network:
driver: bridge
Compose 命令
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs web
# 扩展服务
docker-compose up -d --scale web=3
# 重新构建服务
docker-compose build web
# 执行命令
docker-compose exec web bash
网络管理
网络类型
- bridge:默认网络驱动
- host:使用主机网络
- none:禁用网络
- overlay:用于 Swarm 模式
网络命令
# 创建网络
docker network create mynetwork
# 列出网络
docker network ls
# 查看网络详情
docker network inspect mynetwork
# 连接容器到网络
docker network connect mynetwork mycontainer
# 断开容器网络连接
docker network disconnect mynetwork mycontainer
# 删除网络
docker network rm mynetwork
实际应用场景
1. Web 应用部署
# Node.js 应用 Dockerfile
FROM node:16-alpine
WORKDIR /app
# 安装依赖
COPY package*.json ./
RUN npm ci --only=production
# 复制应用代码
COPY . .
# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]
2. 微服务架构
# 微服务 docker-compose.yml
version: '3.8'
services:
api-gateway:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
user-service:
build: ./user-service
environment:
- DB_HOST=user-db
depends_on:
- user-db
order-service:
build: ./order-service
environment:
- DB_HOST=order-db
depends_on:
- order-db
user-db:
image: postgres:13
environment:
- POSTGRES_DB=users
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
order-db:
image: postgres:13
environment:
- POSTGRES_DB=orders
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
3. 开发环境搭建
# 开发环境 docker-compose.dev.yml
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
volumes:
- .:/app
- /app/node_modules
ports:
- "3000:3000"
environment:
- NODE_ENV=development
command: npm run dev
db:
image: postgres:13
environment:
- POSTGRES_DB=devdb
- POSTGRES_USER=dev
- POSTGRES_PASSWORD=dev
ports:
- "5432:5432"
volumes:
- postgres_dev_data:/var/lib/postgresql/data
volumes:
postgres_dev_data:
性能优化
1. 镜像优化
# 优化前
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y python3
RUN apt-get install -y python3-pip
COPY . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
# 优化后
FROM python:3.9-alpine
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
2. 构建缓存优化
# 利用构建缓存
FROM node:16-alpine
WORKDIR /app
# 先复制依赖文件
COPY package*.json ./
RUN npm ci --only=production
# 再复制源代码
COPY . .
CMD ["npm", "start"]
3. 多阶段构建减小镜像大小
# 构建阶段
FROM golang:1.19-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .
# 运行阶段
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]
安全最佳实践
1. 使用非 root 用户
FROM node:16-alpine
# 创建应用用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN chown -R nextjs:nodejs /app
USER nextjs
CMD ["npm", "start"]
2. 扫描镜像漏洞
# 使用 Docker Scout
docker scout cves myapp:latest
# 使用 Trivy
trivy image myapp:latest
3. 使用 secrets 管理敏感信息
# docker-compose.yml
version: '3.8'
services:
app:
image: myapp
secrets:
- db_password
environment:
- DB_PASSWORD_FILE=/run/secrets/db_password
secrets:
db_password:
file: ./secrets/db_password.txt
监控和日志
1. 容器监控
# 查看容器资源使用情况
docker stats
# 查看容器进程
docker top mycontainer
# 查看容器文件系统变化
docker diff mycontainer
2. 日志管理
# 配置日志驱动
version: '3.8'
services:
app:
image: myapp
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
3. 健康检查
# Dockerfile 中添加健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
# docker-compose.yml 中配置健康检查
services:
web:
image: myapp
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
故障排除
常见问题
容器无法启动
# 查看容器日志 docker logs mycontainer # 以交互模式运行 docker run -it myimage /bin/bash
网络连接问题
# 检查网络配置 docker network inspect bridge # 测试容器间连接 docker exec -it container1 ping container2
存储空间不足
# 清理未使用的资源 docker system prune -a # 查看磁盘使用情况 docker system df
总结
Docker 作为容器化技术的领导者,已经成为现代软件开发和部署的重要工具。通过本文的学习,你应该已经掌握了:
- Docker 的核心概念和基本命令
- Dockerfile 的编写和最佳实践
- Docker Compose 的使用
- 网络和存储管理
- 性能优化和安全实践
- 监控和故障排除
Docker 不仅简化了应用的部署和管理,还为微服务架构、CI/CD 流水线和云原生应用提供了强大的支持。继续实践和探索,你将能够更好地利用 Docker 来构建和部署现代化的应用程序。
要了解更多信息,请访问 Docker 官方文档。