前言回顾系统学习docker系列已发布内容【docker基础】0、系统学习docker之总计划【docker基础】第一课、从零开始理解容器技术【docker基础】第二课安装、配置与基础命令【docker基础】第三课镜像管理与Dockerfile基础【docker基础】第四课容器操作与数据管理【docker基础】第五课Docker网络详解-CSDN博客【docker基础】第六课Web应用与数据库容器部署-CSDN博客【docker基础】 第七课Docker Compose 多容器实战-CSDN博客【docker基础】 第八周容器监控与应用更新策略-CSDN博客相关文档windows下安装docker【docker基础】Ubuntu 安装 Docker 超详细小白教程本课学习目标Docker 安全 非特权用户、官方镜像、资源限制、网络隔离镜像扫描 使用 Docker scan 和 Trivy 检查漏洞镜像优化 多阶段构建、使用 alpine、合并命令、清理文件安全加固 只读模式、能力限制、隔离网络Docker第九周Docker安全与镜像优化欢迎来到 Docker 第九周的学习本周我们将深入学习 Docker 的高级特性包括容器安全最佳实践和镜像优化技巧。第一章Docker 安全基础1.1 为什么容器安全很重要容器虽然提供了隔离性但并非绝对安全。以下是常见的安全风险容器逃逸攻击者从容器内部突破到宿主机恶意镜像使用了包含恶意代码的镜像权限过大容器以 root 用户运行网络攻击容器之间或外部网络的攻击1.2 容器安全最佳实践1.2.1 避免使用 root 用户问题默认情况下容器以 root 用户运行这很危险。解决方案在 Dockerfile 中创建非特权用户FROM nginx:latest # 创建非特权用户 RUN useradd -m appuser # 切换到非特权用户 USER appuser # 后续命令将以 appuser 身份执行 CMD [nginx, -g, daemon off;]验证docker exec -it mycontainer whoami # 输出: appuser1.2.2 使用官方镜像问题第三方镜像可能包含恶意代码或漏洞。解决方案使用 Docker Hub 官方认证的镜像优先选择带有OFFICIAL标签的镜像# 正确使用官方镜像 docker pull nginx:latest # 避免使用不明来源的镜像 docker pull randomuser/nginx:latest1.2.3 限制容器资源问题容器可能占用过多资源影响其他容器或宿主机。解决方案使用资源限制参数docker run -d \ --name myapp \ --memory512m \ --cpus1 \ --memory-swap1g \ nginx参数说明参数说明--memory限制内存使用如 512m--cpus限制 CPU 使用如 1 表示1个核心--memory-swap限制交换内存--pids-limit限制进程数量1.2.4 限制容器网络问题容器可能被允许访问不必要的网络资源。解决方案使用自定义网络隔离容器限制容器的网络访问# 创建隔离网络 docker network create --internal secure-network # 运行容器在隔离网络中 docker run -d --network secure-network --name isolated-app nginx1.2.5 定期更新镜像问题镜像中可能包含已知的安全漏洞。解决方案定期更新基础镜像# 更新镜像 docker pull nginx:latest # 重新构建应用镜像 docker build -t myapp:latest .第二章镜像安全扫描2.1 什么是镜像扫描镜像扫描是检查 Docker 镜像中安全漏洞的过程。2.2 使用 Docker 内置扫描工具# 扫描镜像 docker scan myapp:latest输出示例Testing myapp:latest... ✗ HIGH CVE-2021-3156: sudo vulnerability Package: sudo Version: 1.8.31-1ubuntu1.2 Severity: HIGH URL: https://security.snyk.io/vuln/SNYK-UBUNTU2004-SUDO-1583796 ✗ MEDIUM CVE-2021-23214: systemd vulnerability Package: systemd Version: 245.4-4ubuntu3.1 Severity: MEDIUM URL: https://security.snyk.io/vuln/SNYK-UBUNTU2004-SYSTEMD-1583795 ✓ No critical issues found2.3 使用第三方扫描工具Trivy推荐# 安装 Trivy docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:0.19.0 image myapp:latest输出示例2021-06-01T12:00:00.0000000 INFO Detected OS: ubuntu 2021-06-01T12:00:00.0000000 INFO Detecting Ubuntu vulnerabilities... 2021-06-01T12:00:00.0000000 INFO Number of PLUGINS: 0 2021-06-01T12:00:00.0000000 INFO Number of vulnerabilities: 5 ----------------------------------------------------------------------------------------------------------------------- | LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE | ----------------------------------------------------------------------------------------------------------------------- | sudo | CVE-2021-3156 | HIGH | 1.8.31-1ubuntu1.2 | 1.8.31-1ubuntu1.3 | sudo heap-based buffer overflow | | systemd | CVE-2021-23214 | MEDIUM | 245.4-4ubuntu3.1 | 245.4-4ubuntu3.2 | systemd out-of-bounds write | -----------------------------------------------------------------------------------------------------------------------第三章Docker 镜像优化3.1 为什么需要优化镜像减少存储空间更小的镜像占用更少的磁盘空间加快传输速度更小的镜像下载更快提高安全性更小的镜像意味着更少的攻击面3.2 镜像优化技巧3.2.1 使用多阶段构建原理在一个 Dockerfile 中使用多个FROM指令只保留最终需要的文件。示例# 第一阶段构建阶段 FROM node:14 AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --onlyproduction COPY . . RUN npm run build # 第二阶段运行阶段 FROM nginx:alpine # 从构建阶段复制产物 COPY --frombuilder /app/build /usr/share/nginx/html EXPOSE 80 CMD [nginx, -g, daemon off;]效果构建阶段包含 Node.js 环境约 1GB运行阶段只包含 Nginx约 20MB最终镜像大小约 20MB3.2.2 使用更小的基础镜像对比镜像大小说明ubuntu:latest~72MB完整的 Ubuntu 系统alpine:latest~5MB最小的 Linux 发行版debian:latest~114MB完整的 Debian 系统node:14~900MB包含 Node.js 的完整系统node:14-alpine~100MB基于 Alpine 的 Node.js建议优先使用alpine版本的镜像# 不好使用完整镜像 FROM node:14 # 好使用 alpine 版本 FROM node:14-alpine3.2.3 合并 RUN 命令问题每个RUN命令都会创建一个新的镜像层。解决方案使用合并多个命令# 不好多个 RUN 命令 RUN apt-get update RUN apt-get install -y nginx RUN apt-get clean # 好合并为一个 RUN 命令 RUN apt-get update \ apt-get install -y nginx \ apt-get clean \ rm -rf /var/lib/apt/lists/*3.2.4 使用 .dockerignore 文件问题构建上下文可能包含不必要的文件。解决方案创建.dockerignore文件# .dockerignore 文件内容 node_modules/ .git/ .vscode/ *.log .env build/ dist/3.2.5 使用 COPY 代替 ADD问题ADD会自动解压文件可能导致意外行为。解决方案优先使用COPY# 不好使用 ADD ADD app.tar.gz /app # 好使用 COPY COPY app.tar.gz /app RUN tar -xzf /app/app.tar.gz -C /app3.2.6 清理不必要的文件FROM ubuntu:20.04 RUN apt-get update \ apt-get install -y nginx \ # 清理 apt 缓存 apt-get clean \ rm -rf /var/lib/apt/lists/* \ # 删除不必要的文件 rm -rf /usr/share/doc \ rm -rf /usr/share/man第四章Docker 安全加固实战4.1 创建安全的 Dockerfile# 使用最小基础镜像 FROM alpine:3.14 # 创建非特权用户 RUN addgroup -S appgroup adduser -S appuser -G appgroup # 安装必要的依赖 RUN apk update \ apk add --no-cache nginx \ rm -rf /var/cache/apk/* # 配置 Nginx COPY nginx.conf /etc/nginx/nginx.conf COPY index.html /usr/share/nginx/html/ # 设置文件权限 RUN chown -R appuser:appgroup /usr/share/nginx/html # 切换到非特权用户 USER appuser # 暴露端口 EXPOSE 8080 # 健康检查 HEALTHCHECK --interval5s --timeout3s \ CMD wget -qO- http://localhost:8080 || exit 1 # 启动命令 CMD [nginx, -g, daemon off;]4.2 运行安全的容器docker run -d \ --name secure-app \ --user appuser \ --memory256m \ --cpus0.5 \ --read-only \ --tmpfs /run \ --tmpfs /tmp \ --cap-dropALL \ --networksecure-network \ secure-app:latest参数说明参数说明--user指定运行用户--read-only以只读模式运行容器--tmpfs创建临时文件系统--cap-dropALL移除所有 Linux 能力--network指定隔离网络第五章镜像优化实战5.1 优化前后对比优化前的 DockerfileFROM node:14 WORKDIR /app COPY . . RUN npm install RUN npm run build EXPOSE 3000 CMD [npm, start]优化后的 Dockerfile# 构建阶段 FROM node:14-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --onlyproduction COPY . . RUN npm run build # 运行阶段 FROM nginx:alpine COPY --frombuilder /app/build /usr/share/nginx/html EXPOSE 80 CMD [nginx, -g, daemon off;]5.2 构建并验证# 构建优化前的镜像 docker build -t myapp-before . # 构建优化后的镜像 docker build -t myapp-after -f Dockerfile.optimized . # 查看镜像大小 docker images | grep myapp预期结果REPOSITORY TAG IMAGE ID SIZE myapp-before latest abc123def456 900MB myapp-after latest ghi789jkl012 25MB第六章Docker Security 命令汇总6.1 安全相关命令命令说明docker scan扫描镜像中的安全漏洞docker run --user指定容器运行用户docker run --read-only以只读模式运行容器docker run --cap-drop移除 Linux 能力docker network create --internal创建隔离网络6.2 镜像优化命令命令说明docker build --no-cache不使用缓存构建镜像docker images查看镜像大小docker history查看镜像历史docker save保存镜像到文件docker import从文件导入镜像第七章常见问题与解决方案7.1 问题容器需要 root 权限解决方案尽可能使用非特权用户如果必须使用 root限制容器的能力docker run -d \ --cap-dropALL \ --cap-addNET_BIND_SERVICE \ nginx7.2 问题镜像扫描发现漏洞解决方案更新基础镜像更新依赖包使用更小的基础镜像7.3 问题镜像太大解决方案使用多阶段构建使用 alpine 镜像清理不必要的文件本周总结本周我们学习了Docker 安全非特权用户、官方镜像、资源限制、网络隔离镜像扫描使用 Docker scan 和 Trivy 检查漏洞镜像优化多阶段构建、使用 alpine、合并命令、清理文件安全加固只读模式、能力限制、隔离网络练习作业创建一个安全的 Dockerfile包含非特权用户和健康检查使用多阶段构建优化一个 Node.js 应用使用 Trivy 扫描镜像并修复发现的漏洞