2024年Docker部署实战指南:CentOS/Ubuntu安装与生产环境配置

📅 发布时间:2026/8/4 21:09:03
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的世界了。