在Ubuntu系统中部署容器运行时,Docker是最常被选中的方案。不同于直接通过apt获取旧版软件包,现代实践更推荐采用官方仓库配合GPG校验的安装路径,这样不仅能拿到较新的引擎版本,也能顺带装上docker_compose命令行工具。很多故障其实源于安装阶段埋下的隐患,比如没有正确配置cgroup驱动,或者忽略了卸载系统预装的docker.io包,导致服务冲突。理解Linux内核的命名空间与控制组是如何被Docker调动的,有助于我们在后续配置时做出合理决策。

环境准备与旧版本清理
在正式安装之前,必须确认Ubuntu的版本处于长期支持周期之内,通常18.04、20.04以及22.04都可以良好兼容当前Docker引擎。打开终端后第一步应当是更新软件索引,并且安装后续流程需要的传输工具和证书组件。这些组件包括允许apt通过HTTPS拉取仓库的ca-certificates、用于安全传输的curl,以及管理密钥环的gnupg。如果系统中曾经使用snap或者apt安装过名为docker、docker.io或containerd的包,必须先彻底卸载,否则会在绑定套接字时抛出地址已被占用的错误。
清理旧版本可以使用如下指令组合,它们会移除二进制文件但保留你已经拉取的镜像与卷数据,如果你希望完全重置,可以手动删除/var/lib/docker目录。这一步经常被忽略,导致新装的docker守护进程启动时读取到不兼容的元数据格式。另外,Ubuntu默认启用了ufw防火墙,在开启Docker后它会自动向iptables注入转发规则,若你的服务器处于公网,应当提前规划暴露端口的白名单,避免容器服务被直接映射至外网。
sudo apt-get remove docker docker-engine docker.io containerd runc sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg
官方仓库安装与系统包安装对比
最常见的两条路线分别是直接sudo apt install docker.io和配置Docker官方apt仓库后安装docker-ce。系统自带包的优点是简单,一条命令即可完成,但版本往往落后主线半年以上,且不包含独立的docker_compose v2插件,只能额外用pip安装旧版compose。官方仓库则要求你先下载GPG密钥并写入/etc/apt/keyrings,再向sources.list.d追加对应的deb地址,之后安装的docker-ce、docker-ce-cli和containerd.io均为最新稳定版,并可通过docker compose version直接调用插件。
从稳定性角度看,生产环境更推荐官方仓库方案,因为你能精确控制升级节奏,而不会在某次apt upgrade时被系统源悄悄替换成旧引擎。下面的代码展示了如何添加密钥与仓库,注意其中使用了arch变量和. /etc/os-release来自动适配架构与发行代号。如果你在树莓派等ARM设备上操作,这套逻辑同样适用,只需确保CPU架构被官方支持即可。
sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
安装完成后,建议使用sudo docker run hello-world验证守护进程通信是否正常。若卡在等待守护进程,多半是containerd没有随系统启动,可执行sudo systemctl enable --now containerd修复。对比而言,系统包方案虽快,却容易在后续使用docker buildx或联网拉取多架构镜像时暴露功能缺失,因此时间充裕时务必走官方源。
权限配置与守护进程调优
默认情况下,Docker套接字归属于root用户与docker用户组,普通账号直接运行docker ps会报权限拒绝。将当前用户加入docker组是最省心的做法:sudo usermod -aG docker $USER,随后注销并重登即可免sudo操作。但需注意这等同于赋予该用户root级系统控制权,因为在容器内能挂载宿主根目录,所以在多租户机器上应评估风险,或改用rootless模式运行。
守护进程的核心配置位于/etc/docker/daemon.json,我们可以在这里指定镜像加速器、修改数据根目录以及切换cgroup驱动。国内网络环境下,配置中科大或阿里云镜像源能显著缩短拉取时间。若系统盘空间紧张,把data-root指向一块独立的硬盘能避免/var被写满导致节点崩溃。以下示例同时展示了加速器和驱动切换,其中cgroup驱动设为systemd以匹配Ubuntu默认的init系统,减少告警日志。
{
"registry-mirrors": ["https://docker.mirrors.ipipp.com"],
"data-root": "/mnt/ssd/docker",
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
修改完配置必须重启服务才能生效:sudo systemctl restart docker。你可以通过docker info命令检查输出的Registry Mirrors与Docker Root Dir字段是否和文件一致。最后,若需要容器开机自启,在docker run时加上--restart unless-stopped参数即可,不必额外写systemd单元。整套安装与配置流程走完后,Ubuntu上的Docker便具备生产可用的基础能力。
DockerUbuntudocker_compose修改时间:2026-08-17 10:50:45