2024年Docker部署实战指南:CentOS/Ubuntu安装与生产环境配置
1. 为什么今天还需要手把手讲Docker部署如果你在2024年还在搜索“Docker安装部署”大概率不是出于好奇而是带着一个明确的任务来的可能是公司新项目要求容器化可能是本地开发环境被各种依赖冲突搞得焦头烂额也可能是想快速搭建一个服务却不想污染宿主机。Docker早已不是新鲜事物但正因为它成为了现代开发和运维的“水电煤”一个清晰、无坑、能一次跑通的部署指南其价值反而比以往任何时候都高。网上的教程浩如烟海但版本过时、步骤缺失、针对特定系统比如只讲Ubuntu不讲CentOS或者关键细节一笔带过的问题比比皆是让新手从“入门”直接到“放弃”。这篇内容我会以一个运维老兵的视角带你走一遍主流的Linux发行版CentOS 7/8, Ubuntu 20.04/22.04上安装Docker Engine的完整流程。我不会只给你几条命令而是会解释每一条命令在做什么为什么这么做以及在不同系统上可能遇到的“坑”和应对策略。我们的目标很简单无论你用的是哪款Linux跟着做就能获得一个稳定、可用、配置妥当的Docker环境为后续的容器之旅铺平道路。2. 部署前的核心决策版本、源与存储驱动动手之前先花几分钟理清三个关键决策点这能避免你走到一半才发现方向错了。2.1 Docker Engine vs. Docker Desktop别选错了战场首先明确我们安装的是Docker Engine即Docker的守护进程dockerd和客户端命令行工具docker。这是在Linux服务器上运行容器的核心。而Docker Desktop是一个集成了Docker Engine、Kubernetes和友好GUI的桌面应用主要面向Windows和macOS的开发者。在纯Linux服务器环境尤其是生产环境我们只安装Docker Engine。所以如果你在Linux上看到教程让你下载.deb或.rpm包那是对的如果让你下载一个大的桌面安装包那可能跑偏了。2.2 安装源的选择官方仓库还是系统仓库安装软件源是源头。你有两个主要选择使用操作系统自带的仓库例如在Ubuntu上apt install docker.io在CentOS上yum install docker。这种方式最省事但有个致命问题版本往往非常陈旧。系统维护者为了追求稳定性仓库里的Docker版本可能落后官方好几个大版本你会错过许多新特性和重要的安全更新。使用Docker官方提供的仓库这是推荐的做法。我们需要手动将Docker的官方APT或YUM仓库添加到系统中然后从那里安装。这样做能确保我们获取到最新的稳定版并且后续更新也很方便。本文的步骤将围绕配置官方仓库展开。2.3 存储驱动overlay2是现在的唯一答案Docker需要存储驱动来管理镜像和容器的文件系统。早期有devicemapper,aufs,overlay等多种选择各有优劣和复杂的配置。但现在对于绝大多数现代Linux发行版内核版本 4.0 或 RHEL/CentOS 7.4overlay2是默认且唯一被推荐的生产级存储驱动。它性能好稳定性高几乎不需要额外配置。我们后续的步骤会确保你的系统使用overlay2。注意如果你在非常老旧的系统上操作或者遇到特殊的文件系统如Btrfs, ZFS可能需要查阅特定文档。但对于99%的新部署认准overlay2就行。3. 实战部署分步拆解与避坑指南理论清晰后我们进入实战环节。请根据你的操作系统选择对应的路径。3.1 环境准备与旧版本清理无论哪种系统第一步都是打扫“屋子”确保没有残留的旧版本Docker或叫docker.io、docker-engine的包它们会造成冲突。通用前置操作所有系统更新系统包索引这是一个好习惯确保你安装时基于最新的仓库信息。# Ubuntu/Debian sudo apt-get update # CentOS/RHEL/Fedora sudo yum check-update # 或 sudo dnf check-update (对于CentOS 8/Fedora)卸载所有可能的旧版本这条命令比较彻底它会移除Docker相关的软件包、镜像、容器、卷和网络配置。执行前请确认你不需要保留任何现有数据sudo apt-get remove docker docker-engine docker.io containerd runc # Ubuntu # 或者 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # CentOS卸载后通常/var/lib/docker/目录存放镜像和容器数据会被保留。如果你想全新开始可以手动删除它sudo rm -rf /var/lib/docker。3.2 Ubuntu / Debian 系统安装详解假设你使用的是 Ubuntu 20.04 LTS 或 22.04 LTS这是目前最主流的选择。第一步安装必要的工具包这些工具用于通过HTTPS使用仓库以及处理证书。sudo apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release-y参数自动确认安装避免中途需要手动输入Y。ca-certificates,curl,gnupg分别是CA证书用于验证HTTPS、命令行下载工具、GNU隐私卫士用于管理密钥和签名验证。lsb-release用于获取系统版本信息。第二步添加Docker官方GPG密钥GPG密钥用于验证从Docker仓库下载的软件包的完整性和真实性防止被篡改。sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgmkdir -p递归创建目录如果已存在也不报错。curl -fsSL-f静默失败-s静默模式-S显示错误-L跟随重定向。组合起来就是“安静地下载出错时显示并处理重定向”。gpg --dearmor将下载的ASCII格式密钥转换为二进制格式.gpg供APT使用。第三步设置稳定版仓库将Docker的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$(dpkg --print-architecture)自动获取系统架构如amd64, arm64。$(lsb_release -cs)自动获取系统代号如focal对应20.04 jammy对应22.04。这是关键确保仓库地址匹配你的系统版本。signed-by指定上一步导入的GPG密钥路径。sudo tee ... /dev/null将echo的内容写入指定文件tee命令同时输出到屏幕和文件 /dev/null将屏幕输出丢弃保持安静。第四步安装Docker Engine更新包索引这次能识别新加的Docker仓库然后安装。sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugindocker-ceDocker社区版引擎。docker-ce-cliDocker命令行工具。containerd.io容器运行时Docker Engine的底层依赖。docker-compose-pluginDocker Compose V2作为插件安装。这是目前推荐的方式替代了独立的docker-compose二进制文件。第五步验证安装运行经典的Hello World镜像测试Docker是否正常工作。sudo docker run hello-world如果看到一段欢迎信息并提示“Hello from Docker!”说明安装成功。这个命令会从Docker Hub拉取一个极小的测试镜像并运行它。3.3 CentOS / RHEL 系统安装详解假设你使用的是 CentOS 7 或 CentOS Stream 8/9。CentOS 7虽然已停止维护但存量巨大仍需覆盖。第一步安装必要工具包sudo yum install -y yum-utilsyum-utils提供了yum-config-manager等工具用于管理YUM仓库。第二步添加Docker官方仓库sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo这条命令会自动根据你的系统版本如centos-7或centos-8创建对应的仓库配置文件。第三步安装Docker Enginesudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin包名与Ubuntu一致。如果系统提示接受GPG密钥确认其指纹来自Docker Inc.即可。第四步验证安装同样使用Hello World镜像。sudo docker run hello-worldCentOS 7 专属重要补丁解决存储驱动冲突在CentOS 7上你可能会遇到一个经典错误Error starting daemon: error initializing graphdriver: driver not supported。这是因为CentOS 7默认的内核版本3.10虽然支持overlay2但系统自带的devicemapper驱动可能会产生冲突。解决方案是在启动Docker服务前明确配置使用overlay2存储驱动创建或编辑Docker的守护进程配置文件sudo vi /etc/docker/daemon.json输入以下内容如果文件已存在请确保JSON格式正确可以合并{ storage-driver: overlay2 }保存并退出编辑器。3.4 安装后的关键配置让Docker更好用安装成功只是第一步以下几个配置能极大提升日常使用体验和安全性。配置一免sudo执行docker命令强烈推荐默认情况下运行docker命令需要sudo权限这很麻烦。解决方案是将当前用户加入docker用户组。sudo groupadd docker # 如果docker组不存在则创建通常安装时会自动创建 sudo usermod -aG docker $USER # 将当前用户添加到docker组关键点-aG参数是--append --groups的缩写意为“将用户追加到以下附加组中”。千万不要只用-G那会覆盖用户原有的所有附加组导致你可能无法登录。执行后你需要完全退出当前终端会话并重新登录或者新开一个终端窗口用户组的变更才会生效。之后你就可以直接运行docker ps而不需要sudo了。配置二配置镜像加速器国内用户必备从Docker Hub拉取镜像在国内速度可能很慢。我们需要配置一个国内镜像加速器。这里以阿里云为例需要注册阿里云账号获取专属加速器地址其他服务商如腾讯云、网易云、DaoCloud同理。登录阿里云控制台进入“容器镜像服务” - “镜像工具” - “镜像加速器”你会得到一个专属的加速器地址格式如https://xxxx.mirror.aliyuncs.com。编辑Docker守护进程配置文件sudo vi /etc/docker/daemon.json将加速器地址添加到配置中。如果之前配置过storage-driver需要合并。{ registry-mirrors: [https://xxxx.mirror.aliyuncs.com], storage-driver: overlay2 # CentOS 7用户需要保留这一行 }注意registry-mirrors是一个数组可以配置多个加速器用逗号分隔。重新加载配置并重启Docker服务sudo systemctl daemon-reload # 重载systemd配置 sudo systemctl restart docker # 重启Docker服务验证加速器是否生效docker info在输出信息中查找Registry Mirrors如果看到你配置的地址说明成功。配置三设置Docker服务开机自启对于服务器我们通常希望Docker在系统启动时自动运行。sudo systemctl enable docker.service # 启用开机自启 sudo systemctl enable containerd.service # 通常docker.service会依赖它但显式启用也没错可以使用sudo systemctl is-enabled docker来检查是否已启用。4. 基础操作验证与常用命令速览环境配置妥当后我们通过几个核心命令来验证并熟悉最基本的操作流。验证Docker服务状态systemctl status docker # 查看Docker服务运行状态按q退出看到active (running)且为绿色表示服务运行正常。核心生命周期命令docker pull nginx:latest # 拉取镜像从配置的镜像加速器 docker images # 列出本地所有镜像 docker run -d -p 80:80 --name my-nginx nginx # 后台运行一个Nginx容器将容器80端口映射到主机80端口 docker ps # 查看正在运行的容器 docker ps -a # 查看所有容器包括已停止的 docker stop my-nginx # 停止容器 docker start my-nginx # 启动已停止的容器 docker rm my-nginx # 删除容器需先停止 docker rmi nginx:latest # 删除镜像需无容器使用进入容器内部docker exec -it my-nginx /bin/bash-i: 保持标准输入打开。-t: 分配一个伪终端。/bin/bash: 要执行的命令即启动一个bash shell。对于Alpine等精简镜像可能需要用/bin/sh。查看容器日志docker logs my-nginx # 查看日志 docker logs -f my-nginx # 实时跟踪日志输出类似 tail -f5. 生产环境部署的进阶考量如果你是为生产服务器部署Docker除了上述基础步骤还需要关注以下几点安全加固非Root用户运行虽然我们通过用户组让普通用户能操作Docker但本质上Docker守护进程dockerd仍然以root权限运行。容器内的root用户也映射到宿主机的root。在生产环境需要更严格地控制避免在容器内以root运行应用。在Dockerfile中使用USER指令指定非root用户。考虑使用用户命名空间映射User Namespace Remapping这是一个高级特性可以将容器内的root映射到宿主机的一个非root用户提供更强的隔离。配置在/etc/docker/daemon.json中。限制容器资源使用docker run时的--memory,--cpus等参数或者通过Compose文件、Kubernetes等编排工具为容器设置内存、CPU限制防止单个容器耗尽主机资源。镜像安全扫描定期使用安全工具如Trivy, Clair, Docker Scout扫描镜像中的已知漏洞。数据持久化与备份容器本身是无状态的删除容器后其内部产生的数据也会消失。持久化数据必须通过卷Volumes或绑定挂载Bind Mounts来实现。卷Volumes由Docker管理存储在宿主机特定目录/var/lib/docker/volumes/是推荐的生产环境数据持久化方式。docker volume create my-data-vol # 创建卷 docker run -d -v my-data-vol:/app/data my-app # 将卷挂载到容器内路径绑定挂载Bind Mounts将宿主机上的一个特定目录或文件挂载到容器中。更灵活但将容器与宿主机路径强耦合。务必建立定期备份卷数据的流程可以结合docker run --volumes-from或直接备份/var/lib/docker/volumes/下的数据。日志与监控日志驱动默认的json-file驱动会将日志以JSON格式存储在主机上。对于生产环境可以考虑配置日志驱动为journald如果使用systemd或syslog以便与集中式日志系统如ELK, Loki集成。同样在daemon.json中配置。监控使用docker stats命令可以实时查看容器资源使用情况。生产环境需要更完善的监控方案如 Prometheus cAdvisor或商业监控工具。网络配置默认的bridge网络适合单机环境。在多主机或复杂微服务场景下需要了解overlay网络用于Swarm集群或第三方网络插件如Calico, Flannel for Kubernetes。完成以上所有步骤你不仅拥有了一个可工作的Docker环境更对其背后的原理、配置和进阶方向有了清晰的认识。记住容器化是一个旅程从成功的安装开始你已经踏出了坚实的第一步。接下来就是去构建和运行你的第一个自定义镜像探索Dockerfile和Docker Compose的世界了。

