Docker一键安装实战:脚本逻辑、踩坑修复与镜像加速配置

Docker一键安装实战:脚本逻辑、踩坑修复与镜像加速配置 简介面向 Linux 运维工程师与开发者的 Docker 离线一键安装包基于 19.03.15 二进制版本并附带 docker-compose 1.24.1适合内网、无外网或需要快速部署容器运行环境的生产与实验场景。压缩包共 8 个文件核心是 Docker 二进制压缩包 tgz此外还包含 systemd 服务管理所需的 service 与 socket 单元文件、用于调整系统文件句柄限制的 limits.conf、网络内核参数调优的 sysctl.conf以及一键安装脚本 sh整体体积约 74.54MB。借助该安装包可避免手动逐一下载依赖、编写服务配置和修改系统参数的繁琐操作通过脚本自动完成 Docker 与 docker-compose 的安装注册并对服务启动、资源限制、网络转发等常见问题做预设处理适合从入门到生产部署的多种场景。资源发布后已有 512 人学习下载对于需要快速搭建开发环境、交付离线 Docker 方案的团队具有直接的参考价值。 上个月给一批新服务器搭环境我以为装Docker是很轻松的活。结果一台一台敲命令不是系统自带的Docker版本太老就是yum源里根本没有docker-ce包还有两台装到一半就卡在GPG key校验失败上。折腾到后半夜我才认认真真把docker一键安装包这几个字重新拾起来研究了一遍。这一篇我不打算只贴一条安装命令而是想把这几年在Linux服务器、Windows桌面环境上反复装Docker的经验合并起来讲清楚一键安装包到底帮你做了什么为什么它能省下那些乱七八糟的踩坑时间以及哪些情况下你依然需要手动调整。适合刚上手Docker的新手也适合需要在多台机器上快速铺环境的运维朋友。安装本身不是终点装完之后那些权限、镜像、服务状态的问题才是真正消耗时间的地方这一篇也一起讲。1. 为什么一键安装能成为刚需手动装Docker的踩坑实录很多人在第一次接触Docker时都会觉得不就是装个软件么然后直接拿起包管理器开装。但只要你在一台干净的Linux机器上试过一次就会明白事情没这么简单。1.1 包管理器装Docker的三个现实问题第一种常见操作是yum install docker或者apt install docker.io听起来很省事但实际用起来会撞上三个问题。第一个问题是版本太老。CentOS 7自带的docker是1.13版本这个版本对现代镜像的支持非常有限很多镜像的新特性、新的OCI标准、compose的兼容性都有问题。你装好之后去跑一个稍微新点的镜像很可能直接报格式错误。Ubuntu的情况好一点docker.io虽然能用但版本也明显滞后于官方docker-ce。第二个问题是官方仓库并没有默认接入系统源。你想装新版的docker-ce需要先手动添加Docker官方的yum/apt源。这一步看着简单实际做起来会碰到各种环境差异有的是gpg key没导入成功有的是网络原因导致源地址访问不了还有的是目标机器的系统版本太老导致源里找不到对应包。第三个问题是装完之后的服务配置。Docker安装完不是直接就能用的你得确认守护进程起来了、socket权限没问题、开机自启设置好。这些步骤零零碎碎任何一步漏了都会在你后续跑容器的时候突然炸出来。1.2 一键安装包的安全顾虑能用但要分清来源有人一听一键安装就担心安全这个顾虑本身是合理的。但真正的问题不是脚本这个形式而是脚本来源和脚本内容。以官方提供的get.docker.com脚本为例它本质上就是一个把上面那些繁琐步骤自动化处理的shell脚本。你完全可以在执行前先下载下来打开看一眼它到底做了什么——检测发行版、配置软件源、安装docker-ce、启动服务、设置开机自启。逻辑很透明不存在暗箱操作。社区里还有一些个人维护的安装脚本我的建议是要谨慎。我见过有人为了图方便直接复制网上搜来的不明脚本执行结果装了一堆自己都不知道的定时任务进去。所以我的原则很简单要么用官方脚本要么用大型云厂商维护的开源脚本并且执行前先把脚本内容读一遍。这不费多少时间却能把风险控制在可接受范围内。2. 官方get.docker.com脚本的执行逻辑与换源改装官方Docker安装脚本是使用最广泛的一键安装方案。你只需要执行一条命令剩下的源配置、依赖安装、服务启动它全给你办了。2.1 官方脚本在CentOS 7与Ubuntu上的行为差异官方脚本的基本用法是curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun这条命令里最容易被忽略的是--mirror Aliyun参数。默认情况下脚本会从Docker官方源拉取软件包国内服务器访问这个源的速度很不稳定。加上这个参数后脚本会改用阿里云镜像源下载docker-ce安装速度会有非常明显的提升。脚本在CentOS 7和Ubuntu上的具体行为其实不太一样判断逻辑都是内置好的。比如在CentOS 7上它会先检查系统里是否已经装了旧版docker如果装了会提示你手动移除然后配置yum源、安装docker-ce、containerd.io等组件。在Ubuntu上则是处理apt源和签名key。CentOS 7还有一个比较特殊的情况系统自带的旧版docker包名是docker新版的docker-ce需要从docker-ce源里安装。如果你之前用yum install docker装过旧版一定要先卸载掉再跑脚本否则两个版本会互相冲突服务都起不来。2.2 指定Docker版本与离线场景的改装思路官方脚本默认安装的是当前最新稳定版。生产环境里我一般不建议盲目用最新版因为团队里其他服务器的版本可能还是旧的Docker API和集群兼容性需要保持一致。装完之后再锁定版本的思路要更稳妥一些。比如在CentOS上你可以先列出可用版本yum list docker-ce --showduplicates | sort -r然后通过脚本安装完成后再手动指定一个版本重新安装yum install docker-ce-20.10.23-3.el7 docker-ce-cli-20.10.23-3.el7 containerd.io还有一种稍微复杂但很实用的场景是离线安装。内网环境访问不了外网get.docker.com的脚本根本跑不通。这种时候我的做法是找一台能联网的同系统机器用官方脚本装好Docker之后把缓存目录下的rpm包或者deb包全量拷贝到内网机器上再用rpm -ivh或dpkg -i手动安装。虽然麻烦但业务临时要上线的时候这种离线一键包往往比临时在服务器上折腾源更高效。3. 安装完成后必须做的三项检查权限、守护进程与连通性脚本跑完Docker就真的装好了吗我的经验是脚本装完只是第一步真正要确认的是接下来这三件事。3.1 docker.sock权限问题的根因与修复几乎每个新手都会踩到这个经典报错permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock这个报错出现的原因很简单Docker守护进程的socket文件默认只有root用户和docker用户组有权限访问。你当前用户如果不在docker用户组里执行docker命令时就会被拒绝。修复方式是把当前用户加进docker组然后重新登录一次sudo usermod -aG docker $USER sudo systemctl restart docker这里有个坑执行完usermod之后如果你不重新登录系统当前shell会话里权限是不会立即生效的。很多人在这一步卡住是因为用su切换用户或者直接重启终端其实只需要正常注销再登录一次。验证是否成功直接执行docker ps看是否还报权限错误。3.2 docker run hello-world失败的三种常见误导权限搞定之后很多人会跑docker run hello-world来验证安装是否成功。这个思路是对的但要注意这个测试拉取的是Docker Hub上的镜像它的成败不只取决于Docker安装本身还取决于网络。如果镜像拉取失败不要急着怀疑安装有问题。先看报错信息如果是timeout或连接重置那基本上就是网络对Docker Hub的访问有问题如果报的是manifest相关错误那可能是镜像仓库反正回了异常响应通常换一台机器或者重新拉一次就好了。还有一种情况是执行docker version的时候客户端有输出但服务器端显示Cannot connect to the Docker daemon。这说明守护进程根本没起来或者起了一半崩了。这时候第一时间看日志journalctl -u docker --no-pager -n 50很常见的导致服务启动失败的原因包括老版本系统的cgroup配置和Docker新版不兼容、SELinux拦截、存储驱动路径异常。日志里都会有明确的报错提示按提示逐条排查就好。4. 镜像下载慢的根源与registry-mirrors加速配置装好Docker之后挡在很多人面前的第一道坎不是命令不会用而是拉镜像慢到怀疑人生。这不是Docker本身的问题而是Docker Hub在国内的访问链路比较长、速度不太稳定。4.1 daemon.json配置格式与多配置合并问题解决这个问题的常规做法是给Docker配置镜像加速器。原理也很直白docker pull的时候守护进程会优先从配置的registry-mirrors拉取镜像拉不到再去Docker Hub找。配置文件在/etc/docker/daemon.json如果这个文件不存在就手动创建。我自己的配置一般长这样{ registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com, https://mirror.ccs.tencentyun.com ], log-driver: json-file, log-opts: { max-size: 50m, max-file: 3 } }这里有一个非常容易踩的坑如果daemon.json文件你已经用在了其他配置上比如配置了私有仓库地址、存储驱动、日志策略那必须在原有内容基础上把registry-mirrors加进去而不是直接覆盖。我在真实环境里见过同事把原本配置好的私有仓库地址给覆盖没了导致后面推送镜像全部报错。阿里云还给每个注册用户提供专属加速地址格式是https://xxxx.mirror.aliyuncs.com需要在控制台里人工申请这个地址的稳定性和速度通常比公共加速器更可靠。具体地址以你自己的阿里云控制台显示为准。配置完以后要重启守护进程才会生效systemctl daemon-reload systemctl restart docker4.2 加速器配置后的实测对比与应急手段配置加速器之前我在一台云服务器上拉取mysql:8.0镜像有时候要等七八分钟甚至超时。配置完之后同样的镜像通常一两分钟就能拉完差异非常明显。如果你拉的是一些常用的中间件镜像比如redis、nginx、tomcat加速效果会更明显因为这些镜像在加速器上的命中率很高。万一换了加速器还是慢我还有一种应急手段找一台在Docker Hub访问速度正常的机器先把镜像拉下来再用docker save导出成tar包传到目标机器上用docker load导入。这种做法在批量部署的时候尤其好用一台机器拉一次就能给整个集群用。相比在每台机器上反复拉取效率高得多。5. Docker Desktop的伪一键WSL2与虚拟化检测报错的排查顺序如果把话题从Linux转到Windows事情会变得更有意思。很多人在Windows上装Docker用的不是脚本而是Docker Desktop。它看起来是个正儿八经的一键安装包双击安装包、下一步、下一步就完了。但它比Linux脚本复杂得多因为它后台依赖WSL2或者Hyper-V。5.1 virtualisation support wasnt detected的真实含义Windows上最常见的一个报错是Docker Desktop failed to start because virtualisation support wasnt detected这个报错的意思是Docker Desktop需要调用系统虚拟化能力但这个能力没有被正确启动。它不是Docker本身坏了而是宿主系统的虚拟化环境有问题。排查顺序我总结过一套按这个顺序基本能覆盖绝大多数情况第一步检查BIOS/UEFI里的虚拟化开关。Intel的VT-x或者AMD的SVM必须处于开启状态。很多品牌机出厂默认是关的需要在开机时进入固件设置里把Intel Virtualization Technology这个选项改成Enabled。第二步确认Windows功能是否完整。打开控制面板-程序和功能-启用或关闭Windows功能保证虚拟机平台和适用于Linux的Windows子系统这两个选项都勾上了。勾上之后系统会提示重启一定不要跳过。第三步更新WSL2内核。终端里执行wsl --update把WSL2内核更新到最新版本。这一步是我见过被忽略最多的很多人BIOS也开了、Windows功能也开了但就是启动失败一查WSL2内核还是老的。第四步检查Windows系统版本。新版本的Docker Desktop对Windows版本有硬性要求太老的Windows 10版本会直接弹出incompatible version of Windows这类提示根本不允许安装。这种时候要么升级系统要么找旧版Docker Desktop安装包再配合手动配置WSL2环境。5.2 WSL2后端的内存占用与存储路径迁移Docker Desktop装好之后默认使用WSL2作为后端这意味着Docker的虚拟机镜像和容器数据都存在WSL2的虚拟磁盘文件里。用了一段时间之后你会发现C盘空间莫名其妙少了几十个G这就是虚拟磁盘膨胀导致的。解决思路有两个。第一个是给Docker Desktop配置资源上限在Settings里面把内存占用、CPU核数、Swap大小都调到一个合理范围别让它无限制使用宿主机资源。第二个是手动修改虚拟磁盘的存储路径把ext4.vhdx文件迁移到空间更大的盘上这样可以避免C盘被塞爆。我的建议是如果只是学习体验Docker Desktop完全够用如果是要跑生产环境或者说要长期稳定地跑容器服务直接在Linux服务器上用脚本安装才是正路资源开销、稳定性、可维护性都更可控。6. 给还在纠结一键还是手动的人几句实在话回到这篇文章的标题我实际用下来的感受是一键安装包不是银弹但它确实把安装过程中最烦人的重复劳动全部替代了。你不需要再背那些gpg key的导入步骤不需要记各种发行版对应的源地址也不需要担心漏掉哪一项服务初始化。它帮你省下来的时间应该花在更重要的地方——理解Docker的存储驱动、网络模型、数据卷挂载方式这些才是真正决定你后续用得好不好的东西。一个小小的建议不管是在一台机器还是多台机器上装Docker装完之后先别急着跑业务容器花五分钟把docker info的输出认认真真看一遍确认存储驱动是overlay2、Cgroup版本正常、镜像加速器配置已生效。这五分钟能帮你提前避开很多后续才会冒出来的问题。我自己就是因为第一次装完直接跑服务后来排查存储驱动不兼容的问题绕了整整一天弯路。本文还有配套的精品资源点击获取