安全最佳实践
1. 镜像安全扫描
# 使用 Trivy 扫描镜像
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image nginx:latest
# 扫描并显示漏洞详情
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image --severity HIGH,CRITICAL nginx:latest
# 生成 HTML 报告
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image --format template --template "@contrib/html.tpl" \
-o report.html nginx:latest
2. 安全运行配置
# ============ 用户权限 ============
# 使用非 root 用户运行
docker run --user 1000:1000 nginx
# 使用用户命名空间(需要配置)
docker run --userns myuserns nginx
# ============ 只读文件系统 ============
docker run --read-only --tmpfs /tmp nginx
# ============ 资源限制 ============
# 限制内存使用
docker run -m 512m nginx
# 限制 CPU 使用
docker run --cpus="1.5" nginx
# 限制 CPU 核心使用
docker run --cpuset-cpus="0,1" nginx
# ============ 安全选项 ============
# 禁用特权模式
docker run --security-opt=no-new-privileges nginx
# 使用 AppArmor 配置文件
docker run --security-opt apparmor=docker-default nginx
# 使用 SELinux 标签
docker run --security-opt label=level:s0:c100,c200 nginx
# ============ 能力(Capabilities)管理 ============
# 删除所有能力
docker run --cap-drop=all nginx
# 添加特定能力
docker run --cap-drop=all --cap-add=NET_BIND_SERVICE nginx
# ============ 禁用特权容器 ============
# ❌ 危险:不要使用特权模式
docker run --privileged nginx# 不要这样做!
# ✅ 仅在必要时添加特定能力
docker run --cap-add=SYS_TIME nginx
3. 安全 Dockerfile 实践
# 使用特定版本标签,不用 latest
FROM python:3.11.2-slim
# 使用非 root 用户
RUN groupadd -r appuser && useradd -r -g appuser appuser
# 设置工作目录
WORKDIR /app
# 只复制必要的文件
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY --chown=appuser:appuser . .
# 切换到非 root 用户
USER appuser
# 只读根文件系统
# 运行时使用:docker run --read-only --tmpfs /tmp --tmpfs /var/run app
# 健康检查
HEALTHCHECK CMD curl -f http://localhost/health || exit 1
# 限制信号
STOPSIGNAL SIGTERM
EXPOSE 8000
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
______________________________
6.2 性能优化
1. 镜像优化
# ✅ 使用 alpine 基础镜像
FROM node:18-alpine# 120MB
# FROM node:18 # 900MB
# ✅ 多阶段构建
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o app
FROM alpine:3.18
COPY --from=builder /app/app /usr/local/bin/app
CMD ["app"]
# ✅ 合并 RUN 指令
RUN apt-get update && \
apt-get install -y curl vim && \
rm -rf /var/lib/apt/lists/*
# ✅ 利用构建缓存
COPY package*.json ./
RUN npm ci
COPY . .
# ✅ 清理不必要的文件
RUN apt-get update && \
apt-get install -y package && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
2. 运行时优化
# ============ 内存优化 ============
# 限制容器内存
docker run -m 512m --memory-swap 1g nginx
# 禁用内存 swap
docker run -m 512m --memory-swap 512m nginx
# ============ CPU 优化 ============
# 限制 CPU 使用
docker run --cpus=2 nginx
# 设置 CPU 权重(1024 默认)
docker run --cpu-shares=512 nginx
# 绑定到特定 CPU 核心
docker run --cpuset-cpus="0-2" nginx
# ============ IO 优化 ============
# 限制磁盘 IO
docker run --device-read-bps /dev/sda:1mb nginx
docker run --device-write-bps /dev/sda:1mb nginx
# ============ 网络优化 ============
# 使用 host 网络模式(性能最好)
docker run --network=host nginx
# 禁用容器网络(安全场景)
docker run --network=none app
# ============ 存储优化 ============
# 使用 tmpfs 挂载临时文件
docker run --tmpfs /tmp:rw,size=100m nginx
# 使用 volume 而不是 bind mount(性能更好)
docker run -v myvolume:/data nginx
3. Docker Daemon 优化
// /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn"
],
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2",
"live-restore": true,
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 64000,
"Soft": 64000
}
},
"metrics-addr": "127.0.0.1:9323",
"experimental": true
}
______________________________
6.3 故障排查
1. 常见问题诊断
# ============ 查看容器日志 ============
# 查看容器日志
docker logs container_name
# 实时查看日志
docker logs -f container_name
# 查看最后 100 行
docker logs --tail 100 container_name
# 查看带时间戳的日志
docker logs -t container_name
# ============ 检查容器状态 ============
# 查看容器详细信息
docker inspect container_name
# 查看容器进程
docker top container_name
# 查看容器端口映射
docker port container_name
# 查看容器资源使用
docker stats container_name
# ============ 进入容器调试 ============
# 进入容器
docker exec -it container_name bash
# 查看容器环境变量
docker exec container_name env
# 查看容器内文件
docker exec container_name cat /etc/os-release
# ============ 网络排查 ============
# 测试容器网络连通性
docker exec container_name ping -c 3 google.com
# 查看容器网络配置
docker exec container_name ip addr
# 查看容器路由表
docker exec container_name ip route
# 查看容器网络命名空间
docker inspect container_name | grep -A 20 NetworkSettings
# ============ 磁盘和存储 ============
# 查看磁盘使用
docker system df
# 查看容器文件系统变更
docker diff container_name
# 查看挂载点
docker inspect container_name | grep -A 10 Mounts
# ============ 清理资源 ============
# 清理所有未使用的镜像、容器、网络
docker system prune -a --volumes
# 清理构建缓存
docker builder prune
# 查看磁盘使用详情
docker system df -v
2. 性能监控
# 实时查看容器资源使用
docker stats
# 查看指定容器
docker stats container1 container2
# 格式化输出
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# 只显示一次
docker stats --no-stream
# 持续监控并保存到文件
docker stats --no-stream >> stats.log
3. 调试技巧
# 在 Dockerfile 中添加调试工具
FROM alpine:3.18
# 安装调试工具
RUN apk add --no-cache \
curl \
wget \
tcpdump \
strace \
ltrace \
gdb \
vim \
bash
# 设置调试环境变量
ENV DEBUG=1
ENV LOG_LEVEL=debug
# 保持容器运行(用于调试)
CMD ["tail", "-f", "/dev/null"]