相关新闻

Python-on-Whales高级技巧:掌握Buildx构建多平台Docker镜像

Python-on-Whales高级技巧:掌握Buildx构建多平台Docker镜像

Python-on-Whales高级技巧:掌握Buildx构建多平台Docker镜像 【免费下载链接】python-on-whales An awesome Python wrapper for an awesome Docker CLI! 项目地址: https://gitcode.com/gh_mirrors/py/python-on-whales 在容器化应用开发中,构建跨…

2026/10/15 11:43:11 阅读更多 →
Qwen 3.8 Max 与 DeepSeek V4 Flash 性能仅差3分,成本却相差345倍

Qwen 3.8 Max 与 DeepSeek V4 Flash 性能仅差3分,成本却相差345倍

先给结论,字段可直接抄走: AA Intelligence Index v4.1: Qwen 3.8 Max 53 DeepSeek V4 Flash 0731 50 Arena 文本榜 Elo: 1496 10 对 1436 4(Qwen 领先 60) 参数: …

2026/10/17 7:56:30 阅读更多 →
3个MIDI编辑痛点如何解决?免费开源MidiEditor完整指南

3个MIDI编辑痛点如何解决?免费开源MidiEditor完整指南

3个MIDI编辑痛点如何解决?免费开源MidiEditor完整指南 【免费下载链接】midieditor Provides an interface to edit, record, and play Midi data 项目地址: https://gitcode.com/gh_mirrors/mi/midieditor 还在为MIDI文件编辑而烦恼吗?你是否曾经…

