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

资讯详情

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

CentOS7安装Docker全流程详解:从环境检查到镜像加速避坑

CentOS7安装Docker全流程详解:从环境检查到镜像加速避坑 看到不少朋友在CentOS7上装Docker时经常卡在“命令报错”这一步——要么yum源没配好要么内核版本不对要么装完发现启动不了。CentOS7算是很经典的服务器系统了Docker的安装命令其实不复杂但很多教程只给几行命令不解释为什么要这么做导致环境一变就翻车。这篇就把CentOS7安装docker命令的完整流程、背后的原理、实际踩过的坑一次性讲清楚从环境检查到镜像加速再到MySQL、Redis这类常用部署尽量让新手也能照着敲完不出错。这套流程适合谁呢刚接触Linux服务器的小白、需要在CentOS7上快速搭Docker环境的运维同学以及后端开发要本地或测试环境跑容器化应用的朋友。我会把每一步命令的作用、常见报错和排查思路都写上建议收藏后按顺序操作。1. 环境准备与安装前的关键检查1.1 确认系统版本和内核CentOS7安装Docker不是无脑执行的第一步一定先确认系统版本和内核。Docker对内核版本有要求CentOS7默认内核是3.10.x这个版本跑老版本Docker没问题但如果装太新的Docker引擎部分版本会提示内核特性不支持。查看系统版本的命令cat /etc/redhat-release查看内核版本uname -r我碰到过不少例子系统是CentOS 7.6内核3.10.0-957直接装了最新版Docker结果运行容器时报“iptables failed”或者“overlay2”相关的权限问题。所以官方其实有一个兼容矩阵CentOS7对应的是Docker CE 20.10系列以及之前的版本Docker 23.0之后对CentOS7的支持就逐渐减弱了不要盲目追新。如果内核版本过低可以先执行系统升级yum update -y升级完重启再继续。这一步虽然耗时但能省掉后面很多麻烦。另外还要确认系统架构绝大多数服务器是x86_64用uname -m查看如果是ARM架构后面所有yum源和镜像地址都要对应调整。1.2 提前规划网络与软件源CentOS7自带的yum源在服务器上往往会遇到两个问题速度慢、部分包找不到。装Docker之前我强烈建议先把yum源切换到国内镜像站这样后面安装依赖包会快很多也少一些“Could not resolve host”之类莫名其妙的错误。备份并替换CentOS-Base.repomv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo然后清理缓存并重新生成yum clean all yum makecache注意这里换的是系统基础yum源。Docker本身有自己的yum源等会安装Docker时还要单独配置别搞混。还有一个小细节如果服务器的DNS没配好直接访问外部yum源会报域名解析失败curl的时候会卡很久。我一般会顺手检查一下/etc/resolv.conf确保里面至少有一行nameserver 223.5.5.5这样的配置。1.3 清理可能存在的旧版本Docker很多服务器不是全新的之前可能装过docker或者docker-compose甚至装了一半失败留下的残留。如果直接覆盖安装会出现命令不存在、服务启动异常、二进制版本冲突等情况。看看系统里有没有残留的Docker相关包yum list installed | grep docker如果有旧版本先卸载yum remove -y docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine另外还要检查/var/lib/docker目录这是Docker默认的数据目录里面存着镜像、容器、卷。卸载旧版本后这个目录不会自动删除如果你想保留之前的数据就先不动如果是重新部署建议直接清空不然新环境会带着一堆旧数据rm -rf /var/lib/docker清理完再检查一下docker命令是否还残留which docker如果提示“no docker in ...”说明清理干净了可以进入下一步。2. 安装Docker的核心命令全流程2.1 安装依赖包与配置Docker yum仓库CentOS7上不能用系统自带的yum源直接安装Docker因为那个源里的docker版本太老而且稳定源里其实并没有Docker官方仓库的包。正确做法是先把依赖包装上再把Docker的yum源加进来。安装基础依赖yum install -y yum-utils device-mapper-persistent-data lvm2这三个包的作用要理清楚yum-utils提供yum-config-manager命令后面配置Docker仓库要用device-mapper-persistent-data是Docker存储驱动device-mapper需要的工具lvm2是逻辑卷管理工具同样服务于存储。接下来添加Docker官方仓库yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo这里有个国内环境下经常遇到的问题download.docker.com被墙或者访问超时导致整个命令卡住。我通常直接把这个仓库地址换成阿里云的镜像仓库效果一样速度却快很多yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo装完仓库文件后还可以顺便看一下仓库里的Docker版本列表确认有哪些版本可选yum list docker-ce --showduplicates | sort -r这一步非常有用能让你知道当前yum源里有哪些版本的Docker后面精确控制版本号就靠它。2.2 安装Docker引擎并启动仓库配置好之后安装就简单了。默认安装最新版本yum install -y docker-ce docker-ce-cli containerd.io值得注意的是CentOS7的Docker 20.10之后默认是使用containerd作为容器运行时所以containerd.io是必装的。不少新手只装了docker-ce结果启动docker服务时报错提示找不到containerd就是因为少装了这个包。如果不想装最新版想装一个兼容性更稳的版本比如20.10.9可以这样指定yum install -y docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io注意版本号后面不用带-3.el7这样的完整包名yum会自动匹配。装完以后启动Docker并设置开机自启这两条命令几乎是固定组合systemctl start docker systemctl enable docker启动之后很多人喜欢立刻验证一下最简单的方式就是跑官方测试镜像docker run hello-world看到“Hello from Docker!”就说明整个链路通了。如果这一步报错基本能定位到网络拉镜像或内核兼容性问题后面在常见问题里详细说。2.3 验证安装状态的细节除了docker run hello-world还可以用几条命令确认服务的健康状态systemctl status docker docker version docker infodocker version会输出Client和Server两部分信息。如果Server部分显示不出来或报“Cannot connect to the Docker daemon”说明docker服务没起来或者权限有问题。docker info会显示存储驱动、镜像数量、系统信息等我习惯先看Storage Driver是不是overlay2如果显示devicemapper说明配置被改动过后面容器性能会受影响。docker version具体输出类似这样Client: Docker Engine - Community Version: 23.0.1 API version: 1.42 Server: Docker Engine - Community Engine: Version: 23.0.1只要Server部分信息完整基本可以放心用了。另外记得确认一下当前用户有没有权限执行docker命令。如果是以root身份操作自然没问题如果用普通用户不加 sudo 直接敲 docker 命令会提示权限不足。解决办法是把用户加入docker组usermod -aG docker 用户名 newgrp docker重启终端后才能生效。2.4 顺手装好Docker Compose很多场景下单个容器还好一旦涉及多容器编排比如MySQL Redis 应用服务一起跑有Docker Compose会方便得多。CentOS7上装Docker Compose有几种方式我最常用的是直接下载二进制文件。先到GitHub或国内镜像站找对应版本然后执行curl -L https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose docker-compose version如果GitHub访问慢也可以用国内加速地址下载或者用Python的pip方式安装旧版本但我不太推荐因为依赖容易冲突。文件大小大概几十MB下载后一定记得执行chmod x否则会报“Permission denied”。Docker Compose v2之后已经作为Docker插件集成在Docker CLI中如果你系统装的是新版Docker可以直接用docker compose命令注意有个空格不一定非要单独下载docker-compose命令。两种方式选一种就行别重复装容易混淆。3. 安装后的基础配置与常见部署场景3.1 配置镜像加速器否则拉镜像能急死人Docker装完第一件事就是配置镜像加速器不然docker pull一个几百MB的镜像能卡到怀疑人生。这一步在国内环境基本是必做的。修改/etc/docker/daemon.json如果文件不存在就新建mkdir -p /etc/docker cat /etc/docker/daemon.json EOF { registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com, https://docker.nju.edu.cn ] } EOF改完后重启Dockersystemctl daemon-reload systemctl restart docker可以用docker info查看是否生效输出的Registry Mirrors部分会列出刚才填的地址。如果镜像加速地址失效了可以换新的公共镜像源或者直接用你所在云厂商的镜像加速地址比如阿里云控制台里申请到的专属加速地址这个通常最稳定。配置镜像加速器的时候要注意daemon.json是Docker守护进程的配置文件里面不只可以配镜像加速还可以配存储驱动、日志大小限制等。我习惯把日志限制也顺手配上防止容器日志把磁盘打满{ registry-mirrors: [https://docker.m.daocloud.io], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }这个配置在生产环境非常实用。不限制日志时一个不写日志策略的容器跑一个月可能吃掉几十GB磁盘。3.2 用Docker安装MySQL 8.0避坑挂载和数据持久化Docker安装MySQL是大家用得最多的场景之一也是踩坑最多的场景。很多人照着网上的命令直接跑docker run mysql:8.0结果启动失败或者数据一删容器就全没了。这里的关键点有三个数据目录挂载、密码配置、字符集配置。先创建一个数据目录mkdir -p /data/mysql/conf /data/mysql/data然后准备一个配置文件或者直接用命令行参数跑。我建议用命令行参数方式简单直接docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDYourPassword123 \ -v /data/mysql/data:/var/lib/mysql \ -v /data/mysql/conf:/etc/mysql/conf.d \ --restartalways \ mysql:8.0这里解释几个容易忽略的点-e MYSQL_ROOT_PASSWORD是设置root密码如果不设置MySQL容器会随机生成一个root密码打印在日志里很容易错过-v /data/mysql/data:/var/lib/mysql把容器内的数据目录挂载到宿主机这样容器删了数据还在--restartalways让容器在Docker重启或服务重启后自动拉起非常实用。等MySQL启动起来后进入容器检查docker exec -it mysql8 mysql -uroot -p输入密码后能看到进入MySQL命令行的提示说明部署成功。如果启动失败先看日志docker logs mysql8MySQL启动失败的常见原因我后面会再总结这里提一个最常见的挂载了宿主机的空目录到/var/lib/mysql但MySQL初始化时需要写文件到该目录而SELinux限制了权限。CentOS7默认是开启SELinux的如果报权限错可以直接临时关闭SELinuxsetenforce 0也可以只给目录放行但这个操作复杂一些测试环境直接关SELinux是最省事的。3.3 用Docker部署Redis主从练手容器网络Redis也是容器化部署的常客。单机Redis很简单docker run -d \ --name redis \ -p 6379:6379 \ -v /data/redis/data:/data \ redis:7.0 \ redis-server --appendonly yes但很多人练手的时候喜欢搭Redis主从这里其实会接触到Docker的容器网络知识点。Docker默认的bridge网络里同主机上的容器之间可以用容器名互相访问。启动主节点docker run -d --name redis-master -p 6380:6379 redis:7.0 redis-server --appendonly yes启动从节点时不能直接写slaveof redis-master 6379因为从节点启动时主节点可能还没准备好。更稳的做法是先启动一个普通Redis从容器再进去用命令动态配置docker run -d --name redis-slave -p 6381:6379 redis:7.0 redis-server --appendonly yes docker exec redis-slave redis-cli replicaof redis-master 6379注意这里用的是容器名redis-master代替IP地址前提是两个容器在同一个自定义网络里。默认bridge网络支持容器互联但自定义网络更清晰建议先创建一个网络docker network create redis-net然后在docker run时加上--network redis-net这样容器之间解析名字就没问题了。这个操作能帮助你理解Docker网络的基本概念后续搞微服务编排也会用到。4. 常见问题排查与踩坑实录4.1 启动失败内核不支持或virtualization support not detected这个报错在两类场景最常见一类是真实服务器装了CentOS7但内核太老启动Docker时报类似“kernel not supported”或“failed to start docker”的错误另一类是Windows上装了Docker Desktop启动时报“virtualization support not detected”。这里主要说前者但很多CentOS7虚拟机用户也会遇到类似问题。如果是VMware虚拟机里装的CentOS7先检查虚拟机的“虚拟化Intel VT-x”是否开启。这个选项默认可能是关闭的会导致Docker使用硬件加速时失败。如果用的是VirtualBox也要在系统设置里勾选“启用硬件虚拟化”。确认虚拟化支持后如果启动还失败看Docker daemon的状态journalctl -u docker -n 50我看到过很典型的错误日志里面提到Error starting daemon: error initializing graphdriver: driver not supported这种情况大多是存储驱动问题。解决办法是手动指定存储驱动为overlay2在daemon.json中写入{ storage-driver: overlay2 }然后重启systemctl restart docker如果内核真的比较老3.10以下建议先升级内核到3.10以上的新版本或者直接用Docker 18.09这类老版本。新内核跑新Docker永远是最省心的组合。4.2 拉镜像失败、ping不通外网该怎么查拉镜像失败是使用Docker时最折磨人的问题。报错一般长这样Get https://registry-1.docker.io/v2/: net/http: request canceled或者一直卡在Pulling fs layer不动。原因分两类第一类是 Docker 拉镜像的默认地址registry-1.docker.io访问慢这个可以通过配置镜像加速器解决就像前面讲的daemon.json配置。如果加速器也失效就换成其他公共镜像源。第二类是服务器本身网络不通特别是新装的CentOS7很多网卡默认没开。一个经典问题就是CentOS7刚装完发现ping www.baidu.com都不通但ping 网关IP却通。这通常是因为DNS没配置好。检查一下cat /etc/resolv.conf如果没有nameserver或只有内网DNS直接加进去echo nameserver 223.5.5.5 /etc/resolv.conf另外CentOS7的NetworkManager有时会接管网络配置直接改/etc/sysconfig/network-scripts/ifcfg-eth0里的DNS项更持久。检查里面有没有DNS18.8.8.8这种配置然后重启网络systemctl restart network这个地方还要注意有些云服务器安全组默认禁止出方向访问外网或者只开了22端口也会导致拉镜像超时。先在宿主机上用curl测试一下目标地址能不能通能通说明是Docker配置问题不能通就是网络策略问题。4.3 Docker安装MySQL失败的定位思路MySQL容器启动失败很多人第一反应是删了重建反复试还是一样的错。实际排查流程很简单先看日志docker logs mysql8日志里如果出现[ERROR] [MY-010457] [Server] --initialize specified but the data directory has existing files这说明数据目录不是空的容器误以为要启动一个已有数据的MySQL实例但目录里又没有完整的系统表。原因多半是你把宿主机一个非空目录挂载到/var/lib/mysql或者之前启动失败残留了文件。解决办法是清空数据目录再启动rm -rf /data/mysql/data/*另一种常见报错是权限问题chown: changing ownership of /var/lib/mysql: Operation not permitted这个和前面提到的SELinux有关。用docker run的时候挂载宿主机目录容器内MySQL进程需要对挂载目录有写权限。如果是测试环境可以直接关闭SELinux解决如果要保持SELinux开启可以给SELinux打标签但这条命令在新旧版本上有差异我一般优先选择关闭SELinux。还有一点MySQL 8.0 默认是区分大小写的很多旧项目的表名是小写迁移过来会报错。可以在docker run时加参数--lower-case-table-names1或者通过配置文件挂载进去。4.4 Docker升级与降级别把数据搞丢了CentOS7上Docker升级也是热点需求。很多人直接从旧版本升到最新版升完发现容器全没了或者docker-compose.yml里的配置格式不兼容。其实Docker升级命令和安装差不多yum install -y docker-ce docker-ce-cli containerd.io但升级前有几件事必须要做备份所有容器列表和配置。容器本身很难“导出”成文件但可以用docker commit把容器保存成镜像再导出docker commit 容器名 镜像备份名 docker save -o /data/backup.tar 镜像备份名记录当前镜像列表docker images /data/images_before_upgrade.txt检查daemon.json里的配置是否和新版本兼容。比如旧Docker可能用的是devicemapper存储驱动升到新版本后必须改成overlay2不改的话直接无法启动。升级完成后重启Docker并检查所有容器状态systemctl restart docker docker ps -a如果容器状态是Exited先看日志再启动千万别直接docker rm把容器删了。数据卷挂载的目录还在容器没了可以重建但如果你误删了数据卷目录那就真没了。5. 一些实操习惯和必须收藏的命令5.1 系统镜像下载与最小化安装建议很多新手在实际服务器上装CentOS7时总是下载完整版镜像几百MB的包还带一堆图形界面组件完全没有必要。CentOS7有最小化安装选项装完系统占用才700MB左右跑Docker这类服务绰绰有余。官方镜像下载地址在国内可以直接访问选择“Minimal ISO”版本就行。安装过程中记得选对安装位置和分区方案。我见过不少人在默认分区下用Docker跑一段时间根目录满了因为Docker默认/var/lib/docker在根分区下。所以装系统时我习惯单独分一个/var/lib/docker分区或者干脆给根分区预留80GB以上空间。如果已经装完系统才发现根目录不够网上有扩容命令教程但在装系统时直接规划好是最省事的。5.2 平时最常用的Docker命令速查安装完Docker之后下面这组命令是日常使用频率最高的建议直接存下来# 查看当前运行的容器 docker ps # 查看所有容器包括已停止的 docker ps -a # 查看本地镜像 docker images # 启动/停止/重启容器 docker start 容器名 docker stop 容器名 docker restart 容器名 # 进入容器内部 docker exec -it 容器名 bash # 查看容器日志 docker logs -f 容器名 # 查看容器资源占用 docker stats # 删除容器和镜像 docker rm 容器名 docker rmi 镜像名 # 清理所有没有被使用的资源 docker system prune -adocker system prune -a这条命令要慎用它会清理所有未被容器使用的镜像可能导致你下次启动某容器时需要重新拉镜像。我一般在磁盘快满时才执行。5.3 清理C盘或系统盘时的Docker数据搬迁Windows用户装了Docker Desktop之后系统盘经常被占满然后在网上搜“c盘清理命令”。这个问题在CentOS7上也类似只是换成了根分区被/var/lib/docker占满。解决办法是把Docker数据目录迁移到其他分区。迁移步骤不复杂systemctl stop docker mkdir -p /data/docker rsync -avz /var/lib/docker/ /data/docker/然后修改daemon.json{ data-root: /data/docker }重启Dockersystemctl daemon-reload systemctl restart docker确认所有容器正常后再删除旧目录rm -rf /var/lib/docker这个操作我在生产环境做过好几次没什么风险关键点是迁移前一定停Docker服务迁移完先启服务再删旧目录顺序不能反。我个人在实际操作中的体会是CentOS7安装Docker这件事八成的失败都出在安装前没做环境检查而不是命令本身敲错。多花五分钟看一下内核、yum源和网络后面省下的是几小时的排查时间。还有一个备用技巧如果你实在不想手动配仓库可以用阿里云等云厂商提供的一键安装脚本但脚本也建立在网络和依赖正常的前提下出了问题反而更难定位。掌握命令背后的逻辑永远比死记命令重要。
返回列表