资讯动态

CentOS 7.6安装Docker实战:从yum配置到部署MySQL与Redis

发布时间:2026/10/8 14:57:00 来源:尧图企业网站定制
CentOS 7.6配上Docker这个组合我打交道快五年了。很多人觉得CentOS 7.6太老跑Docker反而稳定尤其是公司机房里的存量服务器大多数都还是7.x的内核。标题看着简单真上手会遇到一堆坑yum源里找不到docker-ce、内核太老导致存储驱动起不来、装完启动报错、网卡配置导致容器不通……这篇文章我把从零安装到跑通MySQL、Redis的完整过程捋一遍把你可能踩的坑提前排掉。这个内容适合刚上手CentOS的运维新手也适合在生产环境准备迁移Docker的老哥们。我不会只丢几条命令给你会把每个关键节点背后的原因讲清楚。为什么用这个源、为什么加那个参数、哪些配置是防爆盘的关键都会提到。跟着走一遍你会发现CentOS 7.6跑Docker没那么玄乎只要把几个关键点处理到位后面一路顺畅。1. Docker是什么以及为什么要在CentOS 7.6上折腾它1.1 Docker解决的核心痛点Docker本质上是一个容器化平台它把应用连同运行环境一起打包成一个镜像扔到哪台机器上都能原样跑起来。类比一下以前你在一台服务器上部署MySQL要先装依赖库、配置环境变量、改配置文件换一台服务器全部重来一遍。而Docker镜像就像一份打包好的饭菜到哪儿都能直接热一下上桌不用关心后厨用的什么锅什么灶。对CentOS 7.6这种老系统来说Docker还有一个额外价值它把底层的系统差异隔离掉了。比如你的物理机是CentOS 7.6内核老一些但容器里的应用可以跑CentOS 8、Ubuntu甚至更激进的环境只要宿主机内核支持必要的namespace和cgroup能力。这也是为什么很多公司的存量机器即使系统版本很老也愿意跑Docker来拉平应用部署差异。1.2 为什么选CentOS 7.6这台老车很多人上来就问CentOS 7.6都已经停止维护了为什么还要用它装Docker这里有个现实背景企业内部的大量物理服务器、虚拟主机跑了好几年迁移成本极高。CentOS 7.6的内核是3.10.x虽然旧但Docker的官方要求是内核3.8以上即可所以从技术门槛上看没问题。还有一个更现实的原因很多部署在CentOS 7.6上的中间件比如Kafka 2.x、老版本Hadoop这些存量系统官方支持列表里就写着CentOS 7。这些业务不能随便换系统但新业务又需要容器化交付那就只能在7.6上跑Docker。这里要注意CentOS 7.6默认内核3.10.0-957跑Docker的overlay2存储驱动没问题但如果你要用到一些更新的特性比如iptables新语法或者cgroup v2那就受限于内核了。1.3 安装前的环境检查清单在动手之前先做个体检。我一般按这个顺序查确认系统版本cat /etc/centos-release确保是7.6。确认内核版本uname -r3.10.0-957以上基本OK。确认网络能通外网或内网镜像源curl -I https://mirrors.aliyun.com能看到HTTP 200就行。确认防火墙状态CentOS 7默认firewalld建议先临时关闭排查问题systemctl stop firewalld确认无误后再加放行规则而不是直接关掉。确认SELinux状态getenforce如果状态是Enforcing建议先setenforce 0临时放开。Docker在SELinux Enforcing模式下也能跑但配置稍微要调新手容易卡住。检查磁盘df -h确保/var/lib/docker所在分区有足够空间。Docker默认把所有镜像和容器数据都放在这里至少留20G以上比较稳妥。这些检查做完再往下走就顺畅多了。我见过无数个案例上来就yum install装到一半发现连不上源或者装完重启起不来回头一查全是环境问题。2. 安装前准备内核、依赖与repo源选择2.1 版本选择的学问docker-ce还是docker-ioCentOS 7的默认yum源里其实自带了一个docker包也就是docker-io但版本很老多年不更新。我们需要装的是docker-ce这是Docker官方维护的社区版。docker-ce和docker-io的区别简单说就是前者是官方仓库持续发布的版本支持滚动升级bug修复及时后者是发行版打包的老版本稳定但功能落后。既然要从容器化起步直接装docker-ce。这里还要提一个容易搞混的点docker-ce的版本命名。早期版本叫1.x后来Docker公司把版本号重新定义从18.09、19.03这样过渡再到20.10、24.x。不同的版本对应不同的内核要求CentOS 7.6装20.10系列是绝对稳妥的26.x、27.x这类新版本在CentOS 7.6的旧内核上也能跑但不建议激进迭代。我在生产环境用了很久的20.10.17稳定性不错内核3.10也完全兜得住。2.2 卸载旧版本与清理残留如果系统以前装过docker、docker-io、docker-ce旧版本直接装新版很容易出现依赖冲突或者起不来的情况。卸载命令我一般这样写sudo yum remove -y docker docker-client docker-common docker-engine docker-engine-selinux docker-cli containerd注意这个命令只会删掉软件包不会删你之前创建的容器和镜像。这些数据都在/var/lib/docker目录下如果确认不需要了可以手动清理sudo rm -rf /var/lib/docker但如果这个目录里有你重要的镜像或数据千万别手贱删掉先备份。另外卸载后最好检查一下还有没有残留的docker相关的repo文件位于/etc/yum.repos.d/目录该删的删该改的改避免后续repo冲突。2.3 安装依赖包与工具docker-ce在CentOS 7上依赖一堆基础包比如yum-utils、device-mapper-persistent-data、lvm2。yum-utils主要用来提供yum-config-manager这个命令后面配置repo源要靠它device-mapper-persistent-data和lvm2是Docker要用到device mapper驱动时的依赖。安装命令sudo yum install -y yum-utils device-mapper-persistent-data lvm2这三件套基本是标配。装完后可以用yum-config-manager --version验证一下yum-utils装好了。如果你在安装这几个包时报错大概率是基础yum源没配好先检查一下/etc/yum.repos.d/下的CentOS-Base.repo文件确保baseurl指向的是可访问的镜像地址。2.4 配置Docker的repo源这是很多人第一次装最容易踩坑的部分。直接使用官方源download.docker.com在国内服务器上经常超时yum会卡在Loading mirror speeds from cached hostfile半天然后报错Could not resolve host。所以我把repo源换成阿里云的镜像。方法是sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo添加完repo后还要检查一下repo文件确保baseurl指向的是阿里云地址sudo vim /etc/yum.repos.d/docker-ce.repo重点看[docker-ce-stable]这一段确认baseurl是https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable。还有一个细节CentOS 7.6的$releasever默认是7如果你是本地的7.6机器仓库路径会正确解析。但个别精简系统可能把releasever搞丢导致repo路径变成其他形式这时候yum会报错找不到包。解决办法是在repo文件里手动把$releasever改成7。配置完成后执行sudo yum makecache fast这里如果makecache很慢或者担心仓库更新失败我一般会同时把epel源也配好。docker-ce本身不依赖epel但后续如果要用docker-compose之类的东西epel源会方便很多。3. 三种主流安装方式实操3.1 方式一yum源安装推荐环境准备好之后装docker-ce本体是一个命令的事sudo yum install -y docker-ce docker-ce-cli containerd.io这行命令会装三个核心组件docker-ce主程序包含dockerd守护进程和Docker CLIdocker-ce-cli命令行客户端containerd.io容器运行时Docker从19.03开始把containerd拆分出来独立管理装的过程可能会出现一个小坑yum提示有多个版本可选时它会默认装最新版。如果你想固定版本可以这样查可用的版本列表yum list docker-ce --showduplicates | sort -r看到想要的版本后用完整包名安装sudo yum install -y docker-ce-20.10.17-3.el7 docker-ce-cli-20.10.17-3.el7 containerd.io固定版本的好处很明显生产环境升级可控不会因为某天yum update把Docker升到不兼容的新版本。我在线上就把Docker版本锁定配合Ansible统一管理这个思路很实用。3.2 方式二官方脚本一键安装如果你想快速装一个能用的环境Docker官方提供了一个安装脚本curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh脚本会自动检测系统、配置repo源、安装docker。这么做的优点是快缺点有两个一是安装的版本不是你能控制的脚本总是拉取最新稳定版二是脚本会尝试配置官方repo在国内网络环境下可能失败。所以我一般不推荐生产环境用脚本除非你是在本地实验环境图省事。如果脚本跑到一半报错通常就是网络问题换个思路直接走yum源安装更省心。拷贝下来的get-docker.sh也可以先打开看一眼里面脚本逻辑不复杂能帮你理解Docker安装过程到底做了哪些动作。3.3 方式三离线rpm包安装内网场景很多公司生产环境不通外网这时候离线安装包就派上用场。做法是在一台能上网的同版本机器上用yum的downloadonly插件先把rpm包拉下来然后拷贝到内网机器上安装。先在外网机器上执行sudo mkdir -p /opt/docker-rpm sudo yum install -y yum-plugin-downloadonly sudo yum install -y --downloadonly --downloaddir/opt/docker-rpm docker-ce docker-ce-cli containerd.io然后把/opt/docker-rpm里所有rpm文件拷贝到内网机器执行sudo yum localinstall -y /opt/docker-rpm/*.rpm注意localinstall会自动解决本地rpm包之间的依赖关系但不会去联网找新的依赖所以如果内网机器缺了其他系统依赖包还是得事先一起打包进来。我一般会在外网机器上先用yum deplist docker-ce查一下完整依赖树把所有依赖都拉下来避免到内网才发现缺包。3.4 启动Docker并验证装完这些组件先别急着跑容器先启动守护进程sudo systemctl start docker sudo systemctl enable docker看到enable输出Created symlink说明开机自启已经配置好了。启动后验证一下sudo docker version sudo docker infodocker version里可以看到Client和Server两个部分如果Server部分能正常打印版本号说明守护进程跑起来了如果只有Client有信息Server报Cannot connect多半是服务没起来或者权限问题。我还习惯跑一个hello-world镜像做最终验证sudo docker run hello-world如果本地没有这个镜像docker会先pull。pull成功并打印出那段说明文字就代表整个Docker环境可以正常拉取、创建、运行容器了。4. 配置镜像加速与开机自启4.1 daemon.json配置与镜像加速的原理docker pull从官方仓库拉镜像速度经常在几十KB/s徘徊一个几百MB的镜像能等到让人崩溃。这里的关键是尽量少直接从官方仓库拉取而是把Docker的镜像拉取地址切换到国内公共仓库的加速地址。Docker守护进程的配置在/etc/docker/daemon.json这个文件默认不存在需要手动创建。我推荐的配置是这样的{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com, https://docker.mirrors.ustc.edu.cn ], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, storage-driver: overlay2 }registry-mirrors是镜像加速地址列表docker拉镜像时会依次尝试这些地址。这里我放的是DaoCloud、DockerProxy和中科大镜像这几个都是国内公共的加速地址不涉及任何需要特殊手段才能访问的资源就是个普通的HTTP/HTTPS服务合规也稳定。storage-driver指定overlay2这是现代推荐使用的存储驱动性能和稳定性都比老的devicemapper好。注意如果内核太老某些发行版默认不给用overlay2但CentOS 7.6的3.10内核配合docker-ce 20.10是没问题的。log-opts限制了容器日志大小这个配置强烈建议加上。线上环境很多容器日志没有上限一个容器写几十G日志把磁盘塞爆的情况我遇到不止一次。限制在单个文件100M、保留3个基本够用了。修改完daemon.json后需要重启docker生效sudo systemctl daemon-reload sudo systemctl restart docker然后验证一下加速是否生效sudo docker info | grep -A 3 Registry Mirrors如果能看到你配置的加速地址列表就说明配置加载成功。4.2 配置开机自启与仓库登录前面已经执行过systemctl enable docker了但这里再说一下原理。systemd的enable操作是在/lib/systemd/system/目录下生成docker.service符号链接到/etc/systemd/system/multi-user.target.wants/这样系统开机进入多用户模式后会自动启动docker。如果你发现在某台机器上开机docker没起来可以检查一下sudo systemctl status docker sudo systemctl is-enabled dockeris-enabled输出enabled说明自启配置没问题。如果输出disabled或者空重新enable一遍就行。有时候公司内部的私有镜像仓库需要认证才能拉取这时候要用docker login命令登录sudo docker login registry.internal.example.com输入用户名密码后凭证会保存在~/.docker/config.json里。注意如果用sudo跑的docker login凭证会在root用户的家目录下普通用户执行docker pull私有仓库镜像时还是需要重新登录。这个细节很容易坑到人。4.3 验证安装跑第一个容器配置完这些我们来实测一下完整链路。拉一个nginx镜像作为测试sudo docker pull nginx:1.24拉完启动sudo docker run -d --name test-nginx -p 8080:80 nginx:1.24这条命令的意思-d后台运行--name给容器起个名字-p把宿主机的8080端口映射到容器内的80端口。启动后访问宿主机IP的8080端口看到nginx欢迎页就说明容器网络映射工作正常。如果访问不通先别急着查防火墙先看容器有没有在跑sudo docker ps再在宿主机上curl一下curl http://127.0.0.1:8080如果curl通只是外部访问不通那大概率是firewalld没放行8080端口。如果curl都不通看sudo docker logs test-nginx的输出再逐步排查。5. 常见问题与排查技巧实录5.1 服务启动失败failed to start docker application container engine这个是排行榜第一的报错。执行systemctl start docker后如果看到这样的信息Job for docker.service failed because the control process exited with error code. See systemctl status docker.service and journalctl -xe for details.用journalctl查看日志sudo journalctl -u docker --no-pager -n 50常见原因和对应处理/var/lib/docker目录权限不对确认目录属主是root且能读写。overlay2驱动初始化失败内核模块没加载。执行modprobe overlay然后再启动。iptables规则冲突原系统存在自定义iptables规则Docker启动时没办法加载NAT规则。临时用iptables -F清空规则重启docker测试。cgroup相关报错CentOS 7默认的cgroup v1一般没问题但如果你手动改过内核参数可能出现找不到cgroup挂载点的问题。我遇到最多的还是iptables冲突尤其是装了安全防护软件的机器比如云锁这类Docker启动时经常卡在iptables初始化阶段。解决办法是把Docker需要的链建好或者临时调整安全软件规则。5.2 permission denied while trying to connect to the docker api这个问题排第二。执行docker ps或者docker info时看到permission denied while trying to connect to the docker api at unix:///var/run/docker.sock原因是Docker守护进程监听在/var/run/docker.sock这个socket上这个socket默认只允许root用户访问。当前用户不在docker用户组里自然连不上。解决办法有两种sudo groupadd docker # 如果组不存在 sudo usermod -aG docker $USER然后退出重新登录或者执行newgrp docker让组权限生效。或者干脆用sudo执行所有docker命令。注意把用户加入docker组等于给了这个用户root级的权限因为docker组用户可以读写docker.sock能直接操作宿主机文件。所以生产环境谨慎加组最好用sudo比较安全。5.3 镜像下载慢或者超时配置了镜像加速还慢最常见的是网络侧到加速源的路由问题。我一般这样处理先手动测试到加速源的速度curl -o /dev/null -s -w %{speed_download}\n https://docker.m.daocloud.io/v2/如果速度还是慢换一家加速源。各家公共加速源在不同地区速度差别很大没有绝对最优多试几个。另外docker pull默认是并发拉取每一层的如果层很多整体速度自然慢。可以在daemon.json里加max-concurrent-downloads配置这个参数控制并发下载层数max-concurrent-downloads: 105.4 容器网络不通容器起来了但容器之间ping不通或者容器访问不了宿主机网络。排查思路第一检查Docker默认网桥的IP段。执行docker network ls和docker network inspect bridge看Subnet是不是和其他网段的IP冲突。如果局域网正好用了172.17.x.x这段地址容器路由就会乱。解决方法是修改daemon.json指定新的网段{ bip: 192.168.100.1/24 }注意bip这个参数是给默认bridge网桥指定IP段的改完要重启docker且旧容器需要删除重建因为IP段变了。第二检查内核的ip_forward是不是打开了sysctl net.ipv4.ip_forward输出0说明没开用sysctl -w net.ipv4.ip_forward1开启并写入/etc/sysctl.conf持久化。5.5 版本升级与内核兼容问题很多人在CentOS 7.6上装新版Docker后发现直接跑不起来最常见的报错是Error starting daemon: error initializing graphdriver: operation not permitted这是因为新版Docker对新内核特性有依赖而CentOS 7.6的3.10内核太老某些namespace能力缺失。这种情况有几个选择把Docker版本降级到和内核匹配的版本比如20.10.x系列。给CentOS 7.6换新版内核比如通过elrepo源安装kernel-lt版本。但这个操作有风险换内核后第三方模块可能不兼容生产环境慎用。换用containerd或podman这类不依赖Docker存储驱动的方案。我的建议是存量CentOS 7.6机器就老实装20.10系列不要追新。新机器直接用CentOS 7.9或者Ubuntu 22.04跑新版本Docker各取所长没必要在7.6上硬上最新版。6. 进阶使用技巧与实战示例6.1 Docker Compose的安装与基础用法装了Docker不代表万事大吉实际项目里多容器编排是常态。Docker Compose可以把一堆容器的启动参数写在一个yaml文件里一条命令拉起来。CentOS 7.6上装docker-compose我习惯用二进制方式sudo curl -L https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose注意docker-compose的版本尽量和docker-ce匹配。太高版本可能要求新的glibc太低版本不支持新版docker的某些特性。装好后验证docker-compose version如果因为网络原因下载不了也可以换个下载源或者找同事帮拉到内网但本质还是版本匹配问题。Compose文件的写法这里不展开太多核心是把docker run的参数翻译成yaml。比如前面那个test-nginx写成Compose文件就是version: 3 services: nginx: image: nginx:1.24 container_name: test-nginx ports: - 8080:80然后执行docker-compose up -d效果和docker run一致。6.2 实战用Docker部署MySQL 8.0并使用有了Docker基础部署MySQL 8.0是很多人接触Docker后的第一个实战项。这里有一个关键点mysql容器崩溃后数据不能丢所以必须挂载数据目录。创建数据目录并启动sudo mkdir -p /opt/mysql/{data,conf,logs} sudo docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDTest123456 \ -v /opt/mysql/data:/var/lib/mysql \ -v /opt/mysql/conf:/etc/mysql/conf.d \ --restartalways \ mysql:8.0这里解释几个参数-e MYSQL_ROOT_PASSWORD指定root密码这是mysql官方镜像的初始化机制。-v挂载宿主机目录到容器目录数据持久化到宿主机。--restartalways让Docker守护进程在容器退出或宿主机重启后自动拉起容器。启动后进入容器执行SQLsudo docker exec -it mysql8 mysql -uroot -p输入密码就能进MySQL命令行。如果你用工具连接时报错Authentication plugin caching_sha2_password是因为MySQL 8.0默认加密插件改了可以用下面命令兼容老客户端ALTER USER root% IDENTIFIED WITH mysql_native_password BY Test123456;这个坑是MySQL 8.0部署后最常遇到的提前写在这里省得你绕路。6.3 实战用Docker部署Redis主从Redis用Docker部署典型的Redis主从模式。redis主从的实现很简单主节点写数据从节点通过replicaof配置同步过来。先起主节点sudo docker run -d --name redis-master -p 6379:6379 redis:7.0再起从节点并指定主节点地址sudo docker run -d --name redis-slave-1 -p 6380:6379 \ --link redis-master:master \ redis:7.0 redis-server --replicaof master 6379--link是老式的容器互连方式新版本虽然不推荐但在临时环境配置Redis主从很方便几分钟就能搭起来。验证主从状态sudo docker exec -it redis-slave-1 redis-cli info replication看到role:slavemaster_link_status:up说明主从同步成功。往主节点写入一个key从节点立刻能读出来就说明同步链路通了。6.4 生产环境的几个安全与性能小经验最后说几条我在生产环境摸爬滚打总结的经验永远不要用root直接跑容器命令养成加sudo的习惯或者用普通用户配合sudo。容器内日志一定要限制大小前面daemon.json里的log-opts配置就是干这个的。日志爆盘是生产事故排行榜常客。容器配置了--restartalways不代表永远不挂资源不足内存、磁盘时守护进程照样会报错监控还是要做。不要在容器里跑init进程或者systemd除非特殊需求。容器是单进程模型业务进程应该作为PID 1。定期执行docker image prune清理悬挂镜像docker system df可以看磁盘占用避免镜像越堆越多。个人在实际操作中的体会是CentOS 7.6装Docker最难的从来不是敲那几条命令而是环境检查和版本选择。只要在安装前把内核、防火墙、SELinux、repo源这四件事处理好后面基本顺风顺水。最后再分享一个小技巧如果你手头有多个CentOS 7.6服务器要批量装Docker第一次手动装好一台配置好镜像加速后把/etc/docker/daemon.json和基础镜像仓库打包配合Ansible的批量分发一台新机器从上手到能用控制在十分钟内。这个思路比每次手工敲命令高效得多也减少了人为配置差异。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