2026/10/6 12:51:48 阅读更多 →

最新新闻

中级开发者AI能力升级路线图:从工程化到RAG与微调

中级开发者AI能力升级路线图:从工程化到RAG与微调

1. 先别急着学新框架,重新给自己画一张能力坐标 这几年我面试过不少中级开发者,也带过一些从普通业务开发转向AI方向的团队同事。一个很明显的现象是:很多人并不是不努力,而是努力的方向太散了。今天刷到一篇讲大模型微调的文章&a…

2026/10/17 11:58:36 阅读更多 →
2026年转行网络安全还来得及吗?真实行情与务实入行路径全拆解

2026年转行网络安全还来得及吗?真实行情与务实入行路径全拆解

经常有人私信我:2026年了,现在转行网络安全到底还来不来得及?这个问题几乎每一年都有人问,但随着时间推进,答案其实一直在变。作为在这个行当里做了多年、一路踩过不少坑的人,我想把这几年观察到的行情、带…

2026/10/17 11:58:36 阅读更多 →
Flink背压排查实战:从Kafka Lag积压到状态后端优化的完整复盘

Flink背压排查实战:从Kafka Lag积压到状态后端优化的完整复盘

下午三点多,群里突然刷出一条告警:某个实时链路Kafka Lag超过500万,还在继续涨。我当时第一反应是任务挂了或者下游挂了,打开Flink UI一看,任务状态RUNNING,Checkpoint也正常,但处理延迟已经从平…

