导航菜单

Docker 安全与优化

陆兴东 2026-04-09 16 浏览 Docker

安全最佳实践

image.png

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"]