CentOS 7安装Docker完整指南:从yum配置到MySQL部署实战
发布时间:2026/9/7 16:23:53 作者:尧图编辑部 阅读量:1,286

CentOS 7安装Docker这可能是刚入行运维、或者自己折腾服务器的人绕不开的第一道坎。我最早是在一台CentOS 7虚拟机上踩完这个流程当时照着网上的教程一步步敲结果不是yum源配错就是Docker服务启动失败两个周末全耗在上面。后来在生产环境装了几十次把各种坑都摸了个遍才意识到只要把选型、安装、配置、排错这几个环节拆开来看整个过程其实非常清晰。这篇文章我准备把CentOS 7安装Docker的完整流程一次性写明白从为什么推荐用yum仓库安装到装完以后必须做的镜像加速、数据目录迁移、日志轮转再到配合一个实际部署MySQL 8.0的例子。不管你是Linux新手还是在服务器上正式搭建容器环境照着走基本能避开我当年踩过的那些坑。1. 为什么选CentOS 7 Docker方案选型与核心思路1.1 CentOS 7仍是生产环境的中坚力量可能有人会问CentOS 7年纪不小了为什么还要在它上面装Docker我个人的看法是服务器领域更看重稳定性而不是追新。CentOS 7虽然是“老系统”但它的生命周期足够长和RHEL保持二进制兼容大量企业业务和内部系统还在上面跑运维习惯也是围绕它建立的。相比CentOS 8 Stream的滚动更新模式CentOS 7的保守风格反而让很多团队觉得可控。Docker官方对CentOS 7的支持也一直没有掉队提供了独立的docker-ce yum仓库。也就是说装好之后可以像装普通软件一样用yum管理、升级、回滚。再加上容器技术本身就是为了解决环境一致性服务跑在容器里底层系统是什么版本的影响就小了很多所以CentOS 7加Docker的组合在存量服务器里依然非常常见。1.2 三种常用安装方式对比CentOS 7上安装Docker的方式我接触比较多的有三种yum仓库安装、官方脚本安装、二进制包手动部署。三者的差异主要集中在可维护性、自动化程度和离线部署能力上。安装方式推荐场景优点缺点yum仓库安装大多数生产环境、日常开发机依赖自动处理升级回滚方便可指定版本需要先添加三方仓库curl官方脚本临时测试、快速拉起环境一条命令搞定脚本内容不好审计后期维护不方便二进制包部署内网离线环境、定制化需求完全可控不依赖yum仓库需要手动配置systemd和目录结构我见过有人用官方脚本试了一下没成功结果yum源也被改乱了排查起来很费劲。还有一个情况是部分服务器对外网访问受限连download.docker.com都连不上这时候更多人会去下载rpm包离线装。但在网络允许的前提下我还是更推荐yum仓库安装。1.3 我为什么推荐yum仓库安装理由其实很朴素生产环境最怕“惊喜”。yum仓库安装的Docker版本来源透明、依赖关系清晰后续升级只需要yum update docker-ce就能走系统原有的软件管理流程出问题时也能通过yum history回滚。尤其是要批量维护多台机器的时候写一个固定的yum安装命令比每台机器跑脚本要规范得多。另外CentOS 7自带的extras源里其实有一个旧版docker包名字不叫docker-ce而是docker。这个版本非常老很多人没注意直接yum install docker就装上了虽然是Docker但跟官方docker-ce的更新节奏完全脱节。所以用yum仓库安装时我建议明确安装docker-ce并且锁定版本。这也是我在第3章里会特意展开的原因。2. 安装前的环境准备干净系统是省心的开始2.1 确认系统版本与内核要求安装之前最好先用命令确认一下当前系统版本和内核版本cat /etc/redhat-release uname -rCentOS 7默认内核是3.10.x这刚好满足Docker CE的最低内核要求所以内核不用额外动就能跑起来。不过我在实际使用中发现早期版本的3.10内核配合overlay2存储驱动时偶尔会有一些文件系统层面的问题。如果你手里的是老机器硬件又允许可以考虑升级内核到elrepo提供的长期支持版本但生产环境要谨慎不是必须的操作。架构方面x86_64是最稳妥的。ARM架构的CentOS 7虽然也有docker-ce包但兼容性上偶尔会遇到坑比如某些镜像没有arm版本。所以如果条件允许优先用x86_64服务器跑Docker。2.2 清理旧的Docker痕迹如果这台机器以前装过非docker-ce版本的Docker建议先卸干净避免和后续安装的docker-ce冲突。检查并卸载旧包yum remove docker docker-client docker-common docker-engine注意这个操作不会删除/var/lib/docker目录下的镜像、容器和数据卷如果你之前用旧Docker跑过业务数据还在。如果确认不需要保留再手动清理rm -rf /var/lib/docker我自己的习惯是先把旧数据目录重命名备份比如mv /var/lib/docker /var/lib/docker.bak而不是直接删除。毕竟在服务器上操作多一道保险就少一分事故。2.3 安装依赖工具包安装过程中会用到yum-config-manager命令它来自yum-utils。另外还需要device-mapper-persistent-data和lvm2这两个是存储驱动相关的依赖包官方文档里明确建议安装。执行下面这行命令yum install -y yum-utils device-mapper-persistent-data lvm2这一步看似简单但经常有人卡在“yum源不可用”上。如果你发现yum执行时报错或速度极慢先检查两件事一是网络通不通ping一下外网二是DNS配置/etc/resolv.conf里有没有可用的nameserver。这两点是很多服务器莫名其妙装不上东西的元凶。3. 一步步搞定Docker安装完整实操记录3.1 添加Docker官方仓库Docker官方把rpm仓库信息做成了一个repo文件可以直接通过yum-config-manager添加yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum makecache fast执行后可以检查一下仓库是否生效yum repolist | grep docker-ce如果能看到docker-ce相关的仓库说明添加成功。这里要提醒一点有些网络环境访问download.docker.com很慢甚至超时。这种情况下可以把仓库地址换成阿里云镜像站操作方式一样yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast不管是官方源还是阿里云源添加后的repo文件都是基于CentOS 7的releasever自动匹配的不用手动改文件里的版本号。3.2 安装并固定Docker版本仓库配置好之后安装最新版Docker非常简单yum install -y docker-ce但生产环境我更建议先看一下有哪些版本可选再固定版本安装yum list docker-ce --showduplicates | sort -r假设你看到3.20.10.x这样的版本号就可以按下面这种方式来装yum install -y docker-ce-20.10.23-3.el7.x86_64固定版本的好处很多当多台服务器需要保持Docker版本一致时指定版本号能避免“一台自动升级另一台没升”的尴尬同时也能防止yum update时Docker被意外升级破坏了原有容器的兼容性。我自己的习惯是安装时把版本号写进部署文档或者脚本里后续升级再统一走流程。3.3 启动Docker并设置开机自启Docker装好以后第一件事是启动服务并设置开机自启systemctl start docker systemctl enable docker systemctl status docker如果看到active (running)说明Docker daemon已经起来了。如果启动失败不要慌多半是SELinux或存储驱动的问题第6章会专门讲排查方法。这里额外说一句systemctl enable docker这个步骤特别容易被忽略。很多人装完Docker当时能用等服务器重启后却发现docker命令一直报“Cannot connect to the Docker daemon”就是因为没有设置开机自启。3.4 验证安装结果启动完成后先用docker version确认客户端和服务端都正常docker version如果输出里Client和Server两段都有完整信息说明daemon连接正常。如果只有Client没有Server大概率是daemon没起来或者当前用户没有权限访问docker.sock。接下来跑一个hello-world镜像验证整体链路docker run --rm hello-world这一步会从Docker Hub拉取一个极小的测试镜像。如果你发现拉镜像特别慢可以跳过卡顿直接先去配置第4.1节的镜像加速再回来跑这个命令。hello-world能够正常输出文字说明Docker从拉取镜像到运行容器的整个流程已经通了。3.5 常用Docker命令速查装好Docker后有几个命令是每天都会用到的我先整理成一张速查表后面讲到部署MySQL时也会用到命令作用docker pull 镜像名拉取镜像docker images查看本地镜像列表docker ps -a查看所有容器包括已停止的docker run -d 镜像名后台运行容器docker exec -it 容器名 bash进入容器交互式终端docker logs -f 容器名实时查看容器日志docker stop / start 容器名停止 / 启动容器docker rm 容器名删除容器docker rmi 镜像名删除镜像不用着急背实际操作几次就会形成肌肉记忆。4. 安装后的关键配置让Docker真正好用4.1 配置镜像加速解决拉镜像慢的问题Docker默认从Docker Hub拉取镜像但国内网络环境下这个速度经常让人头疼。很多教程会告诉你“多试几次”“等一等”实际上最有效的方法是配置registry mirror也就是镜像加速地址。首先创建或修改/etc/docker/daemon.jsonvi /etc/docker/daemon.json写入{ registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com ] }保存后重启Dockersystemctl daemon-reload systemctl restart docker验证是否生效docker info | grep -A 5 Registry Mirrors如果能看到你配置的镜像地址说明已经生效。这里有一点要特别提醒镜像加速地址不保证永久有效不同时段、不同网络的可用性也完全不同。如果某个地址拉镜像报404或者超时换一个就行不要把所有地址都堆进去设置两到三个即可太多了反而会让Docker在切换时浪费时间。4.2 非root用户如何操作DockerDocker默认只有root用户和docker组里的成员可以访问。如果不想每次敲命令都加sudo可以把自己加到docker组里groupadd docker usermod -aG docker $USER然后重新登录服务器也就是退出SSH再进来或者执行newgrp docker让当前会话生效。作为运维人员我必须提醒你把用户加入docker组其实等同于给了这个用户root级别的权限因为Docker可以通过挂载宿主机目录进入系统有非常多的提权方式。所以不要图省事给所有人开docker组权限生产环境要严格控制这个组的成员。4.3 把Docker数据目录迁移到大分区Docker默认把所有镜像、容器、数据卷都存在/var/lib/docker。很多服务器根分区只有50G甚至更小跑几个带数据卷的容器就满了。我踩过类似坑MySQL容器写数据写到根分区100%最后导致整台服务器服务异常。所以安装完Docker后我会第一时间确认数据目录的位置。迁移步骤不复杂先停服务再同步数据systemctl stop docker mkdir -p /data/docker rsync -aP /var/lib/docker/ /data/docker/然后在daemon.json里指定新的data-root{ data-root: /data/docker }启动Docker并确认systemctl start docker docker info | grep Docker Root Dir如果显示/data/docker说明迁移成功。需要注意的是如果以后用systemctl stop docker停服务再启动前要保证新目录所在磁盘已经正常挂载否则Docker会尝试重建一个空的/var/lib/docker到时候数据目录混乱就麻烦了。4.4 日志轮转与资源限制配置容器日志默认不限制大小长时间运行会产生大量数据最终把磁盘打满。最典型的例子就是某个应用疯狂打印错误日志几天就把几个G空间吃掉了。这个问题靠事后删除log文件是治标不治本应该在daemon.json里配置全局日志轮转{ log-driver: json-file, log-opts: { max-size: 50m, max-file: 3 } }保存后重启Docker。这个配置的意思是每个容器最多保留3个50MB的日志文件单个日志达到50MB就滚动切割。注意这个配置只对新建的容器生效已经存在的容器需要重建才能使用新策略。资源限制方面运行容器时可以加上docker run -d --name test --memory512m --memory-swap512m --cpus1 nginx这个命令限制容器最多使用512MB内存和1个CPU核心。生产环境给每个容器设置合理的资源上限能有效避免某个容器吃光宿主机资源拖垮其他服务。4.5 安装Docker Compose如果后面要管理多容器项目Docker Compose几乎是必需品。CentOS 7上安装Compose最直接的方式是下载二进制文件curl -L https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose docker-compose --version如果你发现从GitHub下载很慢也可以把下载地址换成一个可访问的镜像站或内网地址。装好以后以后就可以用docker-compose.yml一次性定义多个服务而不是每次敲一大串docker run命令。这样既方便维护也方便团队其他人接手。5. 从空壳到实战用Docker部署MySQL 8.05.1 拉取镜像与端口规划Docker装好之后总得拿一个真实应用来跑一跑。我这边用MySQL 8.0做例子主要是因为很多人都会在CentOS 7上部署MySQL而用Docker装正好可以避免手动配置依赖和初始化的烦琐过程。先拉取MySQL 8.0镜像docker pull mysql:8.0如果不想每次都用默认最新8.0可以带上小版本号比如mysql:8.0.36这样镜像内容更可预期。拉取完成后规划端口和存储路径。假设宿主机3306端口已经被占用可以映射到33061端口docker run -d --name mysql8 -p 33061:3306 -e MYSQL_ROOT_PASSWORDYourPassword123 mysql:8.0这个命令先把临时容器跑起来验证MySQL能否正常启动。但这种方式其实不适合生产因为容器一删数据就全没了。所以接下来要做的数据卷挂载才是关键。5.2 数据卷和配置文件的正确挂载先把宿主机的数据目录准备好mkdir -p /data/mysql/{data,conf,logs}然后使用完整的docker run命令docker run -d \ --name mysql8 \ --restartalways \ -p 3306:3306 \ -v /data/mysql/conf:/etc/mysql/conf.d \ -v /data/mysql/data:/var/lib/mysql \ -v /data/mysql/logs:/var/log/mysql \ -e MYSQL_ROOT_PASSWORDYourPassword123 \ mysql:8.0这里每个挂载点都有讲究/data/mysql/data存放MySQL数据文件/data/mysql/conf存放自定义配置/data/mysql/logs存放日志。--restartalways保证Docker daemon启动时容器可以自动拉起比裸跑容器稳得多。有个细节我在实际操作中踩过坑宿主机目录的权限不对MySQL容器启动时会报权限错误导致初始化失败。解决办法是给所有者和group改成容器内MySQL用户对应的UID/GID一般MySQL官方镜像是999chown -R 999:999 /data/mysql如果你用非root用户跑容器这里就要格外注意。5.3 初始化并验证MySQL可用性启动容器后查看初始化日志docker logs -f mysql8当出现“ready for connection”时说明初始化完成。此时进入容器验证一下docker exec -it mysql8 mysql -uroot -p输入密码后执行一条SQL检查版本SELECT VERSION();如果能在宿主机上直接连MySQL最好再装一个mysql客户端或者用另一个临时容器来连docker run -it --rm mysql:8.0 mysql -h宿主机IP -P3306 -uroot -p还有一个容易被忽略的配置是字符集。MySQL 8.0默认字符集是utf8mb4但为了保险我习惯在/data/mysql/conf/my.cnf里加一段[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci保存后重启容器docker restart mysql8这样即使以后应用连接没指定字符集数据存储也默认走utf8mb4中文场景下不会出现乱码问题。6. 常见问题与排查技巧实录6.1 yum安装时找不到docker-ce包如果执行yum install docker-ce时提示找不到包或者提示No package docker-ce available大多数情况是仓库没有添加成功。可以先检查repo列表yum repolist看看docker-ce仓库是否存在。如果不存在重新执行添加仓库的命令。加了仓库之后还需要yum makecache fast让yum读取最新元数据。另外如果你用的是中科大镜像或网易镜像作为基础源只要docker-ce.repo文件里releasever正确就不会有版本匹配问题。还有个罕见情况是服务器架构不是x86_64比如ARM架构的CentOS 7yum源里虽然也有docker-ce包但有时候可能搜不到这时要确认一下uname -m。6.2 Docker服务启动失败怎么定位Docker服务启动失败第一步永远是看日志journalctl -u docker.service --no-pager | tail -n 50我遇到的最常见原因是SELinux和存储驱动。如果日志里提示SELinux相关的permission denied可以先临时关闭SELinux测试setenforce 0然后再次启动docker。如果这样能启动说明docker和SELinux策略有冲突但这种临时关闭不能作为长期方案还是要从SELinux上下文或者docker的selinux选项入手解决。另一个常见原因是overlay2存储驱动不可用可以先确认内核模块lsmod | grep overlay如果没有输出手动加载modprobe overlay如果确定是存储驱动问题可以在daemon.json里显式指定{ storage-driver: overlay2 }重启Docker。这里不建议直接换用devicemapper除非你有特殊理由否则overlay2是目前最稳定的选择。6.3 镜像下载慢或连接超时拉镜像慢第一优先是配置镜像加速这在第4.1节已经提过。如果配置了镜像加速还是慢可能是DNS解析问题尝试检查cat /etc/resolv.conf如果DNS地址不对改成可用的114.114.114.114或者内网DNS再试。还有一种情况是拉取某个镜像时一直等待最后报net/http: TLS handshake timeout。这种往往是网络波动或镜像服务临时不可用。处理思路是先重启Docker服务清掉可能卡住的连接然后换一个镜像加速地址重试。我的经验是不要在一个地址上死磕做运维要懂得“换路”。6.4 容器端口无法访问容器启动后宿主机外部访问不到端口先按下面顺序排查查看容器端口映射是否有问题docker ps检查宿主机防火墙是否放行端口firewall-cmd --list-all如果没有放行执行firewall-cmd --zonepublic --add-port3306/tcp --permanent firewall-cmd --reload进入容器检查应用是否真的在监听对应端口docker exec -it 容器名 bash netstat -tlnp如果以上都没问题再看一下Docker服务是否正常。有时候iptables规则由于其他软件冲突导致Docker网络异常重启docker服务能解决systemctl restart docker注意重启Docker会导致所有未设置--restartalways的容器停止所以要先评估影响。6.5 重启后Docker没有自动启动装完Docker当时能用重启服务器后docker命令报Cannot connect to the Docker daemon多半是开机自启没设置。检查一下systemctl is-enabled docker如果输出是disabled执行systemctl enable docker另一种情况是Docker虽然已经enable但容器没有自启。如果容器在创建时没有加--restartalways也可以之后更新策略docker update --restartalways 容器名如果你把data-root迁移到了单独磁盘还需要确保磁盘在Docker服务启动前完成挂载。否则Docker会因为找不到data-root目录而启动失败。这种情况在fstab里配置挂载顺序时要加上_netdev参数避免网络磁盘还没就绪就启动服务。最后再分享一个我自己的小习惯每次装完Docker我会第一时间把daemon.json里的镜像加速、日志轮转、data-root全部配好然后再去部署第一个容器。很多人觉得这些配置可以等出了问题再回来补但等容器日志把磁盘撑满、或者镜像拉到超时的时候你就会明白环境准备这一步省不得。按我这些年操作下来的体感前期把环境打好底子后面至少能少踩80%的坑。