2026/10/17 11:58:36 阅读更多 →
AI PR门禁:大模型驱动的代码审查与GitHub Actions自动化实践

AI PR门禁:大模型驱动的代码审查与GitHub Actions自动化实践

1. 先拆清楚:AI PR 门禁到底在门禁什么很多同学第一次听到“AI PR 门禁”这个词,第一反应是:是不是机器人来审核代码?其实不是那么玄乎。它做的事情,本质上是把原来靠人肉 review 才能完成的那一部分“低水平重复劳动”…

2026/10/17 11:58:36 阅读更多 →
码尚云标签3.0模板共享:从文件管理到团队协作标准化

码尚云标签3.0模板共享:从文件管理到团队协作标准化

上周有个同行问我:你们部门几十号人,天天和标签打交道,是怎么保证所有人打印出来的标签长得一模一样的?我说,靠的不是一遍遍发通知、也不是靠老师傅口头叮嘱,而是把标签模板这件事从“个人电脑里的一个文件…

2026/10/17 11:58:36 阅读更多 →
HTML网页结构搭建:从语义化标签到整站规划实践

HTML网页结构搭建:从语义化标签到整站规划实践

很多刚入门前端的朋友,在拿到一个设计稿之后的第一反应往往是:开始写div,一层套一层,哪里不对就再加一个div。等页面勉强显示出来,自己再看都觉得头疼,更别提后续要加功能、调样式、改文案时会多么痛苦。我…

2026/10/17 11:57:36 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →