Docker 安全:如何安全地运行容器
概述
你可能已经用 Docker 部署了 Web 应用、数据库、甚至 CI/CD 流水线。
但你有没有想过:如果容器被攻击,你的服务器会不会“全线失守”?
Docker 虽然强大,但如果使用不当,一个不安全的容器就可能成为黑客入侵整个系统的跳板
为什么 Docker 安全如此重要
- 容器共享宿主机内核
- 默认以
root用户运行(危险!) - 镜像可能包含漏洞或后门
- 错误配置可能导致数据泄露、权限提升
一个不安全的容器 = 一个潜在的系统后门
10 个必须知道的 Docker 安全实践
1. 不要以 root 用户运行容器
默认情况下,容器内的进程以 root 身份运行。
一旦被攻击,攻击者就拥有了容器内的最高权限。
解决方案:创建非 root 用户
# 在 Dockerfile 中
FROM node:18-alpine# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs && \adduser -u 1001 -S nodejs -G nodejs# 切换用户
USER nodejs# 后续命令都以 nodejs 用户身份运行
COPY --chown=nodejs:nodejs . /home/nodejs/app
WORKDIR /home/nodejs/app
CMD ["node", "server.js"]
2. 使用最小化基础镜像
越大的镜像,攻击面越大。
推荐:
alpine:极小的 Linux 发行版(~5MB)distroless:Google 推出的“无操作系统”镜像scratch:空镜像,用于静态编译程序(如 Go)
# 好的选择
FROM alpine:3.18
# 或
FROM gcr.io/distroless/static-debian11
3. 定期更新镜像和依赖
旧版本的软件可能包含已知漏洞。
建议:
- 使用
docker scan检查镜像漏洞:docker scan your-image:latest - 在 CI/CD 中集成安全扫描(如 Snyk、Trivy)
- 定期重建镜像,更新系统包和语言依赖
4. 避免在镜像中存储敏感信息
不要在 Dockerfile 或镜像中硬编码:
- 密码
- API 密钥
- 证书
正确做法:
- 使用 环境变量(
-e或.env文件) - 使用 Docker Secrets(Swarm 模式)
- 使用 外部密钥管理服务(如 HashiCorp Vault)
docker run -d \-e DB_PASSWORD=${DB_PASSWORD} \my-app:1.0
5. 限制容器资源
防止某个容器耗尽系统资源(CPU、内存)。
docker run -d \--name myapp \--memory="512m" \--cpus="1.0" \my-app:1.0
6. 禁用不必要的功能
通过 --security-opt 禁用高风险功能:
docker run -d \--security-opt=no-new-privileges \--cap-drop=ALL \--cap-add=NET_BIND_SERVICE \my-app:1.0
no-new-privileges:禁止进程获取更高权限--cap-drop=ALL:移除所有能力--cap-add=...:按需添加必要能力(如绑定 80 端口)
7. 使用只读文件系统
如果应用不需要写文件,就用只读模式:
docker run -d \--read-only \my-static-website:1.0
需要写临时文件?挂载一个 tmpfs:
--tmpfs /tmp:rw,noexec,nosuid,size=64m
8. 限制网络暴露
- 只暴露必要的端口
- 使用自定义网络,避免使用
--link - 在生产环境中,考虑使用防火墙或服务网格控制流量
# 只暴露 80 端口,不暴露 3000
docker run -d -p 80:80 my-nginx:1.0
9. 使用可信镜像
- 优先使用官方镜像(
nginx,redis,mysql) - 查看镜像的
Dockerfile和更新频率 - 避免使用来源不明的第三方镜像
# 好
docker pull nginx:alpine
# 小心
docker pull someone/random-app:latest
10. 定期清理无用镜像和容器
无用的镜像可能包含漏洞,且占用磁盘空间。
# 删除所有停止的容器
docker container prune# 删除未使用的镜像
docker image prune -a# 清理所有未使用资源(容器、网络、卷、镜像)
docker system prune
Docker Compose 中的安全配置
在 docker-compose.yml 中也可以应用安全策略:
version: '3.8'services:app:build: .user: "1001:1001" # 指定用户 IDread_only: truetmpfs:- /tmp:rw,noexec,nosuidcap_drop:- ALLcap_add:- NET_BIND_SERVICEsecurity_opt:- no-new-privileges:trueenvironment:- DB_PASSWORD=${DB_PASSWORD}
总结
安全地运行 Docker 容器并不是一蹴而就的事,而是需要从用户权限、镜像选择、资源配置到敏感信息管理等多方面共同把关。
通过遵循这些最佳实践,你不仅能大幅降低安全风险,还能让应用更稳定、更易于维护。
