Docker 漏洞修复实战:从升级到加固,新手也能一步步搞定
Docker 最新漏洞修复教程|零基础可学
适用人群:刚接触 Docker、运维新手、开发人员、服务器管理员
适用系统:Ubuntu、Debian、CentOS、Rocky Linux、AlmaLinux、Docker Desktop
目标:帮助你理解 Docker 漏洞风险,并一步步完成 Docker 升级、修复与安全加固
一、为什么 Docker 漏洞需要及时修复?
Docker 是目前非常常用的容器化工具,很多网站、后端服务、数据库、中间件都会运行在 Docker 容器中。它的优点是部署方便、环境隔离、迁移简单,但同时也会带来一些安全风险。
很多人以为:
“应用跑在容器里,就一定安全。”
其实这是一个误区。容器并不是虚拟机,Docker 容器通常共享宿主机内核。如果 Docker 本身、容器运行时、镜像或者配置存在漏洞,攻击者可能会利用漏洞进行以下操作:
- 逃逸出容器,影响宿主机;
- 读取宿主机敏感文件;
- 获取更高权限;
- 篡改容器内服务;
- 利用服务器挖矿;
- 横向攻击内网其他服务;
- 通过暴露的 Docker API 接管服务器。
因此,Docker 漏洞修复不是可选项,而是服务器安全维护中的基础工作。
本文会用零基础也能看懂的方式,带你完成 Docker 漏洞修复流程。
二、Docker 漏洞通常来自哪里?
在修复之前,我们先了解 Docker 安全问题通常来自哪些地方。
1. Docker Engine 版本过旧
Docker Engine 是 Docker 的核心组件。如果版本长期不更新,可能存在已公开的安全漏洞。
例如:
docker --version
如果你的 Docker 版本已经是很多年前的版本,就需要重点关注。
2. containerd 或 runc 存在漏洞
Docker 底层依赖一些组件,例如:
containerdruncdocker-cedocker-ce-cli
其中 runc 是容器运行时组件,历史上曾出现过比较严重的容器逃逸漏洞。因此修复 Docker 漏洞时,不能只看 Docker 主程序,也要关注这些依赖组件。
3. Docker 镜像存在漏洞
即使 Docker 软件本身没有问题,如果你使用的镜像很老,也可能存在大量漏洞。
例如:
nginx:1.14
mysql:5.7
redis:4
ubuntu:18.04
这些旧镜像中的系统库、OpenSSL、glibc、bash、curl 等都可能存在安全隐患。
4. Docker 配置不安全
很多漏洞不是因为 Docker 版本问题,而是因为配置太危险,例如:
- 容器使用
--privileged模式; - 把宿主机
/挂载到容器; - Docker API 暴露到公网;
- 容器以 root 用户运行;
- 宿主机防火墙未限制端口;
- 使用来历不明的镜像;
- 镜像中写死数据库密码、Token、密钥。
所以,修复 Docker 漏洞不只是升级版本,还包括配置检查和安全加固。
三、修复前准备工作
在正式升级 Docker 前,建议先做以下准备,避免服务中断或数据丢失。
1. 查看当前 Docker 版本
执行:
docker --version
示例输出:
Docker version 24.0.7, build afdd53b
继续查看详细信息:
docker info
查看 containerd 和 runc 版本:
containerd --version
runc --version
如果命令不存在,也可以通过包管理器查看。
Ubuntu / Debian:
dpkg -l | grep -E 'docker|containerd|runc'
CentOS / Rocky Linux / AlmaLinux:
rpm -qa | grep -E 'docker|containerd|runc'
2. 查看正在运行的容器
docker ps
查看所有容器,包括已经停止的:
docker ps -a
建议把结果保存下来:
docker ps -a > docker-container-list.txt
3. 备份重要数据
Docker 的数据通常有几类:
容器数据卷
查看数据卷:
docker volume ls
查看某个数据卷位置:
docker volume inspect 卷名
compose 项目目录
如果你使用 Docker Compose 部署服务,一定要备份:
docker-compose.yml.env- 配置文件目录
- 数据目录
- 上传文件目录
例如:
tar -czvf docker-project-backup.tar.gz /opt/myapp
数据库备份
如果容器中运行 MySQL、PostgreSQL、MongoDB 等数据库,不建议只备份容器目录,最好使用数据库官方方式导出。
MySQL 示例:
docker exec -it mysql mysqldump -uroot -p 数据库名 > backup.sql
PostgreSQL 示例:
docker exec -it postgres pg_dump -U 用户名 数据库名 > backup.sql
四、Ubuntu / Debian 修复 Docker 漏洞教程
下面以 Ubuntu 和 Debian 为例,演示如何升级 Docker。
1. 更新软件源
sudo apt update
2. 查看可升级的 Docker 相关包
apt list --upgradable | grep -E 'docker|containerd|runc'
如果看到类似内容,说明有可升级版本:
docker-ce
docker-ce-cli
containerd.io
docker-buildx-plugin
docker-compose-plugin
3. 升级 Docker 组件
推荐升级所有 Docker 相关组件:
sudo apt install --only-upgrade docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
如果你不确定当前安装了哪些组件,可以直接执行:
sudo apt upgrade
但生产环境建议谨慎执行全量升级,最好先确认升级内容。
4. 重启 Docker 服务
sudo systemctl restart docker
查看 Docker 状态:
sudo systemctl status docker
如果显示:
active (running)
说明 Docker 已正常运行。
5. 验证版本
docker --version
containerd --version
runc --version
也可以运行测试容器:
docker run hello-world
如果输出正常,说明 Docker 基础功能没有问题。
五、CentOS / Rocky Linux / AlmaLinux 修复 Docker 漏洞教程
如果你的服务器使用 CentOS、Rocky Linux 或 AlmaLinux,可以按照下面步骤操作。
1. 查看当前版本
docker --version
containerd --version
runc --version
查看已安装包:
rpm -qa | grep -E 'docker|containerd|runc'
2. 更新软件仓库缓存
CentOS 7:
sudo yum makecache
Rocky Linux / AlmaLinux / CentOS 8+:
sudo dnf makecache
3. 查看可更新包
CentOS 7:
sudo yum check-update | grep -E 'docker|containerd|runc'
Rocky Linux / AlmaLinux:
sudo dnf check-update | grep -E 'docker|containerd|runc'
4. 升级 Docker
CentOS 7:
sudo yum update docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Rocky Linux / AlmaLinux:
sudo dnf update docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
如果提示没有这些包,说明你的安装方式可能不同,需要先确认 Docker 源是否正确。
5. 重启 Docker
sudo systemctl restart docker
查看状态:
sudo systemctl status docker
6. 验证容器是否正常
docker ps
如果原来的容器没有启动,可以查看所有容器:
docker ps -a
手动启动容器:
docker start 容器名或容器ID
如果使用 Docker Compose:
docker compose up -d
六、Docker Desktop 漏洞修复教程
如果你使用的是 Windows 或 macOS 上的 Docker Desktop,修复方式更简单。
1. 打开 Docker Desktop
在系统托盘或应用程序中打开 Docker Desktop。
2. 检查更新
一般路径为:
Docker Desktop → Settings → Software updates
或者:
Docker Desktop → Check for Updates
如果检测到新版本,点击下载并安装。
3. 重启 Docker Desktop
升级完成后,Docker Desktop 通常会要求重启。
重启完成后,在终端执行:
docker --version
docker compose version
确认版本已经更新。
七、如何修复镜像漏洞?
升级 Docker 本身只能解决一部分问题,镜像漏洞同样重要。
1. 不要长期使用旧镜像
比如下面这些镜像可能已经很旧:
ubuntu:18.04
debian:9
node:12
python:3.7
nginx:1.14
redis:4
建议使用仍在维护的版本,例如:
ubuntu:22.04
debian:12
node:20
python:3.12
nginx:stable
redis:7
注意:不要盲目使用 latest 标签。latest 不是“最安全”的意思,它只是一个标签,升级后可能导致应用不兼容。
2. 重新拉取最新镜像
docker pull nginx:stable
docker pull redis:7
docker pull mysql:8
如果你使用 Docker Compose,可以执行:
docker compose pull
docker compose up -d
3. 删除旧镜像
查看镜像:
docker images
删除无用镜像:
docker image prune
如果确认要清理所有未使用镜像:
docker image prune -a
注意:生产环境不要随意执行清理命令,避免误删需要回滚的镜像。
4. 使用工具扫描镜像漏洞
可以使用 Trivy 扫描镜像。
安装后执行:
trivy image nginx:stable
扫描本地镜像:
trivy image 镜像名:标签
如果发现高危漏洞,应优先升级基础镜像或应用依赖。
八、检查 Docker API 是否暴露到公网
Docker API 如果暴露到公网,是非常危险的。攻击者可以直接创建容器、挂载宿主机目录,甚至控制整台服务器。
1. 检查 Docker 监听端口
执行:
ss -lntp | grep docker
或者:
netstat -lntp | grep docker
如果看到类似:
0.0.0.0:2375
说明 Docker API 可能暴露到所有网络接口,非常危险。
2. 检查 Docker 配置文件
常见配置文件:
/etc/docker/daemon.json
/lib/systemd/system/docker.service
/etc/systemd/system/docker.service.d/
查看 Docker 启动参数:
systemctl cat docker
如果看到:
-H tcp://0.0.0.0:2375
说明 Docker API 通过 TCP 暴露,而且通常没有 TLS 加密。
3. 修复方法
编辑配置,删除危险监听:
-H tcp://0.0.0.0:2375
建议只保留 Unix Socket:
-H unix:///var/run/docker.sock
修改后执行:
sudo systemctl daemon-reload
sudo systemctl restart docker
再次检查:
ss -lntp | grep docker
确认不再监听公网地址。
九、减少容器高危权限
很多容器被攻击后能影响宿主机,是因为启动参数过于危险。
1. 避免使用 privileged 模式
危险示例:
docker run --privileged -d nginx
--privileged 会给容器非常高的权限,除非确实需要,否则不要使用。
Docker Compose 中也要避免:
privileged: true
2. 避免挂载宿主机根目录
危险示例:
docker run -v /:/host -d ubuntu
这会让容器访问整个宿主机文件系统,非常危险。
如果必须挂载目录,应尽量挂载具体目录,并使用只读权限:
docker run -v /data/config:/app/config:ro -d myapp
其中 :ro 表示只读。
3. 尽量不要让容器以 root 用户运行
Dockerfile 中可以增加普通用户:
RUN useradd -m appuser
USER appuser
Docker Compose 示例:
services:
app:
image: myapp:latest
user: "1000:1000"
这样即使应用被攻击,攻击者获得的权限也会降低。
4. 限制容器能力
可以使用 cap_drop 去掉不必要的 Linux capabilities。
Docker Compose 示例:
services:
app:
image: nginx:stable
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
这表示默认删除所有能力,只额外允许绑定低端口。
十、配置 Docker 日志,避免磁盘被打满
有些攻击会疯狂写日志,导致宿主机磁盘被打满。建议限制 Docker 日志大小。
编辑:
sudo vim /etc/docker/daemon.json
写入:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
重启 Docker:
sudo systemctl restart docker
说明:
max-size:单个日志文件最大 100MB;max-file:最多保留 3 个日志文件。
十一、开启自动安全更新
对于个人服务器或测试服务器,可以考虑开启自动安全更新。
Ubuntu / Debian
安装:
sudo apt install unattended-upgrades
启用:
sudo dpkg-reconfigure unattended-upgrades
不过生产环境建议先在测试环境验证,避免自动更新导致兼容性问题。
CentOS / Rocky Linux / AlmaLinux
可以使用:
sudo dnf install dnf-automatic
启用定时更新:
sudo systemctl enable --now dnf-automatic.timer
生产环境建议只开启安全更新,并配合监控和告警。
十二、修复后如何确认漏洞已经解决?
升级完成后,不要急着结束,还需要做验证。
1. 确认 Docker 版本
docker --version
docker info
2. 确认组件版本
containerd --version
runc --version
3. 确认服务正常
docker ps
docker logs 容器名
如果使用 Compose:
docker compose ps
docker compose logs
4. 扫描镜像漏洞
trivy image 镜像名:标签
5. 检查危险配置
重点检查:
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}"
检查是否有不该暴露的端口。
检查容器挂载:
docker inspect 容器名
重点看:
MountsPrivilegedUserCapAddNetworkMode
十三、常见问题解答
1. 升级 Docker 会删除容器吗?
一般不会。正常升级 Docker Engine 不会删除已有容器、镜像和数据卷。
但为了安全,升级前仍然建议备份重要数据,尤其是数据库和业务文件。
2. 升级后容器没有自动启动怎么办?
可以手动启动:
docker start 容器名
如果希望容器随 Docker 自动启动,可以设置重启策略:
docker update --restart=always 容器名
Docker Compose 中可以写:
restart: always
3. 是否应该一直使用 latest 镜像?
不建议。
latest 可能会在你不知情的情况下升级到不兼容版本。更推荐使用明确版本号,例如:
nginx:1.26
redis:7.2
mysql:8.0
这样更容易回滚和排查问题。
4. Docker 漏洞修复只要升级 Docker 就够了吗?
不够。
完整修复至少包括:
- 升级 Docker Engine;
- 升级 containerd;
- 升级 runc;
- 更新基础镜像;
- 扫描镜像漏洞;
- 检查 Docker API 暴露;
- 避免 privileged;
- 限制容器权限;
- 清理无用镜像;
- 设置日志限制;
- 定期备份和监控。
十四、Docker 安全维护清单
你可以按照下面清单定期检查。
| 检查项 | 建议 |
|---|---|
| Docker Engine | 保持在官方维护版本 |
| containerd / runc | 随 Docker 一起升级 |
| 镜像版本 | 避免长期使用旧版本 |
| Docker API | 不要暴露到公网 |
| privileged | 非必要不要开启 |
| root 用户 | 尽量使用普通用户运行 |
| 数据卷 | 只挂载必要目录 |
| 敏感信息 | 不写入镜像和代码仓库 |
| 日志 | 设置大小限制 |
| 防火墙 | 只开放必要端口 |
| 镜像来源 | 使用官方或可信镜像 |
| 漏洞扫描 | 定期扫描镜像 |
| 备份 | 定期备份数据卷和数据库 |
十五、总结
Docker 漏洞修复并不复杂,但不能只停留在“升级一下 Docker”这个层面。对于零基础用户,可以按照本文流程逐步完成:
- 查看当前 Docker、containerd、runc 版本;
- 备份容器数据、配置文件和数据库;
- 使用系统包管理器升级 Docker 相关组件;
- 重启 Docker 并验证服务是否正常;
- 更新存在漏洞的镜像;
- 检查 Docker API 是否暴露到公网;
- 避免使用
--privileged等危险权限; - 设置日志限制和基础安全策略;
- 定期扫描镜像和关注官方安全公告。
安全不是一次性工作,而是持续维护的过程。只要养成定期更新、最小权限、及时备份、谨慎暴露端口的习惯,就能大幅降低 Docker 环境被攻击的风险。