ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Linux系统最新版Docker安装与配置全流程指南

Linux系统最新版Docker安装与配置全流程指南 1. 项目概述为什么需要一篇“最新版”Docker安装指南如果你在Linux上折腾过Docker大概率遇到过这样的场景兴冲冲地打开官方文档照着步骤一路敲命令结果在某个环节卡住报错信息看得一头雾水。或者你从某个博客教程里复制粘贴了一串命令安装倒是成功了但版本号一看还是两三年前的旧版一些新功能、性能优化和安全补丁都与你无缘。更别提不同Linux发行版Ubuntu, CentOS, Debian等的安装命令和依赖库天差地别一个教程很难通吃。这就是我写这篇教程的初衷。它不仅仅是一份命令清单而是一个基于我多年在开发、运维和生产环境中反复实践、踩坑、优化后总结出的“完整工作流”。所谓“完整”意味着它覆盖了从系统准备、仓库配置、版本选择、安装验证到后续优化和常见问题排查的全过程。而“最新版”则代表我们摒弃了那些陈旧的、通过curl -sSL https://get.docker.com/ | sh一键脚本它可能安装非官方仓库的版本转而采用Docker官方推荐的、通过配置APT或YUM仓库来安装的方式。这种方式不仅能确保你安装的是经过Docker官方测试和签名的、最新的稳定版Stable或测试版Edge还能让你在未来通过系统的包管理器apt或yum无缝、安全地升级Docker。所以无论你是刚接触容器技术的开发者还是需要为团队搭建统一开发环境的运维工程师甚至是自己在家用Linux服务器上折腾点好玩项目的极客这篇教程都将为你提供一个可靠、可复现、且面向未来的Docker安装方案。请准备好你的Linux终端我们这就开始。2. 核心思路与方案选型为什么不用一键脚本在开始动手之前我们先花点时间厘清思路。安装Docker网络上最常见的方法是使用官方提供的一键安装脚本。这个命令看起来非常诱人curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh。简单、粗暴、似乎能解决所有问题。但作为一名有追求的从业者我强烈建议你放弃这种方法原因有三。第一缺乏透明度和可控性。当你把sudo权限交给一个从网络下载并直接执行的脚本时你实际上放弃了对安装过程的控制。这个脚本具体做了什么它添加了哪些第三方仓库修改了哪些系统配置安装了哪些额外的、你可能不需要的包在出现问题需要回滚或排查时你会非常被动。而通过手动配置官方仓库的方式每一步操作都是你自己执行的清晰可见易于管理和审计。第二版本和来源可能不理想。一键脚本为了追求最大的兼容性有时会选择某个Linux发行版默认仓库中的Docker版本或者某个较旧的、广泛测试的版本。这可能导致你无法第一时间用上Docker的最新特性比如BuildKit的并行构建、cgroup v2支持、更快的容器启动速度等和重要的安全更新。我们的目标是“最新稳定版”这就需要直接对接Docker官方的发行版仓库。第三不利于后续维护。通过系统包管理器APT/YUM/DNF安装的软件其最大优势在于依赖关系管理和无缝升级。配置好官方仓库后你未来只需要运行sudo apt update sudo apt upgrade或sudo yum updateDocker引擎及其相关组件如Docker Compose就会随着系统其他软件一起更新到最新版本安全又省心。而通过脚本或其他方式安装的二进制包往往需要手动重复安装流程。因此本教程选择的方案是为你的Linux系统添加Docker官方APT/YUM仓库然后通过系统的包管理器进行安装。这是Docker官方文档首推的、最适合生产环境的方法。接下来我们将根据不同的主流Linux发行版详细拆解每一步操作。3. 系统准备与依赖检查在添加仓库和安装之前我们需要确保系统处于一个“干净”且“就绪”的状态。这个步骤常常被忽略但却是避免后续各种诡异错误的关键。3.1 清理旧版本Docker如果你的系统上曾经以任何方式安装过Docker或它的前身docker.io、docker-engine第一步就是彻底清除它们。不同版本的Docker文件路径、服务名称可能冲突残留的配置和镜像数据有时也会引发问题。对于基于Debian/Ubuntu的系统sudo apt-get remove docker docker-engine docker.io containerd runc注意这条命令可能不会删除镜像、容器、卷和网络配置文件它们通常保存在/var/lib/docker/目录下。如果你想得到一个完全干净的环境比如用于测试或排错可以手动删除这个目录sudo rm -rf /var/lib/docker。但在生产环境或存有重要数据的开发机上请务必谨慎操作删除前做好备份。对于基于RHEL/CentOS/Fedora的系统sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine同样/var/lib/docker目录下的数据需要单独处理。3.2 安装基础依赖工具为了能够添加HTTPS仓库并使用apt或yum进行安装我们需要确保一些基础工具已就位。Ubuntu/Debian:sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-releaseca-certificates: 用于验证HTTPS连接的安全性。curl: 用于从网络下载文件如GPG密钥。gnupg: GNU隐私卫士用于管理GPG密钥验证仓库签名。lsb-release: 一个工具可以方便地获取LSBLinux标准基础和发行版的具体信息我们常用它来获取系统代号如focal、jammy。CentOS/RHEL/Fedora:对于较新的CentOS 8/RHEL 8/Fedora默认使用dnf包管理器它已经包含了所需的基本功能。但为了兼容性和确保工具存在可以安装sudo yum install -y yum-utilsyum-utils是一个工具集其中包含yum-config-manager这是我们后面添加仓库所必需的工具。实操心得很多教程会跳过依赖检查假设你的系统是“纯净”的。但在实际环境中特别是云服务器或使用了很久的本地机器很可能缺少某个小工具。先执行这一步能避免在添加仓库时遇到“命令未找到”这类低级但令人沮丧的错误。4. 添加Docker官方软件仓库这是整个安装过程的核心步骤也是确保我们能获取到官方最新版软件包的关键。Docker为不同的发行版维护了独立的仓库我们需要添加正确的仓库地址。4.1 添加Docker的GPG公钥软件包管理器APT/YUM通过GPG密钥来验证从仓库下载的软件包的完整性和真实性防止被篡改。我们必须先添加Docker官方的GPG密钥。通用方法推荐适用于大多数系统sudo mkdir -p /etc/apt/keyrings # 为Ubuntu/Debian创建密钥环目录-p确保目录不存在时创建 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg对于CentOS/RHEL密钥的添加方式略有不同通常yum会在添加仓库时自动处理密钥但为了确保一致也可以手动添加sudo rpm --import https://download.docker.com/linux/centos/gpg关键参数解析-fsSL: 这是curl命令的一组常用参数。-f:--fail静默失败在服务器错误时无输出。-s:--silent静默模式不显示进度或错误信息。-S:--show-error与-s配合在失败时显示错误。-L:--location如果请求的页面发生了跳转curl会自动跟随跳转。gpg --dearmor: GPG密钥通常以ASCII格式分发而APT需要二进制格式。--dearmor或-d命令就是将ASCII格式的密钥转换为二进制格式。4.2 配置APT仓库Ubuntu/Debian首先我们需要确定系统的发行版代号。使用lsb_release -cs命令它会输出类似focalUbuntu 20.04、jammyUbuntu 22.04或bullseyeDebian 11的结果。然后使用echo命令将仓库配置写入到/etc/apt/sources.list.d/docker.list文件中。这个文件专门用于存放第三方软件的APT源。echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null让我们拆解这行命令deb: 表示这是一个二进制软件包仓库相对于deb-src源代码仓库。[arch$(dpkg --print-architecture) signed-by...]: 这是APT仓库的选项。arch$(dpkg --print-architecture): 自动获取当前系统的架构如amd64,arm64确保下载对应架构的软件包。signed-by/etc/apt/keyrings/docker.gpg: 指定用于验证此仓库软件包的GPG密钥路径。这是Ubuntu/Debian新版本中更安全的指定方式。https://download.docker.com/linux/ubuntu: Docker官方为Ubuntu准备的仓库基地址。$(lsb_release -cs): 动态获取你的Ubuntu版本代号。stable: 使用稳定版仓库。如果你想尝试最新功能但可能不稳定可以替换为test或nightly。注意事项如果你使用的是Debian系统需要将命令中的ubuntu替换为debian。例如对于Debian Bullseyeecho \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null4.3 配置YUM仓库CentOS/RHEL/Fedora对于基于RPM的系统我们使用yum-config-manager工具来添加仓库。CentOS/RHEL:sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo这条命令会从Docker官方下载一个.repo文件并将其放置在/etc/yum.repos.d/目录下。你可以用cat /etc/yum.repos.d/docker-ce.repo查看其内容里面已经包含了稳定版stable、测试版test和夜间构建版nightly的仓库配置。Fedora:sudo yum-config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo5. 安装Docker引擎仓库配置好后安装就变得非常简单了。首先更新本地软件包索引然后直接安装docker-ce社区版。5.1 Ubuntu/Debian 安装步骤sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugindocker-ce: Docker社区版引擎核心组件。docker-ce-cli: Docker命令行工具你用来执行docker run,docker ps等命令的客户端。containerd.io: 一个行业标准的容器运行时Docker引擎底层依赖于它来管理容器的生命周期。docker-compose-plugin: 这是Docker Compose的V2版本它作为一个Docker CLI插件安装命令是docker compose注意没有横线。这是目前官方推荐的方式比独立安装docker-compose二进制文件更易于管理。5.2 CentOS/RHEL/Fedora 安装步骤sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin对于CentOS 8/RHEL 8你可能需要使用dnf命令它是yum的下一代版本sudo dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin5.3 安装特定版本可选在某些生产环境中你可能需要锁定一个特定的Docker版本而不是始终使用最新版。你可以先列出仓库中所有可用的版本然后选择安装。Ubuntu/Debian:# 列出所有可用版本 apt-cache madison docker-ce | awk { print $3 } # 安装指定版本例如 5:24.0.7-1~ubuntu.22.04~jammy VERSION_STRING5:24.0.7-1~ubuntu.22.04~jammy sudo apt-get install docker-ce$VERSION_STRING docker-ce-cli$VERSION_STRING containerd.io docker-compose-pluginCentOS/RHEL/Fedora:# 列出所有可用版本 yum list docker-ce --showduplicates | sort -r # 安装指定版本例如 docker-ce-24.0.7 sudo yum install docker-ce-24.0.7 docker-ce-cli-24.0.7 containerd.io docker-compose-plugin6. 安装后配置与验证安装完成并不意味着万事大吉。为了让Docker正常工作且更符合使用习惯我们还需要进行一些基础配置。6.1 启动Docker服务并设置开机自启Docker是以系统服务systemd service的形式运行的。# 启动Docker服务 sudo systemctl start docker # 设置Docker服务开机自动启动 sudo systemctl enable docker # 查看Docker服务状态确认其处于 active (running) 状态 sudo systemctl status docker看到绿色的“active (running)”字样并且没有红色的错误日志就说明服务启动成功了。你可以按q键退出状态查看。6.2 验证安装是否成功运行经典的“Hello World”容器这是检验Docker安装是否就绪的终极测试。sudo docker run hello-world如果安装配置正确你会看到一段来自Docker的欢迎信息大意是“Hello from Docker! This message shows that your installation appears to be working correctly.”。这个命令会从Docker Hub拉取一个极小的hello-world镜像并运行一个容器来输出这段信息。6.3 强烈推荐将当前用户加入docker组默认情况下执行docker命令需要sudo权限。每次都要输入密码很麻烦而且有些图形化工具如VSCode的Docker扩展也需要权限。更安全方便的做法是将你的用户加入docker用户组。# 将当前登录用户加入docker组 sudo usermod -aG docker $USER重要提示执行此命令后组权限不会立即生效。你需要完全退出当前终端会话并重新登录或者新开一个终端窗口新的组成员身份才会被系统识别。之后你就可以直接运行docker ps、docker run等命令而无需在前面加sudo了。安全警告docker组本质上拥有root权限因为Docker守护进程以root身份运行。因此只将你信任的、需要使用Docker的用户添加到该组。在多用户系统上请谨慎操作。7. 配置镜像加速与守护进程优化对于国内用户直接从Docker Hub拉取镜像速度可能很慢。我们可以配置国内镜像加速器。此外还可以对Docker守护进程进行一些基础优化。7.1 配置国内镜像加速器修改或创建Docker守护进程的配置文件/etc/docker/daemon.json。sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com, https://mirror.baidubce.com ], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } } EOF这里我添加了三个常用的国内镜像源中国科技大学、网易和百度。你可以选择一个延迟最低的使用或者全部保留Docker会按顺序尝试。registry-mirrors: 镜像加速器地址列表。log-driver和log-opts: 这部分配置了Docker容器的日志驱动为json-file并限制了单个日志文件最大100MB最多保留3个文件防止容器日志无限增长占满磁盘。7.2 应用配置并重启Docker修改配置后必须重启Docker服务使配置生效。sudo systemctl daemon-reload # 重新加载systemd守护进程配置 sudo systemctl restart docker # 重启Docker服务7.3 验证加速器是否生效运行docker info命令在输出结果中查找Registry Mirrors部分如果能看到你刚才配置的镜像地址说明加速器配置成功。docker info | grep -A 10 Registry Mirrors8. 安装并验证Docker Compose虽然我们在安装docker-ce时已经包含了docker-compose-plugin但为了确保它正常工作并且让你熟悉新旧命令的区别我们还需要验证一下。8.1 验证Docker Compose插件新版的docker-compose-plugin通过docker compose命令注意是空格不是横线来使用。docker compose version你应该能看到类似Docker Compose version v2.20.2的输出。这证明插件安装成功。8.2 了解Docker Compose V1与V2V1 (docker-compose): 一个独立的Python二进制文件需要单独下载安装。V2 (docker compose): 作为Docker CLI的插件与docker命令集成更好性能更优是未来的方向。本教程安装的是V2插件。如果你已有的脚本或文档中写的是docker-compose带横线大部分情况下可以直接替换为docker compose空格兼容性很好。你也可以创建一个软链接来兼容旧命令sudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose这样执行docker-compose命令实际上也会调用V2插件。8.3 使用Docker Compose快速启动一个服务我们来一个快速测试创建一个简单的docker-compose.yml文件来启动一个Nginx服务。mkdir ~/nginx-test cd ~/nginx-test cat docker-compose.yml EOF version: 3.8 services: web: image: nginx:alpine ports: - 8080:80 volumes: - ./html:/usr/share/nginx/html EOF # 创建一个简单的首页 mkdir html echo h1Hello from Docker Compose!/h1 html/index.html # 启动服务在后台运行 docker compose up -d # 查看运行状态 docker compose ps # 访问服务你可以用curl或者在浏览器访问 http://你的服务器IP:8080 curl http://localhost:8080如果看到“Hello from Docker Compose!”说明Docker Compose工作正常。最后记得停止并移除这个测试服务docker compose down cd .. rm -rf ~/nginx-test9. 常见问题与故障排查实录即使按照教程一步步操作你也可能会遇到一些问题。这里我整理了多年来被问得最多、最容易踩坑的几个点及其解决方案。9.1 添加GPG密钥或仓库时报错“找不到命令”问题描述在执行curl或gpg命令时提示command not found。原因分析系统没有安装curl或gnupg软件包。解决方案回到3.2 安装基础依赖工具步骤根据你的发行版安装所需的工具包。9.2 在Ubuntu上添加仓库时lsb_release -cs返回未知代号问题描述执行echo ... $(lsb_release -cs) ...时系统提示找不到对应的仓库。原因分析你使用的可能是非LTS版本、开发中版本或者是一个Docker官方尚未提供直接支持的衍生发行版如Linux Mint。解决方案手动查找与你Ubuntu版本对应的上游Ubuntu代号。例如Linux Mint 21 “Vanessa” 基于 Ubuntu 22.04 “Jammy Jellyfish”。那么在配置仓库时将$(lsb_release -cs)直接替换为jammy。# 假设你用的是基于Ubuntu 22.04的系统 echo \ deb [archamd64 signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ jammy stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null9.3 安装时出现依赖冲突或包损坏错误问题描述运行sudo apt-get install docker-ce时提示类似unmet dependencies、package ... has unmet dependencies或E: Sub-process /usr/bin/dpkg returned an error code (1)的错误。原因分析可能是之前安装的旧版本Docker或某些容器运行时如podman、containerd的冲突版本没有清理干净或者本地软件包索引损坏。解决方案尝试以下步骤彻底清理旧版本见3.1节。修复损坏的包并更新索引sudo apt-get update --fix-missing sudo apt-get install -f # 尝试修复依赖关系 sudo dpkg --configure -a # 重新配置未完成的dpkg操作如果问题依旧可以尝试清除APT缓存并重试sudo apt-get clean sudo apt-get autoclean sudo rm -rf /var/lib/apt/lists/* sudo apt-get update9.4 Docker服务启动失败查看状态显示错误问题描述sudo systemctl status docker显示状态为failed并伴有红色错误日志。原因分析原因多样最常见的是daemon.json配置文件格式错误或者与现有容器运行时冲突。解决方案检查配置文件语法使用sudo docker --config /etc/docker daemon来测试daemon.json的语法或者直接使用json验证工具。一个常见的错误是JSON格式不对比如多了或少了一个逗号、引号。查看详细日志运行sudo journalctl -u docker.service -f来实时查看Docker服务的详细日志通常能从中找到具体的错误原因。检查端口冲突Docker默认使用/var/run/docker.sock套接字和可能用到的2375/2376端口。确保没有其他程序占用。检查存储驱动某些文件系统或内核版本可能与Docker默认的存储驱动overlay2不兼容。可以在daemon.json中尝试更换为vfs性能差仅用于测试或查阅文档调整。9.5 运行docker run hello-world提示权限不足问题描述执行docker run hello-world时报错Got permission denied while trying to connect to the Docker daemon socket。原因分析当前用户不在docker用户组内或者执行usermod命令后没有重新登录。解决方案确认用户已加入docker组groups $USER查看输出中是否包含docker。如果已包含说明你需要注销并重新登录当前会话或者打开一个新的终端窗口。如果未包含请执行sudo usermod -aG docker $USER然后务必执行第2步重新登录。9.6 镜像拉取速度极慢或超时问题描述docker pull或docker run拉取镜像时速度很慢甚至出现net/http: TLS handshake timeout错误。原因分析网络连接Docker Hub不稳定特别是在国内网络环境下。解决方案确认镜像加速器已配置并生效按照7.1和7.3节操作。临时使用代理如果你在具有网络代理的环境下可以为Docker守护进程配置代理。在/etc/systemd/system/docker.service.d目录下创建一个http-proxy.conf文件sudo mkdir -p /etc/systemd/system/docker.service.d sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf EOF [Service] EnvironmentHTTP_PROXYhttp://your-proxy-ip:port EnvironmentHTTPS_PROXYhttp://your-proxy-ip:port EnvironmentNO_PROXYlocalhost,127.0.0.1,.your-domain.com EOF然后重启Dockersudo systemctl daemon-reload sudo systemctl restart docker。使用第三方镜像仓库对于一些常用镜像如ubuntu,nginx,redis可以尝试直接从国内镜像站拉取例如docker pull registry.cn-hangzhou.aliyuncs.com/library/ubuntu:latest10. 生产环境进阶考量与维护建议如果你是在生产服务器或需要长期稳定运行的环境下安装Docker除了上述基础步骤还需要关注以下几点。10.1 存储驱动与存储目录规划默认情况下Docker将所有数据镜像、容器、卷存放在/var/lib/docker。随着使用这个目录可能会变得非常庞大。规划独立分区或大容量磁盘建议将/var/lib/docker挂载到单独的、容量较大的磁盘分区上避免占满系统根分区导致服务器宕机。了解存储驱动对于现代Linux内核4.x以上overlay2是默认且推荐的存储驱动性能较好。你可以在daemon.json中通过storage-driver: overlay2来显式指定通常默认已是。除非有特殊需求否则不要轻易更改。10.2 日志与磁盘空间管理容器会持续产生日志如果不加管理可能迅速吞噬磁盘空间。全局日志配置正如我们在daemon.json中配置的log-opts限制日志文件的大小和数量是最佳实践。容器级别日志限制在运行容器时也可以单独指定日志驱动和选项docker run --log-driver json-file --log-opt max-size10m --log-opt max-file3 your-image定期清理可以设置定时任务cron job来定期清理不用的Docker资源# 删除所有已停止的容器 docker container prune -f # 删除所有未被任何容器引用的悬空镜像 docker image prune -f # 删除所有未被使用的卷谨慎确保数据已备份 docker volume prune -f # 删除所有未被使用的网络 docker network prune -f # 一键清理所有悬空资源镜像、容器、网络、卷需要确认 docker system prune -f10.3 内核参数与安全加固对于高负载或安全要求高的环境可能需要调整系统内核参数。修改系统限制在/etc/sysctl.conf文件中增加以下配置然后执行sudo sysctl -p生效可以提升容器性能和稳定性# 增加系统最大文件描述符数量 fs.file-max 1000000 # 允许iptables对桥接流量进行过滤Docker网络需要 net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-arptables 1 # 调整虚拟内存分配策略避免OOM Killer过早杀死容器进程 vm.overcommit_memory 1 vm.swappiness 0安全建议定期更新Docker引擎和容器镜像sudo apt-get update sudo apt-get upgrade(Ubuntu) 或sudo yum update(RHEL)。避免在容器内以root身份运行应用进程在Dockerfile中使用USER指令指定非root用户。考虑使用--read-only标志以只读模式运行容器文件系统增强安全性。使用Docker Bench for Security等工具进行安全扫描和合规检查。10.4 备份与恢复策略/var/lib/docker目录包含了Docker的全部状态。定期备份此目录是灾难恢复的基础。更细粒度的备份策略包括镜像备份将重要的自定义镜像推送到私有镜像仓库如Harbor或使用docker save导出为tar文件。卷备份对于命名卷named volume或绑定挂载bind mount中的重要数据建立独立的备份流程。Compose文件备份将所有的docker-compose.yml文件纳入版本控制系统如Git。安装和配置只是开始将Docker融入你的开发、测试和部署工作流并建立起良好的维护习惯才能真正释放容器技术的威力。从今天起你可以自信地在你的Linux系统上使用最新、最稳定的Docker了。如果在实践中遇到本教程未覆盖的新问题善用docker --help、docker logs container_id以及搜索引擎大部分难题都能找到答案。
返回列表