Docker 20.10.24 生产环境安装与配置全指南
1. 项目概述为什么是Docker 20.10.24如果你正在搭建一个生产环境或者准备深入学习容器技术那么直接安装最新版本的Docker可能并不是最稳妥的选择。我遇到过不少新手兴冲冲地装上最新版结果被一些尚未稳定的改动或者不兼容的周边工具搞得焦头烂额。今天要聊的Docker 20.10.24就是一个在稳定性和功能上取得了很好平衡的“经典”版本。它属于Docker Engine的20.10.x长期支持系列这个系列以稳定可靠著称被广泛用于生产环境。选择这个特定版本而不是简单的apt-get install docker-ce意味着你对环境的可控性有更高的要求可能是为了复现某个特定环境、确保与现有CI/CD流水线兼容或者仅仅是避免成为新版本“小白鼠”。接下来我会带你从零开始在Linux系统上干净、清晰地安装Docker 20.10.24并分享一些只有踩过坑才知道的配置技巧和避坑指南。2. 安装前的关键准备与避坑指南安装软件的第一步往往不是执行命令而是做好准备工作这能避免80%的后续问题。对于Docker安装来说尤其如此。2.1 系统环境检查与清理在动手之前请务必确认你的系统环境。Docker 20.10.24对Linux内核版本有一定要求通常需要3.10以上。你可以通过uname -r命令查看。但更重要的是检查系统是否已经存在旧版本或冲突的Docker组件。许多Linux发行版如Ubuntu的早期版本的官方仓库里包含一个叫docker.io的包它和我们现在要安装的Docker Engine由Docker公司维护是两回事混在一起会导致各种奇怪的问题。我的建议是先进行彻底的清理。打开终端执行以下清理命令。请注意这会删除所有现有的Docker数据包括镜像和容器请确保你已经备份或不需要它们。# 停止所有正在运行的Docker服务 sudo systemctl stop docker docker.socket containerd # 卸载旧版本的Docker引擎及相关包 sudo apt-get remove docker docker-engine docker.io containerd runc -y # 清理残留的文件和目录 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd注意/var/lib/docker是Docker默认存储镜像、容器、卷和网络配置的地方删除它意味着所有本地数据丢失。对于全新安装这是最干净的做法。2.2 依赖安装与仓库配置清理干净后我们需要安装一些必要的工具并添加Docker的官方APT软件源这样才能指定安装20.10.24版本。首先更新系统包索引并安装依赖sudo apt-get update sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release接下来添加Docker的官方GPG密钥和APT仓库。这里有个细节Docker的仓库地址在国内直接访问可能较慢我们可以使用国内镜像源来加速例如阿里云或中科大的镜像。以下命令添加的是官方源如果你需要换源只需将download.docker.com替换为对应的镜像地址即可。# 添加Docker官方的GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 添加稳定的APT仓库以x86_64/amd64架构的Ubuntu为例请根据你的系统调整 echo \ deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null添加仓库后再次更新APT包列表让系统识别出新加的Docker源sudo apt-get update3. 指定版本安装与验证完成仓库配置后我们就可以精确安装Docker 20.10.24了。APT允许我们指定完整的版本字符串进行安装。3.1 精确安装Docker Engine 20.10.24首先查看一下仓库中可用的Docker版本确认20.10.24确实存在apt-cache madison docker-ce | grep 20.10.24你应该能看到类似docker-ce | 20.10.24~3-0~ubuntu-focal | https://download.docker.com/linux/ubuntu focal/stable amd64 Packages的输出。接下来执行安装命令sudo apt-get install -y docker-ce5:20.10.24~3-0~ubuntu-focal docker-ce-cli5:20.10.24~3-0~ubuntu-focal containerd.io命令解析docker-ceDocker引擎社区版的核心包。docker-ce-cliDocker命令行工具我们用的docker命令就来自这里。containerd.io一个负责容器生命周期管理的守护进程Docker Engine依赖于它。5:20.10.24~3-0~ubuntu-focal这是完整的版本号。5:是epoch20.10.24是主版本~3-0是修订版本ubuntu-focal指明了适用的Ubuntu发行版代号。安装时必须保持这三个包的版本一致否则可能引发依赖冲突。安装过程中APT会自动处理依赖关系。安装完成后Docker服务docker.service应该已经自动启动并设置了开机自启。但我们最好手动验证一下。3.2 安装验证与基础测试验证安装是否成功最直接的方法是检查Docker引擎的版本并运行一个测试容器。检查版本docker --version如果安装成功你会看到Docker version 20.10.24, build xxxxxxx的输出。检查服务状态sudo systemctl status docker这个命令会显示Docker服务的详细状态确保它是active (running)。运行经典测试容器sudo docker run hello-world这个命令会从Docker Hub拉取一个极小的hello-world镜像并运行一个容器。如果一切正常你会在终端看到一段欢迎信息以及“Hello from Docker!”等字样。这证明Docker引擎、容器运行时和网络都工作正常。实操心得第一次运行docker run命令时如果遇到权限错误Got permission denied while trying to connect to the Docker daemon socket这是正常现象因为Docker守护进程默认只允许root用户和docker用户组的成员访问。我们接下来就解决它。4. 生产级配置与优化基础安装完成只是第一步。要让Docker好用、安全尤其是用于生产或开发环境必须进行一些关键配置。4.1 管理用户权限与组为了避免每次使用docker命令都要加sudo我们需要将当前用户添加到docker用户组。# 将当前用户加入docker组 sudo usermod -aG docker $USER重要提示执行此命令后必须完全注销当前用户会话然后重新登录或者打开一个新的终端窗口用户组的变更才会生效。之后你就可以直接使用docker命令而无需sudo了。警告将用户加入docker组等同于授予该用户root权限因为Docker守护进程是以root身份运行的。在多人使用的系统或生产服务器上请谨慎操作仅将必要用户加入该组。4.2 配置国内镜像加速器从Docker Hub拉取镜像的速度在国内可能很不理想。配置一个国内镜像加速器可以极大提升镜像下载速度。这里以阿里云镜像加速器为例你需要先注册阿里云账号进入容器镜像服务获取专属加速器地址。编辑或创建Docker的守护进程配置文件sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://your-mirror.mirror.aliyuncs.com], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, data-root: /var/lib/docker } EOF配置解析registry-mirrors将your-mirror.mirror.aliyuncs.com替换为你从阿里云控制台获得的实际加速器地址。你也可以添加多个镜像源用逗号分隔。exec-opts: 设置cgroup驱动为systemd这对于使用systemd作为初始化系统的Linux发行版如Ubuntu 16.04 CentOS 7是推荐配置能提高系统稳定性。log-driver和log-opts配置Docker守护进程的日志驱动为json-file并限制单个日志文件最大100MB最多保留3个文件防止日志无限膨胀占满磁盘。>sudo systemctl daemon-reload sudo systemctl restart docker重启后可以用docker info命令查看在输出结果中如果能找到你配置的镜像加速器地址说明配置成功。4.3 内核参数调优与存储驱动对于生产环境可能还需要调整一些Linux内核参数以优化容器性能。编辑/etc/sysctl.conf文件添加或修改以下行# 避免“IPv4转发被禁用”导致容器网络问题 net.ipv4.ip_forward 1 # 提高容器连接端口的范围 net.ipv4.ip_local_port_range 1024 65000 # 提高系统最大文件描述符数量 fs.file-max 65536保存后执行sudo sysctl -p使配置立即生效。关于存储驱动Docker 20.10.24在主流Linux发行版上默认使用overlay2它性能良好且稳定通常无需更改。你可以通过docker info | grep Storage来确认。5. 安装后常见问题深度排查即使按照步骤操作你也可能会遇到一些问题。这里我总结几个最常见的坑及其解决方案。5.1 问题一Docker服务启动失败症状执行sudo systemctl status docker显示状态为failed或inactive查看日志sudo journalctl -xu docker发现有错误信息。常见原因与解决与旧版本冲突这是最常见的原因。确保你已经按照2.1节的步骤彻底清除了旧版本。特别是检查/var/lib/docker和/var/lib/containerd是否被残留文件占用。cgroup驱动不匹配如果系统日志中出现cgroup driver相关的警告。请确认你在/etc/docker/daemon.json中正确配置了“native.cgroupdriversystemd”并且重启了Docker。内核模块缺失Docker需要overlay等内核模块。运行lsmod | grep overlay检查。如果没输出尝试加载sudo modprobe overlay。如果模块不存在可能需要更新内核。5.2 问题二docker pull或docker run速度极慢或失败症状拉取镜像时卡住不动或出现网络超时错误。排查步骤检查镜像加速器配置首先确认/etc/docker/daemon.json中的registry-mirrors地址是否正确无误并且重启了Docker服务。可以用docker info验证。测试网络连通性尝试ping一下你的镜像加速器域名看是否能通。更换镜像源如果一个加速器不稳定可以尝试换用其他国内源如中科大(https://docker.mirrors.ustc.edu.cn)或网易(https://hub-mirror.c.163.com)。检查DNS有时是DNS解析问题。可以编辑/etc/docker/daemon.json在registry-mirrors同级添加DNS配置“dns”: [“8.8.8.8”, “114.114.114.114”]然后重启Docker。5.3 问题三容器内无法解析域名症状容器能ping通IP地址但ping不通域名如www.baidu.com。原因这通常是容器内部的DNS配置问题。Docker默认会使用宿主机的/etc/resolv.conf文件作为容器的DNS配置。如果宿主机这个文件有问题例如指向一个容器内无法访问的DNS服务器就会出问题。解决方案临时解决运行容器时指定DNS服务器例如docker run --dns 8.8.8.8 -it ubuntu bash。永久解决修改Docker守护进程的默认DNS配置。在/etc/docker/daemon.json中添加{ “dns”: [“8.8.8.8”, “223.5.5.5”] }然后重启Docker。这样所有新创建的容器都会默认使用这些DNS服务器。5.4 问题四磁盘空间不足症状拉取镜像或创建容器时提示no space left on device。分析与解决Docker默认将所有数据镜像、容器、卷、构建缓存存储在/var/lib/docker。随着使用这个目录会变得非常大。查看磁盘使用使用docker system df命令可以清晰看到Docker各类型资源镜像、容器、本地卷、构建缓存的磁盘占用情况。清理无用资源docker image prune删除所有悬虚镜像没有被任何容器引用的镜像层。docker image prune -a删除所有未被任何容器使用的镜像危险会删除所有未被运行的容器直接引用的镜像。docker system prune一键清理所有未使用的镜像、容器、卷和网络。执行前请确认它会删除所有停止的容器、所有未被使用的网络、所有悬虚镜像和构建缓存。可以加上-a参数连未被容器引用的镜像也删除。迁移数据目录如果/var分区本身空间不足可以考虑将Docker的数据根目录迁移到更大的磁盘分区。这需要停止Docker服务移动整个/var/lib/docker目录然后在/etc/docker/daemon.json中修改>