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

资讯详情

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

Linux Docker安装全攻略:从发行版选择到生产环境配置

Linux Docker安装全攻略:从发行版选择到生产环境配置 1. 从“装个软件”到“构建基石”为什么Docker安装值得深究最近帮几个刚接触Linux运维和开发的朋友处理环境问题发现一个挺有意思的现象很多人觉得在Linux上安装Docker不就是几条命令的事吗网上教程一搜一大把照着敲完能跑起来不就完了。但实际踩坑的时候问题就来了为什么用curl -sSL https://get.docker.com/ | sh一键脚本有时会失败不同Linux发行版的安装方式差异在哪安装后那些额外的配置步骤比如用户组、镜像加速到底是不是必需的还有更头疼的生产环境对稳定性和版本有严格要求能直接用最新版吗这些问题恰恰说明把Docker安装仅仅看作一个“安装动作”是远远不够的。它实际上是你整个容器化工作流的起点和基石。一个正确、稳固的安装意味着后续的开发、测试、部署流程有了可靠的基础而一个潦草的安装则可能埋下权限混乱、网络异常、镜像拉取缓慢甚至安全漏洞的种子。今天我就结合自己多年在CentOS、Ubuntu、Debian等不同环境下的实战经验从头到尾拆解一遍Linux下的Docker安装。我们不仅要让它“跑起来”更要理解每一步背后的逻辑知道怎么根据你的实际场景是个人学习、团队开发还是生产部署做出最合适的选择并避开那些新手常踩的坑。2. 安装前的战略考量发行版、版本与环境清理在动手敲下任何安装命令之前花几分钟时间思考几个关键问题能帮你省下后面几小时甚至几天的排错时间。2.1 发行版选择与核心依赖Docker Engine 官方支持的主流Linux发行版包括Ubuntu、Debian、Fedora、CentOS/RHEL及其衍生版本。选择哪个首先看你的团队技术栈和历史习惯。但更重要的是要理解不同发行版背后的包管理器和内核要求。Docker运行依赖于几个核心组件Linux内核版本需3.10以上。虽然绝大多数现代发行版都满足但如果你接手一个老旧系统务必先uname -r确认一下。存储驱动早期常用devicemapper现在overlay2是推荐且默认的。它需要内核支持并正确配置。cgroups和命名空间这是容器隔离的基石现代内核都已内置。对于CentOS/RHEL 7/8及其衍生版如AlmaLinux、Rocky Linux你需要确保系统已经注册了正确的软件源如EPEL并且device-mapper-persistent-data和lvm2这样的包已就位这是devicemapper存储驱动如果使用的底层依赖。而在Ubuntu/Debian上apt包管理器是主角你需要关注的是ca-certificates,curl,gnupg,lsb-release这些工具链包是否齐全。注意如果你使用的是CentOS 8 Stream或RHEL 9官方推荐且通常预装的是Podman和Buildah它们与Docker CLI兼容但守护进程不同。如果你坚持使用Docker Engine可能需要添加额外的仓库如Docker官方源这可能会与系统自带的容器工具集产生冲突需要谨慎处理。2.2 版本规划追新还是求稳访问Docker官方文档你会发现通常推荐两个版本分支稳定版Stable和测试版Edge/Nightly。对于个人开发学习环境追求新特性可以用最新稳定版。但对于生产环境我的血泪教训是永远不要在生产环境使用最新发布的版本。生产环境应该选择比当前最新版落后一个小版本号的“次新”稳定版。例如当前最新稳定版是24.0.9那么生产环境可以考虑23.0.x系列。原因很简单新版本即使经过测试也可能存在尚未被广泛发现的边缘情况corner case或兼容性问题。让社区和先行者帮你踩踩坑等小版本号迭代几次比如到24.0.5以后修复了初期问题后再升级会稳定得多。安装时可以通过指定版本号来锁定避免意外升级。2.3 环境清理与旧版本排查这是被无数教程忽略但极其重要的一步。如果你的系统之前安装过Docker或旧称docker、docker.io、docker-engine残留的配置、数据和旧版本可能会与新安装产生冲突导致各种灵异问题。在安装新版本前请务必执行彻底的清理。以下是一个通用的清理检查清单# 1. 卸载旧版本的Docker相关包 sudo apt-get remove docker docker-engine docker.io containerd runc # Ubuntu/Debian # 或 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # CentOS/RHEL # 2. 删除残留的数据和配置谨慎操作这会删除所有容器、镜像、卷 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd # 3. 检查是否有残留的Docker进程或套接字 ps aux | grep -i docker sudo netstat -tlnp | grep docker只有在确认环境干净后我们才能开始一个纯净的安装。3. 主流发行版安装实操详解网上很多教程只给一种系统的命令但不同发行版的安装路径和配置方式差异不小。这里我分别以Ubuntu 22.04 LTS和CentOS 8为例展示两种最主流的安装路径。3.1 Ubuntu 22.04 LTS 安装流程Ubuntu的安装逻辑清晰主要围绕apt包管理器展开。第一步安装基础工具和添加GPG密钥首先确保你的apt索引是最新的并安装一些必要的工具。sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg lsb-release接下来添加Docker官方的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.gpg第二步设置稳定的软件仓库我们需要告诉apt去哪里找Docker的软件包。下面的命令会为你的系统架构amd64, arm64等配置正确的仓库地址。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这里$(lsb_release -cs)会自动获取你的Ubuntu代号如jammy。确保仓库地址与系统版本匹配否则会找不到包。第三步安装Docker Engine再次更新apt索引然后安装Docker。这里我强烈建议指定版本号。sudo apt-get update # 查看可用的版本 apt-cache madison docker-ce | head -5 # 假设我们选择安装 24.0.9 sudo apt-get install -y docker-ce5:24.0.9-1~ubuntu.22.04~jammy docker-ce-cli5:24.0.9-1~ubuntu.22.04~jammy containerd.io docker-buildx-plugin docker-compose-plugin安装docker-compose-plugin即docker composeV2是现在的主流做法它比独立的Python版docker-compose集成度更好。3.2 CentOS 8 安装流程CentOS 8默认使用dnf包管理器并且其官方仓库不直接提供Docker CE。我们需要手动添加Docker的专属仓库。第一步安装依赖和配置仓库sudo dnf install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo第二步安装指定版本的Docker Engine同样先查看版本再安装。# 查看仓库中的版本列表 dnf list docker-ce --showduplicates | sort -r | head -10 # 安装特定版本例如 24.0.9 sudo dnf install -y docker-ce-3:24.0.9-1.el8 docker-ce-cli-3:24.0.9-1.el8 containerd.io docker-buildx-plugin docker-compose-plugin第三步处理与Podman的冲突在CentOS 8上你可能会遇到与预装的podman和buildah的冲突。如果dnf提示冲突你有两个选择移除podman和buildah如果确定不用sudo dnf remove podman buildah或者在安装命令中明确排除冲突sudo dnf install -y --allowerasing docker-ce-3:24.0.9 ...。--allowerasing参数允许用docker-ce替换掉冲突的包。实操心得在生产环境的CentOS/RHEL系统上我通常倾向于第一种方案即移除podman保持容器运行时环境的纯粹性避免未来出现不可预见的交互问题。但对于只是想尝试容器技术的新手保留podman进行对比学习也不错。4. 安装后的关键配置让Docker真正“好用”安装完Docker服务并启动sudo systemctl start docker sudo systemctl enable docker只是第一步。以下几个配置能极大提升你的使用体验和安全性。4.1 用户权限管理告别烦人的sudo默认情况下执行docker命令需要root权限即加sudo。每次都要输入密码很麻烦更不安全的是这可能导致脚本中权限混乱。正确的做法是将当前用户加入docker用户组。sudo groupadd docker # 如果docker组不存在则创建通常安装时会自动创建 sudo usermod -aG docker $USER关键一步更新组信息。仅仅执行上面命令还不够你需要退出当前终端会话并重新登录或者使用newgrp docker命令让组更改立即在当前shell生效。之后你就可以直接用docker ps而不用sudo了。安全警告docker组本质上拥有root权限因为Docker守护进程以root运行。因此只将你信任的用户加入此组。在多用户系统或服务器上这一点尤为重要。4.2 配置国内镜像加速器从Docker Hub拉取镜像在国内速度可能很慢甚至超时。配置一个国内镜像加速器是必选项。常见的加速器有阿里云、腾讯云、中科大、网易云等。以阿里云为例你需要先去阿里云容器镜像服务控制台获取专属加速器地址编辑Docker守护进程配置文件sudo vim /etc/docker/daemon.json。如果文件不存在就新建一个。输入以下内容将https://xxxx.mirror.aliyuncs.com替换成你的真实地址{ registry-mirrors: [https://xxxx.mirror.aliyuncs.com], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, storage-driver: overlay2 }这个配置不仅设置了镜像加速还做了几件重要的事native.cgroupdriversystemd: 让Docker使用systemd的cgroup驱动这与Kubernetes的推荐配置一致避免未来上k8s时出现警告。log-driver和log-opts: 限制容器日志文件的大小和数量防止日志把磁盘撑爆。storage-driver: 明确指定使用overlay2存储驱动。保存文件后重新加载配置并重启Docker服务sudo systemctl daemon-reload sudo systemctl restart docker验证配置是否生效docker info。在输出中查找Registry Mirrors和Cgroup Driver字段确认包含你设置的镜像地址和systemd。4.3 存储与日志管理规划Docker默认将所有数据镜像、容器、卷、网络配置存放在/var/lib/docker。对于长期使用的系统尤其是生产环境你需要关注这个目录的磁盘空间。定期清理可以使用docker system prune -a命令清理所有未使用的镜像、容器、网络和构建缓存。但注意这会把所有悬空dangling镜像都删掉包括可能正在被其他镜像引用的中间层。更安全的是使用docker image prune或docker container prune进行针对性清理。更改数据根目录如果系统根分区空间紧张可以在/etc/docker/daemon.json中添加data-root: /path/to/new/docker-home来迁移整个Docker数据目录。但这需要在Docker服务停止时操作并移动原有数据比较复杂。日志轮替前面daemon.json里配置的max-size和max-file就是基础的日志轮替策略。对于应用日志更佳实践是在容器内将日志输出到stdout和stderr由Docker的日志驱动接管或者直接挂载卷将日志文件写到宿主机再用logrotate等工具管理。5. 验证安装与初体验完成安装和配置后我们需要验证Docker是否正常工作。基础验证# 检查Docker服务状态 sudo systemctl status docker # 运行经典的hello-world镜像 docker run hello-world如果能看到“Hello from Docker!”等欢迎信息说明Docker引擎、客户端和容器运行基本正常。进阶验证运行一个实用容器跑一个Nginx服务器并将宿主机端口映射到容器端口docker run -d --name my-nginx -p 8080:80 nginx:alpine然后访问http://你的服务器IP:8080应该能看到Nginx的欢迎页面。用docker logs my-nginx可以查看容器日志docker exec -it my-nginx sh可以进入容器内部。6. 常见问题与故障排查实录即使按照步骤操作你也可能会遇到一些问题。这里记录几个我遇到的高频问题。6.1 网络问题镜像拉取失败或容器无法联网症状docker pull超时或容器内部无法访问外网。排查思路检查镜像加速器配置首先确认/etc/docker/daemon.json配置正确且已重启服务。用docker info验证。检查DNS配置容器内部使用的DNS默认与宿主机相同。如果宿主机DNS有问题容器网络也会异常。可以临时在运行容器时指定DNSdocker run --dns 8.8.8.8 ...。检查防火墙CentOS的firewalld或Ubuntu的ufw可能会阻断Docker的网络流量。Docker服务启动时会自动配置iptables规则但有时与系统防火墙冲突。可以尝试暂时关闭防火墙测试生产环境慎用sudo systemctl stop firewalld或sudo ufw disable。长期方案是放行相关端口或信任Docker网桥接口。检查Docker网络驱动使用docker network ls和docker network inspect bridge查看默认的bridge网络状态。6.2 权限问题Got permission denied错误症状执行docker ps等命令时提示权限拒绝即使已经将用户加入docker组。排查思路确认组生效执行groups命令查看当前用户所属组列表中是否包含docker。如果没有记得重新登录或执行newgrp docker。检查Docker套接字权限Docker守护进程通过Unix套接字/var/run/docker.sock与客户端通信。检查其权限ls -l /var/run/docker.sock。通常应为root:docker且组docker有读写权限srw-rw----。如果不是可以手动更改sudo chown root:docker /var/run/docker.sock。检查用户组ID缓存极少数情况下系统可能缓存了旧的用户组信息。重启系统可以彻底解决。6.3 存储问题overlay2相关错误症状启动容器时报错提示failed to create rwlayer: funtion not implemented或driver overlay2 failed to create rootfs。排查思路内核不支持overlay2运行grep overlay /proc/filesystems查看是否有overlay输出。如果没有说明内核不支持。需要升级内核。文件系统不支持xfs或ext4的d_typeoverlay2需要底层文件系统支持d_type目录条目类型。对于xfs需用ftype1格式创建对于ext4默认支持。检查命令xfs_info /查看ftype是否为1或tune2fs -l /dev/your-disk | grep features查看has_index_dir。磁盘空间不足检查/var/lib/docker所在分区的空间使用情况df -h /var/lib/docker。6.4 服务启动失败Failed to start Docker Application Container Engine症状sudo systemctl status docker显示服务启动失败查看日志journalctl -xu docker有具体错误信息。排查思路查看详细日志journalctl -xu docker --no-pager -n 50是排错的最佳起点。常见原因daemon.json配置语法错误JSON格式非常严格多一个逗号或少一个引号都会导致解析失败。可以用jsonlint等工具验证。与现有容器运行时冲突例如旧版本Docker或containerd没有清理干净。用ps aux | grep -E (dockerd|containerd)检查并彻底清理。SELinux/AppArmor限制在CentOSSELinux或UbuntuAppArmor上安全模块可能会阻止Docker。可以尝试临时设置为宽容模式测试sudo setenforce 0SELinux或sudo systemctl disable apparmorAppArmor需重启。生产环境需配置正确的安全策略而非简单关闭。内核模块未加载确保必要的内核模块如overlay、br_netfilter等已加载lsmod | grep -E (overlay|br_netfilter)。如果没有使用sudo modprobe overlay等命令加载。把这些步骤和注意事项都捋清楚你的Docker安装就不仅仅是一次性的“装好了”而是为后续所有容器化操作打下了一个坚实、可控、可维护的基础。记住基础设施的稳固程度直接决定了上层建筑能盖多高。
返回列表