在 Debian 上安装 Docker 不该靠猜哪种方法不会把系统弄坏。
大多数指南会把多种安装选项一股脑丢给您,却不说明各自适用场景。结果您不是从 Debian 的仓库装到了过时的软件包,就是更糟糕地遇到权限错误,被自家容器“拒之门外”。最终呢?排查问题耗掉数小时,本该用来部署应用的时间被浪费光了。
Debian 可预期的发布节奏和坚如磐石的稳定性,使其非常适合用于生产环境中的 Docker 部署。您能获得一致的容器性能,不会被突如其来的系统更新打乱配置。理论上,跨过最棘手的安装环节后,您就不该再有太多问题。
在本教程中,我将带您完成四种安装方法、必要的安全加固、存储配置,以及排障步骤,帮助您在 Debian 上稳定运行 Docker。
完全没有接触过 Docker? 请先学习 Docker 基础,再继续安装步骤。
系统先决条件
Docker 可运行在大多数现代 Debian 系统上,但您需要先核对几个要点。本节我将展示开始安装前系统所需的具体条件。
Debian 10(Buster)或更新版本 是当前 Docker 版本的要求。较老的版本如 Debian 9 无法与近期的 Docker 引擎构建兼容。内核版本应为 3.10 或更高——过去几年安装的多数 Debian 系统都已自动满足此要求。
您需要root 访问或 sudo 权限来安装 Docker 软件包并配置系统。Docker 还需要这些核心软件包:apt-transport-https、ca-certificates、curl 和 gnupg。多数 Debian 系统已安装它们,但稍后您会验证这一过程。
硬件要求很低:
- 2GB 内存可应对基础容器负载,但用于开发环境时 4GB 或更多会更好
- 至少 10GB 可用磁盘空间用于 Docker 镜像和容器数据。生产环境应规划更多空间。
如果您使用 GNOME 桌面环境,请确保已安装 gnome-terminal 软件包。部分 Docker 管理工具在交互式容器会话中会依赖它。
开始前请移除旧的 Docker 安装。诸如 docker、docker.io 或 docker-engine 等旧包会与当前的 Docker 引擎冲突。运行以下命令清理旧版本:
sudo apt remove docker docker-engine docker.io containerd runc技术支持
您的防火墙和网络配置会影响容器网络。Docker 会创建自有网络接口和 iptables 规则。如果您使用 UFW 或自定义防火墙规则,安装后可能需要调整以允许容器流量。
现在就检查这些要求——这能为您之后的排障省下时间。
安装方法
在 Debian 上安装 Docker 有四种方式,各有取舍。我会帮您选择适合您环境和安全需求的方法。
想找 Ubuntu 的安装说明?我们有一份完整的 Ubuntu 上安装 Docker 的分步指南。
方法一:Docker 官方软件源(推荐)
该方法可获取最新的 Docker 版本,并提供常规安全更新。
Docker 官方仓库始终提供最新稳定版,还能通过包管理器自动更新。您不会被缺少重要安全补丁或新功能的过时版本困住。
先更新系统并安装 Docker 需要的软件包:
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release技术支持
接着,添加 Docker 的官方 GPG 密钥以验证软件包的真实性:
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg技术支持
通过将其添加到源列表来配置仓库:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null技术支持
最后,安装 Docker Engine、CLI 和 Compose:
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin技术支持
这能为生产环境的 Docker 部署提供所需的一切。
方法二:Debian 默认软件源
该方法一条命令即可完成安装,但版本会较旧。
使用 Debian 的默认仓库安装很简单——运行 sudo apt install docker.io 即可。但问题在于:您常常会得到落后当前发布数月甚至数年的 Docker 版本。
sudo apt update
sudo apt install docker.io技术支持
此方法适用于基础测试,或因兼容性需要特定旧版本的场景。但您将错过新近版本带来的安全更新、性能改进和新功能。
仅当无法使用官方仓库时再采用此方法。
方法三:手动安装 DEB 软件包
当无法访问仓库时,我会演示如何直接下载并安装软件包。
该方法适用于隔离网络环境、受限上网的企业网络,或需要在多台机器上安装相同 Docker 版本而避免重复下载时。
从 Docker 官网下载 DEB 软件包:
-
访问 https://download.docker.com/linux/debian/dists/
-
选择您的 Debian 版本(bullseye、bookworm 等)
-
进入 pool/stable/amd64/
-
下载以下软件包:docker-ce_*.deb、docker-ce-cli_*.deb 和 containerd.io_*.deb
按顺序安装软件包:
sudo dpkg -i containerd.io_*.deb
sudo dpkg -i docker-ce-cli_*.deb
sudo dpkg -i docker-ce_*.deb技术支持
如果遇到依赖错误,运行 sudo apt-get install -f 修复。
此方法在更新时需要更多手工操作,但能让您完全掌控安装的版本。
方法四:便捷脚本
最后一种方法可快速搭建测试环境,但在运行脚本前应先审阅。
Docker 提供能自动检测系统并完成安装的脚本。它们适于快速拉起测试环境,或在多台系统上批量部署 Docker。
curl -fsSL https://get.docker.com -o get-docker.sh技术支持
在运行前务必审阅脚本:
cat get-docker.sh技术支持
留意任何可疑或非预期的内容。脚本会修改您的系统配置,因此您需要清楚它在做什么。
审阅后再运行脚本:
sudo sh get-docker.sh技术支持
切勿在生产环境使用便捷脚本。 它们用于快速搭建,而非安全、可复现的部署。对关键系统请坚持使用官方仓库的方法。
除非有特定限制需要其他做法,否则我建议选择官方软件源的方法。
验证安装
完成安装只是第一步——在部署前,您需要确认 Docker 确实正常工作。以下快速测试可判断您的 Docker 设置是否已准备好承载真实工作负载。
检查 Docker 版本,确认安装完成:
docker --version技术支持
您应看到类似 Docker version xx.x.x, build x 的输出。如果出现 "command not found" 错误,说明 Docker 未正确安装或未加入 PATH。
获取详细的构建信息,查看正在运行的组件:
docker version技术支持
该命令会显示客户端和服务端的版本及架构细节。服务端部分可确认 Docker 守护进程是否正在运行且可访问。
运行测试容器,验证端到端是否正常:
docker run hello-world技术支持
Docker 会下载 hello-world 镜像并运行。若一切正常,您会看到一段解释 Docker 容器工作原理的消息。此测试确认 Docker 能拉取镜像、创建容器并执行命令。
您还可以验证 Docker Compose 是否已安装并可用:
docker compose version技术支持
您应看到类似 Docker Compose version vX.xx.x 的输出。注意新版 Docker 使用 docker compose(中间有空格),而非旧的 docker-compose 命令。
若上述命令均无错误,您的 Docker 安装即可用于生产环境。
准备运行第一个真实的容器?按步骤学习如何运行 Docker 镜像。
安装后配置
Docker 开箱即用,但为日常使用您会想配置一些内容。本节涵盖服务管理和用户权限设置,使 Docker 更便捷也更安全。
服务管理
您可用以下 systemd 命令控制 Docker 何时运行:
sudo systemctl start docker
sudo systemctl stop docker
sudo systemctl restart docker 技术支持
要设置系统启动时自动启动 Docker,运行:
sudo systemctl enable docker技术支持
这样可确保每次重启服务器时 Docker 都会运行,这正是生产系统需要的。
如需检查 Docker 是否在运行并查看当前状态,运行:
sudo systemctl status docker技术支持
您会看到服务是否激活、已运行多长时间,以及近期日志消息。若 Docker 不工作,此命令通常能显示原因。
要排查服务问题,查看日志:
sudo journalctl -u docker.service技术支持
该命令显示详尽的 Docker 守护进程日志,有助于诊断启动问题、权限错误或配置问题。
非 root 用户访问
如需将您的用户加入 docker 组以便无需 sudo 即可运行 Docker 命令:
sudo usermod -aG docker $USER技术支持
这会将当前用户加入 docker 组,从而获得与 Docker 守护进程通信的权限。
随后您需要注销并重新登录以使组变更生效:
logout技术支持
或者重启终端会话。您也可以运行 newgrp docker 在当前会话中激活该组而无需注销。
最后,测试非 root 访问,运行以下 Docker 命令:
docker run hello-world技术支持
若无需 sudo 即可运行,说明已就绪。
但这里有个安全权衡: docker 组中的用户拥有等同于 root 的系统访问权限。他们可以挂载主机目录、访问敏感文件,并可能通过逃逸容器来危及宿主机。
仅将受信任用户加入 docker 组,切勿在您无法完全控制用户的共享系统上这样做。
将这些设置配置好,Docker 的日常使用会轻松许多。
存储驱动配置
Docker 的存储驱动管理容器镜像和数据在系统中的存储方式。大多数用户无需更改它,但了解选项有助于针对特定工作负载优化性能。
Docker 会在安装期间自动选择适合您系统的最佳存储驱动。在 Debian 上通常是 overlay2,它在大多数场景下都具备优秀的性能和稳定性。
用以下命令查看当前存储驱动:
docker info | grep "Storage Driver"技术支持
overlay2 驱动表现良好,因为它:
- 对写时复制操作处理迅速,当容器修改文件时尤为明显
- 在镜像间共享层,节省磁盘空间
- 支持所有 Docker 功能,无兼容性问题
- 跨不同文件系统类型可靠运行
如果您运行的是特殊工作负载或有特定文件系统要求,可能需要不同的存储驱动。
例如,一些企业存储系统在 devicemapper 驱动下表现更好,或您可能需要 vfs 来调试容器文件系统问题。
您可以更改存储驱动,方法是编辑 Docker 的守护进程配置:
sudo nano /etc/docker/daemon.json技术支持
在其中添加或修改 storage-driver 设置:
{
"storage-driver": "devicemapper"
}技术支持
最后,记得重启 Docker 以应用更改:
sudo systemctl restart docker技术支持
需要提醒的是,更换存储驱动会使现有容器和镜像无法访问。请先备份重要数据,或导出想保留的容器。
现在您可以通过拉取镜像并运行容器来测试新驱动:
docker pull hello-world
docker run hello-world技术支持
总之,除非有明确需求,建议坚持使用 overlay2。
安全加固
默认的 Docker 安装适合开发,但生产环境需要额外的安全层。这些配置能保护宿主机免受容器逃逸和资源耗尽攻击的影响。
SELinux/AppArmor 集成
强制访问控制增加了一层安全防护,即使容器被攻破也会限制其行为。没有这些控制时,以 root 运行的容器可能访问不该触及的宿主资源。
您可以为 Docker 启用 AppArmor(Debian 默认的安全框架),运行以下命令:
sudo apt install apparmor-utils
sudo systemctl enable apparmor
sudo systemctl start apparmor技术支持
AppArmor 运行后,加载 Docker 的安全配置文件:
sudo apparmor_parser -r /etc/apparmor.d/docker技术支持
现在即可在启用 AppArmor 防护的情况下运行容器:
docker run --security-opt apparmor=docker-default nginx技术支持
docker-default 配置文件会限制容器的能力,如挂载文件系统、访问原始网络接口、加载内核模块等。
对于使用 SELinux 的系统(若您选择它而非 AppArmor),先启用容器管理:
sudo setsebool -P container_manage_cgroup on技术支持
然后以 SELinux 标签运行容器:
docker run --security-opt label=type:container_t nginx技术支持
这些控制可阻止许多常见的容器逃逸技巧,并限制被攻破容器造成的破坏。
守护进程配置
您可以(也应该)自定义 Docker 守护进程设置,以缩小攻击面并提升安全态势。创建或编辑 /etc/docker/daemon.json 文件:
{
"live-restore": true,
"userland-proxy": false,
"no-new-privileges": true,
"icc": false,
"disable-legacy-registry": true
}技术支持
各项设置作用如下:
-
live-restore: true 在 Docker 守护进程崩溃时保持容器继续运行
-
userland-proxy: false 直接使用 iptables 而非用户态代理,获得更佳性能
-
no-new-privileges: true 防止容器获取新的权限
-
icc: false 默认禁用容器间通信 disable-legacy-registry: true 阻止访问旧的、不安全的镜像仓库协议
修改后重启 Docker 以应用:
sudo systemctl restart docker技术支持
此外应尽可能以非 root 用户运行容器:
docker run --user 1000:1000 nginx技术支持
这能限制被攻破容器对系统可能造成的影响。
使用控制组(cgroups)的资源限制
未设置资源限制的容器可能耗尽所有可用的 CPU、内存和 I/O,最终拖垮整个宿主机。控制组(cgroups)通过对资源使用施加硬性限制来防止这种情况。
先从内存限制入手,防止容器占用过多内存:
docker run --memory=512m nginx技术支持
您也可以限制 CPU 使用,防止单个容器独占算力:
docker run --cpus=1.5 nginx技术支持
对于磁盘 I/O 压力高的系统,控制读写速率:
docker run --device-read-bps /dev/sda:1mb nginx技术支持
您也可以组合多种限制以实现全面的资源控制:
docker run \
--memory=1g \
--cpus=2 \
--pids-limit=100 \
nginx技术支持
若希望为所有容器设定一致的限制,在 daemon.json 中配置默认值:
{
"default-ulimits": {
"nofile": {
"Hard": 64000,
"Name": "nofile",
"Soft": 64000
}
}
}技术支持
这些限制可防止资源耗尽攻击,并确保容器间公平共享资源。
一次性配置好这些安全措施,您的 Docker 环境就会难以被攻破得多。
需要掌握日常管理的 Docker 命令?这 18 条必备 Docker 命令 能让您事半功倍。
常见问题排查
即便正确安装,Docker 仍可能遭遇阻碍容器正常运行的状况。以下是最常见的问题及快速解决方法。
权限错误
大多数 Docker 权限问题归结为您的用户无权访问 Docker 的套接字文件。当您看到 Got permission denied while trying to connect to the Docker daemon socket,意味着您尚未加入 docker 组。
这是因为 Docker 以 root 运行,但会创建一个 docker 组成员可访问的套接字。将自己加入该组:
sudo usermod -aG docker $USER技术支持
您需要注销并重新登录以使更改生效。如果不想马上注销,可在当前会话激活该组:
newgrp docker技术支持
容器内的文件权限错误虽属另一类,但同样常见。当容器进程无法读取或写入您从宿主机挂载的文件时就会发生。这可能是因为容器以与文件所有者不同的用户 ID 运行。
检查文件的所有者:
ls -la /path/to/your/files技术支持
多数 Docker 容器默认以用户 ID 1000 运行。如果您的文件归 root 或其他用户所有,请更改所有权:
sudo chown -R 1000:1000 /path/to/your/files技术支持
如果您使用的是 SELinux(而非 AppArmor),可能会在审计日志中看到不同的权限拒绝。这更复杂,因为 SELinux 基于安全上下文而非仅用户 ID 来控制进程访问。
查看近期的访问违规:
sudo ausearch -m avc -ts recent技术支持
通过启用容器管理并为 Docker 卷恢复正确标签,修复SELinux 上下文:
sudo setsebool -P container_manage_cgroup on
sudo restorecon -R /path/to/your/volume技术支持
服务故障
当 Docker 无法启动或频繁崩溃时,您需要先弄清失败原因再着手修复。systemd 服务状态能快速给出概览:
sudo systemctl status docker技术支持
它会显示 Docker 是否在运行及近期错误消息。但要进行详细排障,您需要在 Docker 尝试启动时实时查看日志:
sudo journalctl -u docker.service -f技术支持
一种常见的启动失败是Docker 上次未正常关闭。您会看到“failed to start daemon: pid file found, ensure docker is not running.” 之类错误。这意味着残留的进程文件让启动脚本困惑。
删除陈旧文件并重试启动:
sudo rm /var/run/docker.pid
sudo systemctl start docker技术支持
存储问题也是守护进程故障的常见原因。Docker 将所有数据存放在 /var/lib/docker,若该目录空间耗尽或损坏,Docker 将无法正常启动。
检查可用空间:
df -h /var/lib/docker技术支持
若空间不足,清理未使用的旧容器和镜像:
docker system prune -a技术支持
网络冲突也会阻止 Docker 启动。当 Docker 的默认桥接网络(通常为 172.17.0.0/16)与现有网络配置冲突时会发生。您会看到地址范围不可用之类的错误。
通过配置不冲突的自定义桥接 IP 来修复。编辑 /etc/docker/daemon.json:
{
"bip": "192.168.1.1/24"
}技术支持
更改后重启 Docker 使新网络配置生效:
sudo systemctl restart docker技术支持
内核过旧问题
Docker 依赖 Linux 内核特性来实现容器化、网络和安全。若内核过旧,您会遇到无法通过升级以外方法解决的问题。
用以下命令查看当前内核版本:
uname -r技术支持
Docker 的基础功能至少需要 3.10 内核,但用于生产建议 4.0 或更新。低于 3.10 的版本无法与现代 Docker 兼容。
在 Debian 上更新内核很简单,安装最新内核软件包即可:
sudo apt update
sudo apt install linux-image-amd64技术支持
新内核需重启系统后才会生效:
sudo reboot技术支持
有时内核版本已足够新,但某些内核模块未加载。Docker 需要特定模块以实现网络和容器功能。您可能会看到网络接口不可用或容器无法正常启动的错误。
手动加载关键模块:
sudo modprobe bridge
sudo modprobe ip_tables
sudo modprobe iptable_nat技术支持
这些模块本应自动加载,若没有,可将它们加入系统配置以永久生效:
echo "bridge" | sudo tee -a /etc/modules
echo "ip_tables" | sudo tee -a /etc/modules
echo "iptable_nat" | sudo tee -a /etc/modules技术支持
即便内核较新,仍可能遇到提示“operation not supported”的容器运行时错误。这通常意味着您的内核在编译时缺失 Docker 预期的某些特性。遗憾的是,缺失的内核特性无法通过权宜之计补救——您需要一个正确配置的内核。
多数 Docker 安装问题可追溯至三方面:用户权限、服务配置或内核兼容性。请修复根因而非头痛医头,这样您的 Docker 环境会稳定得多。
在容器中使用数据库?在 Docker 中配置 PostgreSQL 比您想象的更简单。
卸载 Docker
有时您需要将 Docker 从系统中完全移除,无论是切换到其他容器运行时,还是在配置问题后重头来过。
该过程不止是移除软件包——您还需要清理数据和系统改动。
首先移除所有 Docker 软件包。具体命令取决于您最初的安装方式。
若您通过 Docker 官方仓库安装:
sudo apt purge docker-ce docker-ce-cli containerd.io docker-compose-plugin技术支持
若您通过 Debian 默认仓库安装:
sudo apt purge docker.io docker-compose技术支持
此举会移除软件包,但会保留配置文件和其他软件可能仍需的依赖。要一并移除:
sudo apt autoremove --purge技术支持
然后,删除 Docker 的数据目录,若您希望移除所有镜像、容器和卷。此步骤可选,但建议进行彻底清理。
Docker 默认将所有内容存于 /var/lib/docker。删除该目录会永久移除所有容器、镜像、网络和卷:
sudo rm -rf /var/lib/docker技术支持
您还应删除 Docker 的配置目录:
sudo rm -rf /etc/docker技术支持
继续清理 Docker 创建的系统组和用户。Docker 会在系统中添加 docker 组,并可能修改用户权限。
删除 docker 组:
sudo groupdel docker技术支持
如果您曾将用户加入 docker 组,删除该组时其成员关系会自动清理。但您也可以在删除前手动将特定用户移出该组:
sudo gpasswd -d username docker技术支持
接着,移除 Docker 的 systemd 服务文件和套接字文件:
sudo rm -f /lib/systemd/system/docker.service
sudo rm -f /lib/systemd/system/docker.socket
sudo systemctl daemon-reload技术支持
最后,检查是否有残留的 Docker 进程仍在运行:
ps aux | grep docker技术支持
若发现,手动停止:
sudo pkill -f docker技术支持
完成上述步骤后,系统中应已彻底移除 Docker,不会遗留文件或配置。
在考虑 Docker 的替代品?在做决定前先了解其他容器化平台。
结论与最佳实践
您已经在 Debian 上运行了 Docker,但安装只是开始。如何配置和维护 Docker 环境,将决定您是拥有顺畅的生产体验,还是在深夜疲于排查容器问题。
要为不同架构构建多平台容器?Docker Buildx 让跨平台构建更简单。
根据您的限制选择合适的安装方法。 对多数生产环境而言,Docker 官方仓库最佳,因为能获得最新功能和安全补丁。但隔离网络或强一致版本需求可能需要改用手动安装 DEB 包。
立即加固您的 Docker 环境。 启用 AppArmor 或 SELinux 强制访问控制,配置更严格的守护进程设置,并用 cgroups 限制容器资源。保持 Docker 自动获取安全更新,但先在预发布环境验证。
使用 Docker Compose 管理多容器应用。 与其维护复杂的 docker run 命令,不如用 YAML 定义应用栈。
监控磁盘使用并定期清理。 运行 docker system prune 清理未用镜像,并设置日志轮转,防止容器占满磁盘。
当您需要更详细的信息时,官方文档涵盖了本指南未涉及的高级主题。查阅 Docker 文档,深入了解网络、存储驱动和编排。Debian Docker 软件包文档说明了包特定的配置与已知问题。
Debian 上的 Docker 为容器化应用提供了稳定而强大的平台——前提是您要用心配置并持续维护。
想进一步学习 Docker、容器化,以及其在数据科学和机器学习中的应用?以下 DataCamp 课程是您的最佳下一站:
在 Debian 上安装 Docker 不该靠猜哪种方法不会把系统弄坏。
大多数指南会把多种安装选项一股脑丢给您,却不说明各自适用场景。结果您不是从 Debian 的仓库装到了过时的软件包,就是更糟糕地遇到权限错误,被自家容器“拒之门外”。最终呢?排查问题耗掉数小时,本该用来部署应用的时间被浪费光了。
Debian 可预期的发布节奏和坚如磐石的稳定性,使其非常适合用于生产环境中的 Docker 部署。您能获得一致的容器性能,不会被突如其来的系统更新打乱配置。理论上,跨过最棘手的安装环节后,您就不该再有太多问题。
在本教程中,我将带您完成四种安装方法、必要的安全加固、存储配置,以及排障步骤,帮助您在 Debian 上稳定运行 Docker。
完全没有接触过 Docker? 请先学习 Docker 基础,再继续安装步骤。
系统先决条件
Docker 可运行在大多数现代 Debian 系统上,但您需要先核对几个要点。本节我将展示开始安装前系统所需的具体条件。
Debian 10(Buster)或更新版本 是当前 Docker 版本的要求。较老的版本如 Debian 9 无法与近期的 Docker 引擎构建兼容。内核版本应为 3.10 或更高——过去几年安装的多数 Debian 系统都已自动满足此要求。
您需要root 访问或 sudo 权限来安装 Docker 软件包并配置系统。Docker 还需要这些核心软件包:
apt-transport-https、ca-certificates、curl和gnupg。多数 Debian 系统已安装它们,但稍后您会验证这一过程。硬件要求很低:
如果您使用 GNOME 桌面环境,请确保已安装
gnome-terminal软件包。部分 Docker 管理工具在交互式容器会话中会依赖它。开始前请移除旧的 Docker 安装。诸如
docker、docker.io或docker-engine等旧包会与当前的 Docker 引擎冲突。运行以下命令清理旧版本:您的防火墙和网络配置会影响容器网络。Docker 会创建自有网络接口和 iptables 规则。如果您使用 UFW 或自定义防火墙规则,安装后可能需要调整以允许容器流量。
现在就检查这些要求——这能为您之后的排障省下时间。
安装方法
在 Debian 上安装 Docker 有四种方式,各有取舍。我会帮您选择适合您环境和安全需求的方法。
想找 Ubuntu 的安装说明?我们有一份完整的 Ubuntu 上安装 Docker 的分步指南。
方法一:Docker 官方软件源(推荐)
该方法可获取最新的 Docker 版本,并提供常规安全更新。
Docker 官方仓库始终提供最新稳定版,还能通过包管理器自动更新。您不会被缺少重要安全补丁或新功能的过时版本困住。
先更新系统并安装 Docker 需要的软件包:
接着,添加 Docker 的官方 GPG 密钥以验证软件包的真实性:
通过将其添加到源列表来配置仓库:
最后,安装 Docker Engine、CLI 和 Compose:
这能为生产环境的 Docker 部署提供所需的一切。
方法二:Debian 默认软件源
该方法一条命令即可完成安装,但版本会较旧。
使用 Debian 的默认仓库安装很简单——运行
sudo apt install docker.io即可。但问题在于:您常常会得到落后当前发布数月甚至数年的 Docker 版本。此方法适用于基础测试,或因兼容性需要特定旧版本的场景。但您将错过新近版本带来的安全更新、性能改进和新功能。
仅当无法使用官方仓库时再采用此方法。
方法三:手动安装 DEB 软件包
当无法访问仓库时,我会演示如何直接下载并安装软件包。
该方法适用于隔离网络环境、受限上网的企业网络,或需要在多台机器上安装相同 Docker 版本而避免重复下载时。
从 Docker 官网下载 DEB 软件包:
访问
https://download.docker.com/linux/debian/dists/选择您的 Debian 版本(bullseye、bookworm 等)
进入
pool/stable/amd64/下载以下软件包:
docker-ce_*.deb、docker-ce-cli_*.deb和containerd.io_*.deb按顺序安装软件包:
如果遇到依赖错误,运行
sudo apt-get install -f修复。此方法在更新时需要更多手工操作,但能让您完全掌控安装的版本。
方法四:便捷脚本
最后一种方法可快速搭建测试环境,但在运行脚本前应先审阅。
Docker 提供能自动检测系统并完成安装的脚本。它们适于快速拉起测试环境,或在多台系统上批量部署 Docker。
在运行前务必审阅脚本:
留意任何可疑或非预期的内容。脚本会修改您的系统配置,因此您需要清楚它在做什么。
审阅后再运行脚本:
切勿在生产环境使用便捷脚本。 它们用于快速搭建,而非安全、可复现的部署。对关键系统请坚持使用官方仓库的方法。
除非有特定限制需要其他做法,否则我建议选择官方软件源的方法。
验证安装
完成安装只是第一步——在部署前,您需要确认 Docker 确实正常工作。以下快速测试可判断您的 Docker 设置是否已准备好承载真实工作负载。
检查 Docker 版本,确认安装完成:
您应看到类似
Docker version xx.x.x, build x的输出。如果出现 "command not found" 错误,说明 Docker 未正确安装或未加入 PATH。获取详细的构建信息,查看正在运行的组件:
该命令会显示客户端和服务端的版本及架构细节。服务端部分可确认 Docker 守护进程是否正在运行且可访问。
运行测试容器,验证端到端是否正常:
Docker 会下载 hello-world 镜像并运行。若一切正常,您会看到一段解释 Docker 容器工作原理的消息。此测试确认 Docker 能拉取镜像、创建容器并执行命令。
您还可以验证 Docker Compose 是否已安装并可用:
您应看到类似
Docker Compose version vX.xx.x的输出。注意新版 Docker 使用docker compose(中间有空格),而非旧的docker-compose命令。若上述命令均无错误,您的 Docker 安装即可用于生产环境。
准备运行第一个真实的容器?按步骤学习如何运行 Docker 镜像。
安装后配置
Docker 开箱即用,但为日常使用您会想配置一些内容。本节涵盖服务管理和用户权限设置,使 Docker 更便捷也更安全。
服务管理
您可用以下 systemd 命令控制 Docker 何时运行:
要设置系统启动时自动启动 Docker,运行:
这样可确保每次重启服务器时 Docker 都会运行,这正是生产系统需要的。
如需检查 Docker 是否在运行并查看当前状态,运行:
您会看到服务是否激活、已运行多长时间,以及近期日志消息。若 Docker 不工作,此命令通常能显示原因。
要排查服务问题,查看日志:
该命令显示详尽的 Docker 守护进程日志,有助于诊断启动问题、权限错误或配置问题。
非 root 用户访问
如需将您的用户加入 docker 组以便无需 sudo 即可运行 Docker 命令:
这会将当前用户加入
docker组,从而获得与 Docker 守护进程通信的权限。随后您需要注销并重新登录以使组变更生效:
或者重启终端会话。您也可以运行
newgrp docker在当前会话中激活该组而无需注销。最后,测试非 root 访问,运行以下 Docker 命令:
若无需 sudo 即可运行,说明已就绪。
但这里有个安全权衡: docker 组中的用户拥有等同于 root 的系统访问权限。他们可以挂载主机目录、访问敏感文件,并可能通过逃逸容器来危及宿主机。
仅将受信任用户加入 docker 组,切勿在您无法完全控制用户的共享系统上这样做。
将这些设置配置好,Docker 的日常使用会轻松许多。
存储驱动配置
Docker 的存储驱动管理容器镜像和数据在系统中的存储方式。大多数用户无需更改它,但了解选项有助于针对特定工作负载优化性能。
Docker 会在安装期间自动选择适合您系统的最佳存储驱动。在 Debian 上通常是
overlay2,它在大多数场景下都具备优秀的性能和稳定性。用以下命令查看当前存储驱动:
overlay2驱动表现良好,因为它:如果您运行的是特殊工作负载或有特定文件系统要求,可能需要不同的存储驱动。
例如,一些企业存储系统在
devicemapper驱动下表现更好,或您可能需要vfs来调试容器文件系统问题。您可以更改存储驱动,方法是编辑 Docker 的守护进程配置:
在其中添加或修改 storage-driver 设置:
最后,记得重启 Docker 以应用更改:
需要提醒的是,更换存储驱动会使现有容器和镜像无法访问。请先备份重要数据,或导出想保留的容器。
现在您可以通过拉取镜像并运行容器来测试新驱动:
总之,除非有明确需求,建议坚持使用
overlay2。安全加固
默认的 Docker 安装适合开发,但生产环境需要额外的安全层。这些配置能保护宿主机免受容器逃逸和资源耗尽攻击的影响。
SELinux/AppArmor 集成
强制访问控制增加了一层安全防护,即使容器被攻破也会限制其行为。没有这些控制时,以 root 运行的容器可能访问不该触及的宿主资源。
您可以为 Docker 启用 AppArmor(Debian 默认的安全框架),运行以下命令:
AppArmor 运行后,加载 Docker 的安全配置文件:
现在即可在启用 AppArmor 防护的情况下运行容器:
docker-default配置文件会限制容器的能力,如挂载文件系统、访问原始网络接口、加载内核模块等。对于使用 SELinux 的系统(若您选择它而非 AppArmor),先启用容器管理:
然后以 SELinux 标签运行容器:
这些控制可阻止许多常见的容器逃逸技巧,并限制被攻破容器造成的破坏。
守护进程配置
您可以(也应该)自定义 Docker 守护进程设置,以缩小攻击面并提升安全态势。创建或编辑
/etc/docker/daemon.json文件:各项设置作用如下:
live-restore: true在 Docker 守护进程崩溃时保持容器继续运行userland-proxy: false直接使用 iptables 而非用户态代理,获得更佳性能no-new-privileges: true防止容器获取新的权限icc: false默认禁用容器间通信disable-legacy-registry: true阻止访问旧的、不安全的镜像仓库协议修改后重启 Docker 以应用:
此外应尽可能以非 root 用户运行容器:
这能限制被攻破容器对系统可能造成的影响。
使用控制组(cgroups)的资源限制
未设置资源限制的容器可能耗尽所有可用的 CPU、内存和 I/O,最终拖垮整个宿主机。控制组(cgroups)通过对资源使用施加硬性限制来防止这种情况。
先从内存限制入手,防止容器占用过多内存:
您也可以限制 CPU 使用,防止单个容器独占算力:
对于磁盘 I/O 压力高的系统,控制读写速率:
您也可以组合多种限制以实现全面的资源控制:
若希望为所有容器设定一致的限制,在 daemon.json 中配置默认值:
这些限制可防止资源耗尽攻击,并确保容器间公平共享资源。
一次性配置好这些安全措施,您的 Docker 环境就会难以被攻破得多。
需要掌握日常管理的 Docker 命令?这 18 条必备 Docker 命令 能让您事半功倍。
常见问题排查
即便正确安装,Docker 仍可能遭遇阻碍容器正常运行的状况。以下是最常见的问题及快速解决方法。
权限错误
大多数 Docker 权限问题归结为您的用户无权访问 Docker 的套接字文件。当您看到
Got permission denied while trying to connect to the Docker daemon socket,意味着您尚未加入 docker 组。这是因为 Docker 以 root 运行,但会创建一个 docker 组成员可访问的套接字。将自己加入该组:
您需要注销并重新登录以使更改生效。如果不想马上注销,可在当前会话激活该组:
容器内的文件权限错误虽属另一类,但同样常见。当容器进程无法读取或写入您从宿主机挂载的文件时就会发生。这可能是因为容器以与文件所有者不同的用户 ID 运行。
检查文件的所有者:
多数 Docker 容器默认以用户 ID 1000 运行。如果您的文件归 root 或其他用户所有,请更改所有权:
如果您使用的是 SELinux(而非 AppArmor),可能会在审计日志中看到不同的权限拒绝。这更复杂,因为 SELinux 基于安全上下文而非仅用户 ID 来控制进程访问。
查看近期的访问违规:
通过启用容器管理并为 Docker 卷恢复正确标签,修复SELinux 上下文:
服务故障
当 Docker 无法启动或频繁崩溃时,您需要先弄清失败原因再着手修复。systemd 服务状态能快速给出概览:
它会显示 Docker 是否在运行及近期错误消息。但要进行详细排障,您需要在 Docker 尝试启动时实时查看日志:
一种常见的启动失败是Docker 上次未正常关闭。您会看到“failed to start daemon: pid file found, ensure docker is not running.” 之类错误。这意味着残留的进程文件让启动脚本困惑。
删除陈旧文件并重试启动:
存储问题也是守护进程故障的常见原因。Docker 将所有数据存放在
/var/lib/docker,若该目录空间耗尽或损坏,Docker 将无法正常启动。检查可用空间:
若空间不足,清理未使用的旧容器和镜像:
网络冲突也会阻止 Docker 启动。当 Docker 的默认桥接网络(通常为 172.17.0.0/16)与现有网络配置冲突时会发生。您会看到地址范围不可用之类的错误。
通过配置不冲突的自定义桥接 IP 来修复。编辑
/etc/docker/daemon.json:更改后重启 Docker 使新网络配置生效:
内核过旧问题
Docker 依赖 Linux 内核特性来实现容器化、网络和安全。若内核过旧,您会遇到无法通过升级以外方法解决的问题。
用以下命令查看当前内核版本:
Docker 的基础功能至少需要 3.10 内核,但用于生产建议 4.0 或更新。低于 3.10 的版本无法与现代 Docker 兼容。
在 Debian 上更新内核很简单,安装最新内核软件包即可:
新内核需重启系统后才会生效:
有时内核版本已足够新,但某些内核模块未加载。Docker 需要特定模块以实现网络和容器功能。您可能会看到网络接口不可用或容器无法正常启动的错误。
手动加载关键模块:
这些模块本应自动加载,若没有,可将它们加入系统配置以永久生效:
即便内核较新,仍可能遇到提示“operation not supported”的容器运行时错误。这通常意味着您的内核在编译时缺失 Docker 预期的某些特性。遗憾的是,缺失的内核特性无法通过权宜之计补救——您需要一个正确配置的内核。
多数 Docker 安装问题可追溯至三方面:用户权限、服务配置或内核兼容性。请修复根因而非头痛医头,这样您的 Docker 环境会稳定得多。
在容器中使用数据库?在 Docker 中配置 PostgreSQL 比您想象的更简单。
卸载 Docker
有时您需要将 Docker 从系统中完全移除,无论是切换到其他容器运行时,还是在配置问题后重头来过。
该过程不止是移除软件包——您还需要清理数据和系统改动。
首先移除所有 Docker 软件包。具体命令取决于您最初的安装方式。
若您通过 Docker 官方仓库安装:
若您通过 Debian 默认仓库安装:
此举会移除软件包,但会保留配置文件和其他软件可能仍需的依赖。要一并移除:
然后,删除 Docker 的数据目录,若您希望移除所有镜像、容器和卷。此步骤可选,但建议进行彻底清理。
Docker 默认将所有内容存于
/var/lib/docker。删除该目录会永久移除所有容器、镜像、网络和卷:您还应删除 Docker 的配置目录:
继续清理 Docker 创建的系统组和用户。Docker 会在系统中添加
docker组,并可能修改用户权限。删除 docker 组:
如果您曾将用户加入 docker 组,删除该组时其成员关系会自动清理。但您也可以在删除前手动将特定用户移出该组:
接着,移除 Docker 的 systemd 服务文件和套接字文件:
最后,检查是否有残留的 Docker 进程仍在运行:
若发现,手动停止:
完成上述步骤后,系统中应已彻底移除 Docker,不会遗留文件或配置。
在考虑 Docker 的替代品?在做决定前先了解其他容器化平台。
结论与最佳实践
您已经在 Debian 上运行了 Docker,但安装只是开始。如何配置和维护 Docker 环境,将决定您是拥有顺畅的生产体验,还是在深夜疲于排查容器问题。
要为不同架构构建多平台容器?Docker Buildx 让跨平台构建更简单。
根据您的限制选择合适的安装方法。 对多数生产环境而言,Docker 官方仓库最佳,因为能获得最新功能和安全补丁。但隔离网络或强一致版本需求可能需要改用手动安装 DEB 包。
立即加固您的 Docker 环境。 启用 AppArmor 或 SELinux 强制访问控制,配置更严格的守护进程设置,并用 cgroups 限制容器资源。保持 Docker 自动获取安全更新,但先在预发布环境验证。
使用 Docker Compose 管理多容器应用。 与其维护复杂的
docker run命令,不如用 YAML 定义应用栈。监控磁盘使用并定期清理。 运行
docker system prune清理未用镜像,并设置日志轮转,防止容器占满磁盘。当您需要更详细的信息时,官方文档涵盖了本指南未涉及的高级主题。查阅 Docker 文档,深入了解网络、存储驱动和编排。Debian Docker 软件包文档说明了包特定的配置与已知问题。
Debian 上的 Docker 为容器化应用提供了稳定而强大的平台——前提是您要用心配置并持续维护。
想进一步学习 Docker、容器化,以及其在数据科学和机器学习中的应用?以下 DataCamp 课程是您的最佳下一站: