尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

一键搞定Docker安装:自动化脚本设计与实战指南

一键搞定Docker安装:自动化脚本设计与实战指南 简介一套面向离线或内网环境的Docker一键安装包定位服务于需要快速部署容器运行环境的运维人员与开发者适合有一定Linux基础的使用者直接参考其目的在于免除逐一下载二进制、手工配置服务与依赖的繁琐工作。压缩包共8个文件整体大小74.54MB主要包含系统服务文件、配置文件、二进制压缩包、套接字文件以及安装脚本其中覆盖了Docker 19.03.15运行核心与Docker Compose 1.24.1组件并配有systemd服务管理和常用内核参数配置目录结构清晰便于按需取用。脚本执行后会自动完成基础环境准备、服务注册、内存与文件描述符限制调整等关键步骤同时保留核心服务配置便于二次修改和排错遇到问题时可快速核对相关服务与参数文件。已有512人学习下载比较适合离线部署或搭建实验环境时直接使用也可作为学习容器平台初始化过程的参考样本或改造后嵌入自动化运维流程。 早在还没多少人认真对待容器化的时候我就被一个问题反复折磨明明照着教程一步步装 Docker为什么别人一次过我这边不是权限报错就是镜像拉不下来要么引擎起不来卡在 starting 半天。后来帮团队和身边朋友装了太多环境干脆把整个流程收敛成一个 docker一键安装包把从环境检测、安装、镜像加速到常用容器编排的活儿一股脑自动化掉。这篇就把当时的设计思路、脚本逻辑、完整使用流程和典型的坑全部拆开讲清楚给还在手动折腾的人一条能直接走近道的路线。1. 为什么要做这个一键安装包1.1 先别急着敲命令得先搞清楚痛点在哪很多人一上来就想着装 Docker但实际动手时真正的痛点往往不是“安装”本身而是安装前和安装后的那些破事。核心痛点集中在三个层面第一个层面是前置条件不满足。Windows 要开虚拟化Linux 要处理内核模块和软件源老版本系统还要额外升级依赖。很多人根本没意识到自己卡在这一步以为装了软件就是完事。第二个层面是网络环境不稳定。默认的 Docker Hub 镜像站在国内环境下动不动就超时拉一个 mysql 镜像能等十分钟甚至直接失败。第三个层面是权限和配置问题。装完之后 docker ps 一下结果 permission denied连不上 docker daemon这时候小白基本就懵了。所以这个一键安装包的目标很明确把前置检测、静默修复、安装、镜像加速配置、基础验证全部串成一条龙让使用者不用懂底层细节跑完脚本就拿到一个能直接用的 Docker 环境。做这件事的核心原则是让脚本解决环境差异让用户把精力留给业务。1.2 不同系统平台上安装 Docker 的差异到底有多大把 Linux主要是 Ubuntu / CentOS 系和 Windows 放一起对比差异是天上地下。Linux 下安装相对直接但要注意发行版的软件源管理方式不同。Ubuntu 走 aptCentOS 走 yum/dnf脚本里必须做发行版检测。另外一个隐藏问题如果机器上之前装过旧版 Docker比如早期叫 docker.io 或 docker-engine 的老古董不卸载干净就直接装新的大概率会出现版本冲突、服务起不来这类诡异问题。Windows 这边的情况更复杂。Docker Desktop 依赖 WSL2 或者 Hyper-V而这两者要求 Windows 10 2004 以上或 Windows 11。很多人会遇到 Docker Desktop 启动失败提示 virtualisation support wasnt detected根本原因是 BIOS 里的虚拟化开关没打开或者 Windows 功能里的虚拟机平台没启用。一键安装包的处理思路是把这些检测逻辑全部内置遇到问题直接给出明确提示而不是让用户面对一堆看不懂的英文报错。能自动修的比如开启 Windows 功能、配置 WSL2 内核脚本直接修修不了的比如 BIOS 虚拟化开关给出清晰的操作指引。2. 一键安装包的结构与设计思路2.1 脚本里到底装了什么跑起来之后干了哪些事整个安装包本身是一个 shell 脚本Linux 下和一套批处理 PowerShell 组合Windows 下核心做了六件事第一环境检测。检测当前系统版本、架构x86_64 / arm64、是否已安装 Docker、是否满足前置依赖。第二旧版本清理。如果发现老的 docker 包自动卸载并清理残留文件。第三基础依赖安装。比如 Linux 下需要 ca-certificates、curl、gnupg、lsb-release 这些工具。第四安装 Docker 引擎。使用官方源或镜像源添加 apt/yum 仓库然后 install docker-ce、docker-ce-cli、containerd.io。第五镜像加速配置。写 /etc/docker/daemon.json填入可用的公共镜像加速地址。第六权限和自启动设置。把当前用户加入 docker 组设置 systemctl enable docker避免每次开机手动启动。Windows 下逻辑类似但实现方式换成 PowerShell 脚本步骤是检查 Windows 版本启用 WSL 功能下载并安装 WSL2 内核下载 Docker Desktop 安装器并静默安装配置镜像加速。2.2 为什么要把镜像加速内置放进脚本里这是我踩坑踩得最惨的部分。早期帮人装完 Docker对方过两天又跑来说拉镜像很慢一开始我还以为是网络波动后来发现默认 Docker Hub 在国内就是慢到无法接受。docker pull mysql:8.0卡在等待层数据能等半小时最后超时失败。解决方案是给 Docker 配置 registry mirror。原理很简单Docker daemon 拉镜像时可以走配置的镜像加速地址这些地址缓存了大量公共镜像速度提升非常明显。具体写法是在 /etc/docker/daemon.json 里加一行{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com, https://docker.nju.edu.cn ] }不同加速地址的可用性和速度会随时间变化所以脚本里做了容错配置多个地址避免单点失效。写完后执行 systemctl daemon-reload systemctl restart docker 让配置生效。这一步必须做很多人在网上看到配置方法改完不重启 daemon结果毫无变化。2.3 脚本设计上比较重要的几个细节写这类一键脚本我最重视的是“失败后能快速定位问题”。每跑完一步就输出明确状态标记比如 [OK] 或者 [FAIL]一旦出错能在终端上直接看到卡在哪一步。这比一个闷头跑完然后告诉你“成功”的脚本要实用得多。另外脚本一定要支持重复执行。用户跑了一次失败修复完环境问题比如打开了 BIOS 虚拟化开关后还要能再跑第二次这就需要脚本里每个步骤都做幂等处理检测到组件已安装就跳过检测到服务已运行就不重复重启。这其实是一种十分常规但很多人容易忽略的工程化思路——环境修复本来就是反复试错的过程如果脚本不支持重跑用户每次都从零开始那种挫败感很容易消磨耐心。更进一步脚本里还设计了日志输出。把整个安装过程写入 /tmp/docker-install.log方便事后排查。这个习惯帮了我不少忙——很多用户说“脚本跑失败了你看看”直接把日志要过来一看就知道问题在哪省掉大量反复沟通成本。3. 完整实操从下载到跑通第一个容器3.1 一套标准的 Linux 一键安装流程以 Ubuntu 22.04 为例标准使用流程是这样的先下载脚本然后赋予执行权限最后用 sudo 执行。给一段可参考的脚本片段展示代码的逻辑骨架#!/bin/bash set -e # 检测是 apt 还是 yum if [ -x $(command -v apt-get) ]; then PKG_MANAGERapt-get update_cmdapt-get update install_cmdapt-get install -y elif [ -x $(command -v yum) ]; then PKG_MANAGERyum update_cmdyum makecache install_cmdyum install -y else echo 不支持的包管理器 exit 1 fi $update_cmd $install_cmd ca-certificates curl gnupg lsb-release # 安装 docker 官方源 install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg chmod ar /etc/apt/keyrings/docker.gpg echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | tee /etc/apt/sources.list.d/docker.list /dev/null $update_cmd $install_cmd docker-ce docker-ce-cli containerd.io docker-compose-plugin # 配置镜像加速 mkdir -p /etc/docker cat /etc/docker/daemon.json EOF { registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com ] } EOF systemctl daemon-reload systemctl restart docker systemctl enable docker # 当前用户加入 docker 组 usermod -aG docker $SUDO_USER || true docker version docker run hello-world这里有个值得特别说明的点hello-world 这一行千万不能省。跑一次 docker run hello-world 是验证整个链路是否通的最快方式——daemon 能起来、镜像能拉取、容器能执行。如果这行输出正常基本说明安装成功如果卡在拉镜像说明加速配置没生效如果直接权限报错说明 docker 组没加上或者要重新登录。3.2 Windows 上的一键安装流程Windows 下的安装脚本逻辑上是这样的检查系统版本方案是必须满足 Windows 10 2004 或更高版本否则直接提示升级系统。启用 Windows 功能VirtualMachinePlatform 和 Microsoft-Windows-Subsystem-Linux。安装 WSL2 内核更新包。设置 wsl --set-default-version 2。静默安装 Docker Desktopinstaller.exe install --quiet --accept-license。配置 Docker Desktop 的镜像加速脚本直接写 daemon.json 并重启 Docker Desktop。整个过程大约需要十五到二十分钟取决于网络速度。装完后打开 Docker Desktop左下角显示绿色 Engine running 就表示正常。这里遇到最常见的失败就是开头热词里的那个报错Docker Desktop failed to start because virtualisation support wasnt detected。多数情况是 BIOS 里 Intel VT-x 或 AMD SVM 没开启。开机按 Del/F2 进 BIOS找到 Advanced / CPU Configuration把 virtualization 相关选项改成 Enabled保存重启就好了。如果 BIOS 开了还报错那就是 Windows 的 Hyper-V 或虚拟机平台功能没生效脚本里执行 Enable-WindowsOptionalFeature 能解决大部分情况。3.3 装完后顺手把 MySQL 和 Redis 跑了Docker 装完不跑点实际的东西总觉得没落地所以我通常会在脚本最后加一个可选的“常用中间件安装”步骤把最常用的 MySQL 8.0 和 Redis 用一条命令拉起来# MySQL 8.0 docker run -d --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDroot123 \ -v /data/mysql:/var/lib/mysql \ mysql:8.0 # Redis docker run -d --name redis \ -p 6379:6379 \ -v /data/redis:/data \ redis:7 redis-server --appendonly yes这里有个细节一定要用 -v 把数据目录挂载到宿主机。如果不做挂载容器一删数据库数据就全没了。很多新手踩了这个坑以为数据在 Docker 里能一直活着实际上容器是无状态的。挂载之后无论怎么重建容器数据都安全地留在宿主机上。跑起来之后验证一下MySQL 用 mysql -h127.0.0.1 -uroot -proot123 看能不能连上Redis 用 redis-cli ping 看有没有响应 PONG。能通就算完整闭环了。4. 高频问题排查实录4.1 Docker 服务启动失败或一直 starting服务启动失败在 Linux 下最常见的两个原因一个是 daemon.json 写错了导致 Docker 无法启动另一个是系统防火墙或内核模块的问题。检查方法是先看服务状态systemctl status docker journalctl -u docker -n 50如果日志里显示 failed to start daemon: Failed to load listeners多半是 daemon.json 里的配置格式错误。解决办法是把配置文件暂时移走再启动试试mv /etc/docker/daemon.json /etc/docker/daemon.json.bak systemctl restart docker能起来就说明问题出在配置上。Windows 下 Docker Desktop 一直 starting常见于 WSL2 内核没装或者版本不匹配。打开 PowerShell 执行 wsl --version如果提示 WSL 1 或者根本没输出说明环境没就绪重装 WSL2 内核基本能解决。4.2 权限问题permission denied while trying to connect to the Docker daemon这个问题出现频率极高尤其是刚安装完的时候。报错里往往带着 unix:///var/run/docker.sock。原因很简单当前用户不在 docker 用户组里而 docker.sock 的权限归 root 和 docker 组所有。解决办法在当前用户下执行sudo usermod -aG docker $USER newgrp docker注意执行完后要重新登录或者重启 shell 才能生效。如果你已经执行了 usermod 但 docker ps 还是报权限错误检查是不是加了 docker 组之后终端会话没刷新。用 exit 退出终端再重新进或者干脆重启一下这是最靠谱的。4.3 镜像下载一直超时或者慢到没法看这个问题就是镜像加速没配置好或者配置的加速地址失效了。有时候你会发现早上还好好的下午突然拉镜像又慢起来——因为公共加速服务的状态本身就不稳定。这也是我为脚本设计多个备选地址的原因。如果 docker pull 超时先检查加速配置是否生效docker info | grep -A 5 Registry Mirrors如果显示空列表说明没配上。手动写 daemon.json 后重启 Docker 再试。如果配了还是慢就把加速地址换一批。另外可以多用 docker pull 的具体版本号比如 mysql:8.0.33 替代 mysql:latestlatest 的镜像比较大而且没有缓存优化固定版本往往快得多。4.4 Docker Desktop 提示 Windows 版本不兼容Docker Desktop 4.26 及之后版本对系统版本有明确要求Windows 10 需要更新到 21H2 以上。遇到这个报错别挣扎直接 Windows Update 把系统升到最新。如果你的机器硬件太老无法升级可以考虑退回旧版 Docker Desktop但一般不建议安全性和兼容性都会有隐患。一个比较容易被忽略的点Docker Desktop 和 VMware Workstation 在 Windows 上默认会冲突。如果你电脑上装了 VMware需要把虚拟化引擎改成使用 Hyper-V否则 Docker Desktop 经常起不来或者 VMware 跑不了虚拟机。这类“隐性冲突”是 Windows 下最坑的地方。4.5 常见错误速查表报错信息根本原因快速解决方案permission denied while trying to connect to the Docker daemon用户不在 docker 组usermod -aG docker $USER 后重新登录Failed to start docker.servicedaemon.json 配置错误或端口冲突移走配置文件逐项检查配置项virtualisation support wasnt detectedBIOS 虚拟化未开启或 Hyper-V 未启用进 BIOS 开 VT-x/AMD SVM启用 Windows 功能weve detected that you have an incompatible version of windowsWindows 版本过低Windows Update 升级到 21H2image pull timeout镜像加速未配置或地址失效重新配置 daemon.json registry-mirrorsContainer 一直 Restarting容器内部进程启动失败docker logs 容器ID 查看日志5. 安装完整之后还能顺手扩展什么5.1 用 Docker Compose 把一整套服务编排起来单容器跑通只是入门实际项目里经常会用到服务编排。Docker Compose 允许用一份 YAML 文件定义多个容器、网络、卷、环境变量一条 docker compose up -d 全部拉起来。拿最常见的 LAMP 或 LNMP 环境举例写一个 docker-compose.ymlversion: 3 services: db: image: mysql:8.0 container_name: myapp-db restart: always environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: myapp volumes: - ./data/mysql:/var/lib/mysql ports: - 3306:3306 redis: image: redis:7 container_name: myapp-redis restart: always ports: - 6379:6379 volumes: - ./data/redis:/data然后在同一目录下执行 docker compose up -d两个服务就都起来了。用 docker compose ps 查看状态docker compose logs -f 跟踪日志。这套玩法比一行行 docker run 高效太多特别是要管理多个环境开发、测试、生产时一份 compose 文件 不同 .env 就能搞定。5.2 几个日常使用中比较实用的管理模式我收拾镜像和容器时最常用的几个命令# 查看所有容器含退出状态 docker ps -a # 进入正在运行的容器 docker exec -it 容器名 bash # 清理所有停止的容器、悬空镜像、未使用网络 docker system prune -a # 查看资源占用 docker stats另外强烈建议定期 docker system prune 清理无用的镜像和容器。开发阶段频繁拉镜像、构建、删除容器磁盘空间被占满的情况很常见这时候清理一下能释放大量空间。特别是 debug 用的临时镜像用完就该清掉。不过有两个小提醒一是清理前确认容器数据已经持久化挂载到宿主机否则一删容器数据就没了二是不建议用 docker rm -f $(docker ps -aq) 这种强制清理命令容易误删还在用的容器。老实说把一键安装包做到后来我最大的感触是真正磨人的不是“安装 Docker”本身而是那些散落在不同平台、不同版本、不同网络环境里的边角问题。脚本能解决一部分但更多时候要依赖对这种环境变化的熟悉程度。如果你是自己折腾着玩遇到问题建议先看日志docker 的日志比大多数软件都友好哪怕只看一眼 journalctl -u docker 的输出也胜过把网上教程从头翻到尾。如果你打算拿这个装包去帮助别人一定把日志输出保留住因为“脚本跑完不知道发生了什么”是比“脚本跑失败”更糟糕的体验。最后再分享一个我这套脚本里一直留着的小技巧在安装完成后自动输出一段“接下来你可以试这些命令”的提示把 docker ps、docker run hello-world、docker compose version 这些验证命令展示给用户。别小看这个细节它把用户从“装完了但不知道下一步干嘛”的状态里拉出来是提升安装体验特别有效的一步。本文还有配套的精品资源点击获取
返回列表