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.4+),overlay2是默认且唯一被推荐的生产级存储驱动。它性能好,稳定性高,几乎不需要额外配置。我们后续的步骤会确保你的系统使用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-ce:Docker社区版引擎。docker-ce-cli:Docker命令行工具。containerd.io:容器运行时,Docker Engine的底层依赖。docker-compose-plugin:Docker 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 Engine
sudo 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 infoRegistry 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 -f)5. 生产环境部署的进阶考量
如果你是为生产服务器部署Docker,除了上述基础步骤,还需要关注以下几点:
安全加固
- 非Root用户运行:虽然我们通过用户组让普通用户能操作Docker,但本质上Docker守护进程(dockerd)仍然以root权限运行。容器内的root用户也映射到宿主机的root。在生产环境,需要更严格地控制:
- 避免在容器内以root运行应用。在Dockerfile中使用
USER指令指定非root用户。 - 考虑使用用户命名空间映射(User Namespace Remapping),这是一个高级特性,可以将容器内的root映射到宿主机的一个非root用户,提供更强的隔离。配置在
/etc/docker/daemon.json中。
- 避免在容器内以root运行应用。在Dockerfile中使用
- 限制容器资源:使用
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的世界了。