上一篇 下一篇 分享链接 返回 返回顶部

Docker 漏洞修复实战:从升级到加固,新手也能一步步搞定

发布人:慈云数据-客服中心 发布时间:12小时前 阅读量:2

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 底层依赖一些组件,例如:

  • containerd
  • runc
  • docker-ce
  • docker-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 容器名

重点看:

  • Mounts
  • Privileged
  • User
  • CapAdd
  • NetworkMode

十三、常见问题解答

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”这个层面。对于零基础用户,可以按照本文流程逐步完成:

  1. 查看当前 Docker、containerd、runc 版本;
  2. 备份容器数据、配置文件和数据库;
  3. 使用系统包管理器升级 Docker 相关组件;
  4. 重启 Docker 并验证服务是否正常;
  5. 更新存在漏洞的镜像;
  6. 检查 Docker API 是否暴露到公网;
  7. 避免使用 --privileged 等危险权限;
  8. 设置日志限制和基础安全策略;
  9. 定期扫描镜像和关注官方安全公告。

安全不是一次性工作,而是持续维护的过程。只要养成定期更新、最小权限、及时备份、谨慎暴露端口的习惯,就能大幅降低 Docker 环境被攻击的风险。

目录结构
全文