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

资讯详情

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

CentOS 7 安装 Docker 全攻略:核心概念与排坑实战

CentOS 7 安装 Docker 全攻略:核心概念与排坑实战 最近有个朋友学 Docker折腾了一个周末最后卡在 CentOS 上怎么装都装不对不是 yum 源 404就是服务起不来。他感慨网上教程怎么没说这些前置条件其实不是教程没说而是很多文章默认你对 Linux 生态、软件源、权限体系已经有一定了解但新手恰恰缺的就是这部分。这篇作为 Docker 入门到实战系列的第一篇我就把 Docker 的核心概念和 CentOS 安装配置一次性讲透不跳步、不留坑适合完全没接触过容器、想从零开始搭起一套能用 Docker 环境的人。1. 先把环境选对为什么这篇教程用 CentOS 7 而不是 8 或 Stream1.1 版本那么多选 CentOS 7.9 的理由很现实现在你搜 CentOS能看到一堆版本CentOS 7、CentOS 8、CentOS Stream、Rocky Linux、AlmaLinux。对入门者来说我建议直接把焦点放在 CentOS 7.9 上。原因很朴素教程资源最多踩坑的人最多你遇到问题时搜到的解决方案也最完整。CentOS 8 在 2021 年就已经停止维护了官方仓库很多东西已经失效CentOS Stream 是滚动发布版本适合想要尝鲜或者做上游开发的人不适合求稳的学习环境。虽然 CentOS 7 的常规维护也在 2024 年 6 月到期但它存量极大各云厂商和镜像站都保留了完整的软件包而且 Docker 官方对 CentOS 7 的支持文档非常详细。对一个学习环境来说稳定、资料多、别人趟过坑比版本够新重要得多。提示如果你的公司环境已经全面转向 Rocky Linux 或 AlmaLinux那也可以按本文思路操作命令几乎一致。但个人学习我不建议一上来就追新版本把精力浪费在这个软件源为什么变了上。1.2 虚拟机里的基础配置和系统版本确认学习 Docker 最推荐的方式是装一台 Linux 虚拟机。VMware Workstation 或 VirtualBox 都行我用的是 VMware配置如下CPU2 核内存4 GBDocker 跑几个小容器完全够用磁盘默认 20 GB建议后面需要再扩容网络NAT 模式系统镜像CentOS-7-x86_64-Minimal-2009.iso安装时选最小化安装Minimal不需要图形界面Docker 本身就是一个命令行工具图形界面只会增加无意义的负担。如果手头已经有一台 CentOS 机器先确认一下版本和架构cat /etc/redhat-release uname -m正常情况下你应该看到CentOS Linux release 7.9.2009 (Core)和x86_64。这里的架构信息很关键后面配置 Docker 软件源的时候仓库地址里会有x86_64或aarch64的区分搞错了排查半天都找不出毛病。另外提醒一句如果你打算在虚拟机上长期学习装完系统后第一时间做好快照。安装 Docker 过程中万一搞坏了系统恢复起来也就是一分钟的事。2. Docker 到底解决了什么问题镜像、容器、仓库一次讲透2.1 镜像不是安装包而是只读模板 分层图纸很多人第一次接触 Docker会把镜像理解成安装程序。这样理解不算错但不准确。一个镜像更像是一套完整的只读模板里面包含了操作系统的基础文件、运行环境、应用代码和启动命令。比如mysql:8.0这个镜像底层是精简版 Linux上面叠了 MySQL 的整个运行环境你不需要再单独装一遍依赖。Docker 镜像还有一个核心设计分层存储。一个镜像由很多只读层叠加而成每一层代表 Dockerfile 里的一条指令。拉取新镜像时如果某些层已经在本地存在就不会重复下载。这就像盖楼地基和框架都在你只是想换个户型就不用把整栋楼推倒重建。后面你写 Dockerfile 时会深刻体会到分层带来的好处——稍微改一点配置重新构建时只需重新下载变化的层速度会快很多。2.2 容器镜像的运行状态同一个模板可以跑出无数个实例镜像是静态的跑起来之后就叫容器。你可以把镜像理解成一张菜谱容器是照着菜谱做出来的菜也可以把镜像理解成一条生产线容器是这条生产线上下来的产品。每次docker run都会基于镜像创建出一个新的容器容器之间相互隔离拥有独立的文件系统、进程空间和网络环境。容器内部可以读写文件、启动进程但写操作都发生在容器最上层的可写层不会污染镜像本身。有一点必须强调容器是可写但非持久的。当你删除一个容器里面修改的文件、写入的数据就全没了。这是新手第一个容易栽跟头的地方——过几天你会发现 MySQL 容器删了重建数据全丢了。解决办法是数据卷Volume或绑定挂载后面系列专门讲但你现在就要有这个意识。常用的容器操作命令可以先了解一下docker run -it --name test-centos centos:7 /bin/bash docker ps -a docker start test-centos docker exec -it test-centos /bin/bash docker rm test-centosrun是创建并启动ps是查看运行中的容器ps -a是把已经停止的一起列出来。你只需要记住run相当于创建 启动exec是进入一个正在跑的容器内部。2.3 仓库镜像的应用商店镜像从哪里来从仓库来。Docker 仓库就是集中存放镜像的地方最常用的是 Docker Hub你可以把它想象成 GitHub 的应用商店版。拉取一个镜像的命令是docker pull centos:7这里centos是镜像名7是标签tag表示版本。默认情况下会从 Docker Hub 拉取。你自己写好的镜像也可以推到仓库里供别人使用或者搭一个私有仓库供团队内部共享。国内各云厂商也提供了镜像仓库服务比如阿里云容器镜像服务、华为云 SWR后面讲部署和加速时会用到。仓库是 Docker 生态的流通环节镜像通过仓库分发容器通过镜像创建三者关系可以总结成一句话从仓库拉镜像用镜像跑容器。2.4 打断一下认知容器不是轻量级虚拟机这个概念必须掰开揉碎说清楚因为绝大多数入门者都会按虚拟机那套逻辑理解容器。虚拟机里有完整的客户操作系统Guest OS虚拟化层模拟了 CPU、内存、硬盘每个虚拟机背后都有一个独立的操作系统内核。而容器共享宿主机内核它只是把进程、文件系统、网络做了隔离。这意味着什么意味着你在 CentOS 宿主上跑一个 Ubuntu 容器容器里的用户态工具是 Ubuntu 的但底层内核还是 CentOS 宿主机的内核。所以你不能在一个 Linux 容器里跑 Windows也不能指望容器解决换内核的需求。容器能做的是让不同的应用环境互不干扰地跑在同一台机器上把运行环境的差异通通封装起来从而实现一次构建到处运行。这个区别带来两个直接结果容器启动是秒级的虚拟机是分钟级的容器对资源的消耗远小于虚拟机。这也是为什么一台 4 GB 内存的机器可以跑十几个容器但撑不起三四个虚拟机。对比维度虚拟机容器隔离级别硬件级虚拟化操作系统进程级隔离内核每个 VM 独立内核共享宿主机内核启动时间通常几十秒到几分钟秒级资源占用GB 级MB 级表现形式完整操作系统隔离进程环境3. CentOS 7 上安装 Docker 的完整实操记录3.1 先清理旧版本避免命令冲突CentOS 系统本身可能会带一个名为docker或docker-client的包那是老版本的 Docker也叫 docker-engine。如果你之前还装过一些乱七八糟的源最好先做一次清理yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine执行之后如果提示No Match for argument之类的东西说明本来就没装过直接忽略不影响后续流程。这一步的意义在于避免旧的可执行文件和新的 docker-ce 冲突也避免系统中残留旧版的启动脚本干扰 systemd 服务。3.2 配置 Docker 软件源为什么不用官方源安装 Docker 最正规的方式是通过 yum 软件源安装。方式有两种官方源和镜像源。官方源的地址是download.docker.com对不少网络环境来说连接不稳定yum makecache时经常卡死。我建议直接用阿里云镜像源速度快且稳定完全符合官方仓库的结构。先安装 yum 的配置工具yum install -y yum-utils然后添加 Docker 官方仓库但把地址换成镜像站yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo这里有一个隐藏的坑阿里云镜像源的 repo 文件里下载路径默认指向download.docker.com如果直接yum install仍然会走慢速的官方地址。所以加完仓库后要顺手做一个路径替换sed -i sdownload.docker.commirrors.aliyun.com/docker-ce /etc/yum.repos.d/docker-ce.repo然后再刷新缓存yum makecache fast为什么要做sed替换因为源文件里写的是官方域名我们加交互式安装时 docker-ce 软件包实际下载地址会去官方域名拉你不替换的话速度依然上不去。这一步看似不起眼却是很多人配置完源之后安装仍然巨慢的根本原因。提示如果你的 CentOS 7 版本比较老或者已经过了维护周期基础 yum 源可能失效。这时候需要把CentOS-Base.repo里的mirrorlist和baseurl切到镜像站的 vault 目录否则后续连yum-utils都可能装不上。3.3 安装 docker-ce 并启动依赖清理完、源配置好之后安装就很简单了yum install -y docker-ce docker-ce-cli containerd.io加上docker-buildx-plugin和docker-compose-plugin会更好尤其是 compose 插件后面编排多容器时几乎必用yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin装完后启动服务并设置开机自启systemctl enable --now docker注意enable --now是设置开机自启 立即启动的合体写法不用分两步。启动完成后查看状态systemctl status docker如果看到Active: active (running)说明服务起来了。接下来用版本信息验证一下核心组件docker version这个命令会显示 Client 和 Server 两部分信息。如果 Server 部分报错或者没显示说明 daemon 有问题后面第 5 节专门说。3.4 第一个容器跑一个 hello-world验证 Docker 能不能正常拉取和运行镜像经典做法是跑 hello-world 镜像docker run hello-world正常情况下第一次会从 Docker Hub 拉取镜像然后输出一段欢迎文字。这个镜像本身是一个极小的程序拉下来之后运行、打印提示、然后退出。如果你发现执行后在Pulling from library/hello-world这一步无限卡住或者报net/http: TLS handshake timeout那就是网络拉不到 Docker Hub。解决办法我在第 4.2 节详细说现在先记住拉不下来不代表 Docker 没装好只代表网络不顺畅。4. 安装成功后的三个关键配置不做后面寸步难行4.1 让当前用户免 sudo 直接运行 docker刚装完 Docker你执行docker ps大概率会看到Got permission denied while trying to connect to the Docker daemon socket原因很简单/var/run/docker.sock这个 socket 文件默认 root 所有而你的普通用户没有访问权限。解决方案是把当前用户加入docker组sudo usermod -aG docker $USER执行完之后需要重新登录会话才生效。如果你不想退出系统可以用newgrp docker临时切换到新的组上下文然后再执行docker ps验证。newgrp docker docker ps从安全角度多说一句把用户加入docker组基本等同于授予该用户 root 级别的能力因为 Docker 可以挂载任意目录到容器里从而以 root 权限读写宿主机文件。在自己的学习机器上没问题但在多人共用的生产服务器上一定要慎重。4.2 配置镜像加速国内环境使用 Docker 的必修课Docker Hub 的默认下载速度在国内经常让人怀疑人生。解决办法是给 Docker daemon 配置registry-mirrors让它从镜像加速站拉取镜像。编辑 daemon 配置文件vim /etc/docker/daemon.json写入如下内容{ registry-mirrors: [ https://docker.m.daocloud.io ] }在不同云厂商的机器上建议使用对应控制台提供的加速地址比如阿里云容器镜像服务的专属地址格式通常是https://xxxx.mirror.aliyuncs.com。这类专属地址需要登录控制台获取好处是对网络环境适配更好。写完配置文件后重启 Dockersystemctl daemon-reload systemctl restart docker可以用下面命令确认加速是否生效docker info | grep -A 1 Registry Mirrors如果你看到列出的镜像地址说明已经生效。这时候再跑docker run hello-world拉取速度会有质的提升。注意daemon.json不是只能写registry-mirrors一个键后面配置数据卷存储、日志大小限制、网络模式时都会往文件里加内容。一定要保证 JSON 格式正确一个多余逗号都会导致 Docker 服务起不来。4.3 确认开机自启和防火墙策略虽然前面用了systemctl enable --now docker但安装完最好再确认一次自启状态systemctl list-unit-files | grep docker看到docker.service enabled就说明没问题。防火墙这块如果你的 CentOS 开了 firewalld 并且打算从外部访问容器端口需要提前放行端口。比如后面我们用 Docker 跑一个 Nginx访问宿主机 80 端口firewall-cmd --permanent --add-port80/tcp firewall-cmd --reload不过在你本机虚拟机的学习环境里如果只是 SSH 登录操作一般不用特意开端口。这一点遇到具体场景再处理不用焦虑先知道有这个概念就行。5. 新手排坑实录安装阶段最常见的五个问题5.1 yum 找不到 docker-ce 软件包或安装时报 404这个坑的典型表现是No package docker-ce available. Error: Nothing to do排查顺序有三步。第一确认你用的仓库文件是 docker-ce.repo 而不是旧的 docker.repo如果之前手动建过 docker.repo先删掉。第二执行yum clean all yum makecache fast把缓存清掉再试很多新增的软件包信息会因为缓存没刷新而看不到。第三确认内核架构和仓库地址匹配。还有一种特殊情况CentOS 7 EOL 后yum 基础源如果还指向官方 mirrorlist会报一堆 404 或超时。解决办法是把/etc/yum.repos.d/下的CentOS-Base.repo改指向镜像站的 vault 路径。如果你是 aarch64 架构比如飞腾、鲲鹏服务器务必要确认baseurl里的架构是aarch64网络上的教程很多只讲 x86_64生搬硬套必然出错。5.2 服务起不来Cannot connect to the Docker daemon执行任何 docker 命令报Cannot connect to the Docker daemon at unix:///var/run/docker.sock第一反应不要重新安装先把服务状态拉出来看systemctl status docker journalctl -xe最常见的两个原因一个是服务没启动另一个是daemon.json写坏了。尤其是你刚配置了镜像加速就重启失败大概率是 JSON 语法错误——多写了一个逗号、引号没闭合这类低级错误经常发生。验证方法也简单先临时移走 daemon.jsonmv /etc/docker/daemon.json /etc/docker/daemon.json.bak systemctl start docker如果能启动就说明问题出在配置文件里仔细检查 JSON 再放回去。用python -m json.tool /etc/docker/daemon.json可以快速校验格式正确性。5.3 权限不足Got permission denied这个问题我在 4.1 已经解决过。真正容易忽略的点是用户加入docker组之后已经打开的终端不会自动刷新组权限你需要重新登录或者用newgrp docker切一下。很多新手在 usermod 之后发现还是报权限错误就以为是命令没生效实际上只是没有重新加载会话。5.4 Windows 上提示 Virtualization support not detected这个报错通常出现在 Windows 环境安装 Docker Desktop 时提示Docker Desktop failed to start because virtualisation support wasnt detected。虽然我们这次是在 CentOS 里安装但如果你是用 Windows 主机跑虚拟机遇到这个提示时不要慌顺序排查重启进 BIOS开启 CPU 虚拟化Intel VT-x 或 AMD-V在 VMware 或 VirtualBox 中确认虚拟机设置里勾选了虚拟化引擎选项Windows 的 Hyper-V、WSL2 功能是否启用回到我们的场景在 CentOS 虚拟机里跑 Docker 容器本身不需要额外的硬件虚拟化支持因为容器共享宿主内核。但如果宿主机的 VT-x 被关闭虚拟机的 Linux 内核在运行部分功能时会受限。看到这个提示先别怀疑 CentOS 出了问题去宿主机 BIOS 里看一眼。5.5 docker run hello-world 卡住半天怎么判断是网络还是服务问题很多人第一次跑 hello-world 卡住会误以为 Docker 没装好。判断方法很简单卡住时另开一个终端执行docker pull hello-world如果能走进度条说明网络在正常拉取只是慢如果一直转圈或者报 TLS 超时说明是网络问题去配置镜像加速。拉下来之后再次执行docker run hello-world你就能看到完整的输出了。这一步跑通说明从仓库到镜像再到容器的链路全部打通你的 Docker 环境才算真正可用了。最后分享一个实际运维中积累的经验装完之后别急着跑业务容器先花两分钟执行docker info把 Storage Driver、Registry Mirrors、Docker Root Dir 这三项看明白。这三个信息能帮你在未来排查集群问题、磁盘占用问题时快速定位方向。本系列后续篇幅会继续讲镜像管理、数据卷和容器网络到时候你会发现概念和安装这关过了后面的内容上手会快得多。
返回列表