尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

CentOS 7.3 环境下 Docker 部署 RabbitMQ 全流程详解与实战

CentOS 7.3 环境下 Docker 部署 RabbitMQ 全流程详解与实战 1. 项目概述与核心价值最近在帮一个朋友的公司做一套内部服务治理平台的迁移他们原来的环境是直接在物理机上跑各种服务管理起来非常混乱每次更新都像是一场灾难。这次的目标是把几个核心的中间件特别是消息队列全部容器化。他们指定的基础环境是 CentOS 7.3消息队列选型是 RabbitMQ。这个组合其实挺经典的CentOS 7.3 作为老牌稳定的服务器操作系统至今仍在很多企业的生产环境中服役而 RabbitMQ 作为老牌且功能丰富的消息队列在需要可靠消息传递的场景里依然是首选。直接在这台“老伙计”上安装 RabbitMQ虽然也能跑但会面临依赖管理复杂、版本隔离困难、环境不一致等一系列问题。所以我们的方案很明确先上 Docker再把 RabbitMQ 跑在容器里。这么做的好处是显而易见的。首先Docker 提供了完美的环境隔离RabbitMQ 及其所有依赖比如 Erlang 运行时都被打包在一个镜像里与宿主机环境彻底解耦。这意味着你再也不用担心因为系统升级或者安装其他软件而把 RabbitMQ 的环境搞乱。其次部署和升级变得极其简单一个docker run命令就能拉起一个标准化的 RabbitMQ 服务版本切换也就是换个镜像标签的事。最后它为未来的微服务化或集群部署铺平了道路利用 Docker Compose 或 Kubernetes 可以轻松管理多个服务实例。这篇文章我就来详细拆解一下在 CentOS 7.3 这个特定环境下从零开始安装 Docker再到部署一个功能完整、配置妥当的 RabbitMQ 容器的全过程。我会把每一步背后的原理、可能遇到的坑以及我积累的一些实用技巧都分享出来目标是让你看完之后能独立、顺利地在自己的 CentOS 7.3 服务器上完成这一切。2. 环境准备与系统检查在动手安装任何软件之前对服务器进行一次“体检”是很有必要的。这能避免很多因环境问题导致的安装失败或运行时异常。2.1 系统版本与内核确认CentOS 7.3 是一个比较老的版本了其默认内核可能不支持 Docker 所需的一些新特性。我们首先需要确认系统信息。打开终端执行以下命令cat /etc/redhat-release uname -r第一行命令会输出类似CentOS Linux release 7.3.1611 (Core)的信息确认我们的系统版本。第二行命令输出内核版本对于 Docker建议内核版本在 3.10 以上。CentOS 7.3 自带的内核通常是 3.10.x这满足了最低要求但为了获得更好的稳定性和性能我强烈建议将内核升级到更新的长期支持版本。注意直接yum update可能不会更新内核。CentOS 默认使用yum的更新策略会保留旧内核。如果需要升级可以安装elrepo源并安装新内核但这有一定风险需在测试环境先行验证。对于生产环境如果现有内核3.10运行 Docker 无问题保守起见可以不升级。本文后续操作基于 3.10 内核。2.2 关闭 SELinux 与防火墙策略调整SELinux 是 Linux 一个强大的安全模块但在初期学习和部署 Docker 时它复杂的策略经常成为拦路虎导致容器内服务无法正常访问宿主机资源或网络。为了减少复杂度我们通常先将其设置为宽容模式。临时关闭 SELinux重启后失效setenforce 0永久关闭 SELinux需重启生效sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config同样防火墙也需要配置。Docker 守护进程会动态管理iptables规则来为容器提供网络。如果系统防火墙firewalld正在运行它可能会干扰 Docker 的规则。有两种处理方式一是停止并禁用 firewalld完全依赖 Docker 管理二是在 firewalld 中开放 Docker 需要的端口。对于学习或内部环境第一种方式更简单。停止并禁用 firewalldsystemctl stop firewalld systemctl disable firewalld如果你必须开启防火墙则需要为后续 RabbitMQ 要用的端口如 5672, 15672以及 Docker 自身的端口如 2375如果开启远程API添加放行规则。2.3 安装基础依赖与配置 Yum 源安装一些必要的工具包并清理旧的 Docker 版本如果存在。yum install -y yum-utils device-mapper-persistent-data lvm2yum-utils提供了yum-config-manager工具device-mapper-persistent-data和lvm2是 Docker 使用的存储驱动devicemapper所需的依赖虽然我们后续可能用overlay2但先装上无害。接下来我们需要添加 Docker 的官方 Yum 仓库。CentOS 7 默认的源里没有 Docker CE社区版。yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo这个命令会在/etc/yum.repos.d/目录下创建一个docker-ce.repo文件里面配置了 Docker 官方针对 CentOS 的软件源地址。有时候网络原因可能导致添加失败你可以先尝试ping download.docker.com测试连通性。如果无法访问可以考虑使用国内镜像源例如阿里云或清华大学的镜像具体替换方法需要查找对应镜像站的帮助文档。3. Docker 引擎的安装与配置环境准备妥当后我们就可以开始安装 Docker 引擎本身了。3.1 安装 Docker CE 及命令行工具有了官方源安装就变得非常简单。我们安装指定版本以确保环境的一致性避免因版本自动升级引入意外问题。首先查看源里有哪些版本yum list docker-ce --showduplicates | sort -r在输出列表里你会看到很多版本格式如3:20.10.9-3.el7。我们选择一个较新且稳定的版本例如20.10.9。安装命令如下yum install -y docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io这里安装了三个包docker-ce是 Docker 守护进程和客户端docker-ce-cli是命令行接口containerd.io是一个行业标准的容器运行时Docker 底层会使用它来管理容器生命周期。安装完成后启动 Docker 服务并设置开机自启systemctl start docker systemctl enable docker验证安装是否成功运行经典的hello-world镜像docker run hello-world如果看到一串欢迎信息最后有Hello from Docker!说明 Docker 引擎已经安装并运行正常。这个命令会从 Docker Hub 拉取hello-world镜像并运行一个容器。3.2 配置 Docker 守护进程与镜像加速默认安装的 Docker 有几个地方需要优化。首先是镜像拉取速度从 Docker Hub 直接拉取在国内可能很慢。我们可以配置国内镜像加速器。创建或修改 Docker 的守护进程配置文件/etc/docker/daemon.jsoncat /etc/docker/daemon.json EOF { registry-mirrors: [ https://registry.docker-cn.com, https://hub-mirror.c.163.com, https://mirror.baidubce.com ], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, data-root: /var/lib/docker } EOFregistry-mirrors配置了三个国内常用的镜像加速地址Docker 会按顺序尝试。你可以根据网络情况选择其中一个或保留多个。log-driver和log-opts配置容器的日志驱动为json-file并限制单个日志文件最大 100MB最多保留 3 个文件防止容器日志占满磁盘。>systemctl restart docker重启后可以用docker info命令查看在输出底部如果看到Registry Mirrors下列出了你配置的地址说明加速器配置成功。3.3 存储驱动选择与磁盘空间规划Docker 的存储驱动决定了镜像和容器层如何在宿主机上存储。对于 CentOS 7.3默认的存储驱动可能是devicemapper但其性能在 loop-lvm 模式下不佳。更推荐使用overlay2驱动它性能更好但需要内核版本 4.0 或 RHEL/CentOS 内核版本 3.10.0-693 且文件系统是xfs并支持d_typetrue。检查文件系统是否支持d_typexfs_info / | grep ftype如果输出中ftype1则支持。如果支持我们可以将存储驱动改为overlay2。在/etc/docker/daemon.json中添加或修改storage-driver选项{ ... // 之前的配置 storage-driver: overlay2 }再次重启 Docker。使用docker info查看Storage Driver一行确认。另一个重要点是磁盘空间。/var/lib/docker会存放所有镜像、容器、卷和构建缓存。对于生产环境务必确保该分区有充足的空间建议至少 50GB。你可以通过df -h /var/lib/docker查看。如果空间不足可以考虑通过挂载新硬盘、软链接到其他分区或者在安装前就在daemon.json中通过>docker pull rabbitmq:3.9.7-management拉取完成后可以先以最简单的方式运行一个临时容器测试镜像是否正常。docker run -d --name rabbitmq-test -p 5672:5672 -p 15672:15672 rabbitmq:3.9.7-management-d后台运行容器。--name rabbitmq-test给容器起个名字方便后续管理。-p 5672:5672将容器的 5672 端口映射到宿主机的 5672 端口。-p 15672:15672将容器的 15672 端口映射到宿主机的 15672 端口。运行后使用docker ps查看容器状态应该是Up。然后访问http://你的服务器IP:15672应该能看到 RabbitMQ 的管理登录界面。默认用户名和密码都是guest。注意guest用户默认只允许从本地主机localhost连接。所以即使你能打开管理页面用guest/guest从外部 IP 登录可能会被拒绝。这是 RabbitMQ 的安全策略。我们下一步就来解决这个问题并完善部署。测试完毕后删除这个临时容器docker stop rabbitmq-test docker rm rabbitmq-test5.2 生产级部署持久化、配置与安全现在我们来部署一个用于实际使用或开发的、配置更完善的 RabbitMQ 容器。第一步准备宿主机目录我们在宿主机上创建目录用于持久化数据和配置。mkdir -p /opt/rabbitmq/data mkdir -p /opt/rabbitmq/conf chmod 777 /opt/rabbitmq/data # 简单处理权限生产环境应更精细/opt/rabbitmq/data用于挂载 RabbitMQ 的数据存储目录。/opt/rabbitmq/conf可以用于存放自定义配置文件。第二步创建自定义配置文件RabbitMQ 新版本主要使用rabbitmq.conf文件进行配置。我们可以创建一个基础配置。在/opt/rabbitmq/conf目录下创建rabbitmq.conf文件cat /opt/rabbitmq/conf/rabbitmq.conf EOF # 设置默认虚拟主机 default_vhost / # 设置默认用户guest的标签决定其权限 default_user guest default_pass guest # 允许默认用户从远程连接仅用于测试/内部环境生产环境务必创建新用户并禁用guest或限制其权限 loopback_users.guest false # 设置磁盘空闲空间告警阈值相对值 disk_free_limit.relative 1.0 # 设置内存使用高水位线80% vm_memory_high_watermark.relative 0.8 EOF这个配置做了几件事允许guest用户远程登录方便初学测试生产环境极度不推荐设置了磁盘和内存的监控阈值。生产环境中你应该创建专属用户并赋予权限然后禁用或严格限制guest用户。第三步启动生产级容器使用以下命令启动容器整合了持久化、配置和网络。docker run -d \ --name rabbitmq \ --hostname my-rabbit \ -p 5672:5672 \ -p 15672:15672 \ -v /opt/rabbitmq/data:/var/lib/rabbitmq \ -v /opt/rabbitmq/conf/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \ -e RABBITMQ_DEFAULT_USERadmin \ -e RABBITMQ_DEFAULT_PASSyour_strong_password \ rabbitmq:3.9.7-management让我逐一解释这些参数--hostname my-rabbit设置容器内 RabbitMQ 节点的主机名。这在集群部署时非常重要单节点也可设置。-v /opt/rabbitmq/data:/var/lib/rabbitmq将宿主机的数据目录挂载到容器内的 RabbitMQ 数据目录。这样即使容器销毁数据也不会丢失。-v /opt/rabbitmq/conf/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf将我们自定义的配置文件挂载到容器内的配置路径。注意官方镜像的rabbitmq.conf可能默认不存在挂载一个文件进去会直接覆盖。你也可以使用环境变量RABBITMQ_CONFIG_FILE来指定配置文件路径但挂载是最直接的方式。-e RABBITMQ_DEFAULT_USERadmin和-e RABBITMQ_DEFAULT_PASS...这两个是非常有用的环境变量。它们会在 RabbitMQ 首次启动时创建一个指定的默认用户并赋予管理员权限同时会禁用默认的guest用户。这比我们之前在配置文件里设置loopback_users.guest false要安全得多是官方推荐的做法。我们的配置文件里关于guest的设置会被这个环境变量的行为覆盖。实操心得关于配置文件和环境变量的优先级需要留意。如果同时使用了环境变量RABBITMQ_DEFAULT_USER和配置文件中的default_user环境变量通常优先级更高。最稳妥的方式是使用环境变量设置默认管理员账号这会禁用guest使用配置文件进行其他精细化的参数调优。启动后同样用docker ps和docker logs rabbitmq查看状态和日志。现在你可以通过http://服务器IP:15672访问管理控制台使用admin和你设置的密码登录。6. 容器管理、监控与日常维护容器跑起来不是终点如何管理好它才是关键。6.1 常用的 Docker 管理命令掌握几个核心命令就能轻松管理 RabbitMQ 容器。查看状态与日志docker ps -a # 查看所有容器包括已停止的 docker logs -f rabbitmq # 实时查看容器日志类似 tail -f docker stats rabbitmq # 实时查看容器资源占用CPU、内存、网络进入容器有时需要进入容器内部执行命令比如操作rabbitmqctl。docker exec -it rabbitmq bash进入后你就可以像在普通 Linux 系统里一样操作例如运行rabbitmqctl status查看 RabbitMQ 状态rabbitmqctl list_users查看用户。启停与删除docker stop rabbitmq # 停止容器 docker start rabbitmq # 启动已停止的容器 docker restart rabbitmq # 重启容器 docker rm -f rabbitmq # 强制删除运行中的容器数据卷需单独处理6.2 数据备份与恢复因为我们做了数据卷挂载 (-v /opt/rabbitmq/data:/var/lib/rabbitmq)所以 RabbitMQ 的所有持久化数据消息存储、元数据等都在宿主机的/opt/rabbitmq/data目录下。备份这个目录就相当于备份了 RabbitMQ 的数据。备份在 RabbitMQ 容器停止后直接打包/opt/rabbitmq/data目录。systemctl stop docker # 为了数据一致性先停Docker服务或至少停掉rabbitmq容器 tar -czf rabbitmq_backup_$(date %Y%m%d).tar.gz -C /opt/rabbitmq data systemctl start docker恢复将备份包解压到新的宿主机目录然后在启动新容器时将这个目录挂载到/var/lib/rabbitmq即可。注意事项直接备份文件系统的方式在 RabbitMQ 运行时进行是不安全的可能导致数据损坏。更可靠的方式是使用 RabbitMQ 的rabbitmqctl命令进行备份元数据并结合文件备份。对于生产环境建议在业务低峰期停止服务再进行文件备份或者采用专业的备份方案。6.3 插件管理与启用RabbitMQ 的强大功能依赖于插件。管理插件需要进入容器内部操作。进入容器docker exec -it rabbitmq bash查看已安装插件rabbitmq-plugins list启用插件例如启用 MQTT 插件rabbitmq-plugins enable rabbitmq_mqtt禁用插件rabbitmq-plugins disable rabbitmq_mqtt退出容器exit插件启用后通常需要重启 RabbitMQ 才能生效。你可以在容器内执行rabbitmqctl stop_app和rabbitmqctl start_app或者直接重启整个 Docker 容器docker restart rabbitmq。7. 常见问题与故障排查实录在实际操作中你几乎一定会遇到一些问题。这里我记录了几个最常见的问题和解决方法。7.1 管理界面无法访问或登录失败这是最高频的问题。现象浏览器打不开http://IP:15672。排查首先确认容器是否在运行 (docker ps)。然后检查防火墙是否放行了 15672 端口如果你没关闭 firewalld。在宿主机上执行curl localhost:15672如果宿主机能访问说明容器端口映射没问题问题在外部网络或防火墙。现象能打开登录页但用guest/guest登录失败。原因如果你使用了RABBITMQ_DEFAULT_USER环境变量guest用户会被禁用。解决使用你通过环境变量设置的用户名和密码如admin/your_password登录。现象使用admin也登录失败。排查查看容器日志docker logs rabbitmq看是否有错误信息。可能是密码错误或者用户创建失败。确保环境变量RABBITMQ_DEFAULT_PASS的值没有特殊字符导致解析问题最好用纯字母数字。7.2 客户端无法连接到 5672 端口现象生产/消费者程序报连接超时或拒绝连接。排查步骤 a.docker ps确认容器运行。 b.docker port rabbitmq查看端口映射是否正确。 c. 在宿主机上使用telnet 宿主机IP 5672测试端口连通性。如果不通检查宿主机防火墙。 d. 进入容器docker exec -it rabbitmq bash在容器内telnet localhost 5672。如果容器内都不通可能是 RabbitMQ 服务没正常启动检查容器日志。 e. 检查客户端连接使用的用户名密码和虚拟主机(vhost)是否正确。新创建的默认用户可能没有访问/之外 vhost 的权限。7.3 容器启动失败或不断重启查看日志docker logs rabbitmq是首要步骤。错误信息通常会直接打印出来。常见原因一权限问题。如果挂载的宿主机目录如/opt/rabbitmq/data权限不足RabbitMQ在容器内以rabbitmq用户运行无法写入会导致启动失败。解决确保宿主机目录对任意用户至少有写权限chmod 777是一种粗暴但快速的方法生产环境应设置为合适的用户组和权限例如将目录所有者改为与容器内用户相同的 UID。常见原因二端口冲突。宿主机上 5672 或 15672 端口可能已被其他程序占用。解决使用netstat -tlnp | grep :5672查看端口占用情况停止冲突程序或为 RabbitMQ 容器映射其他宿主机端口如-p 5673:5672。7.4 磁盘空间不足导致服务阻塞RabbitMQ 有一个磁盘告警机制。当磁盘剩余空间低于阈值默认是 50MB时它会阻止生产者发送消息以防止磁盘写满。现象生产者发消息失败日志或管理界面显示disk free limit set相关告警。解决清理磁盘删除旧的日志文件、不必要的镜像和容器 (docker system prune -a)。调整告警阈值在配置文件rabbitmq.conf中设置disk_free_limit.absolute 2GB或disk_free_limit.relative 1.01.0 表示与内存大小相同这是相对值设置。修改后需要重启容器。扩容磁盘这是根本解决方法。7.5 内存使用过高RabbitMQ 默认会使用最多 40% 的可用内存。在容器中这个“可用内存”指的是整个宿主机的内存而不是容器的内存限制这可能导致容器被宿主机 OOM Killer 杀掉。解决在rabbitmq.conf中明确设置内存高水位线。# 设置为 0.4 表示 40%或者使用绝对值如 2GB vm_memory_high_watermark.relative 0.4 # 更推荐结合容器限制使用绝对值例如设置为 1GB vm_memory_high_watermark.absolute 1GB同时在启动 Docker 容器时也应该通过-m参数限制容器的最大内存使用量例如-m 2g。这样 RabbitMQ 的内存限制和容器的 CGroup 限制协同工作更安全。经过以上步骤你应该已经在 CentOS 7.3 上成功搭建了一个由 Docker 容器化、数据持久化、配置可管理、并且相对安全的 RabbitMQ 服务。这套组合将老牌操作系统的稳定性和容器化技术的灵活性结合了起来无论是用于开发测试还是中小型生产环境都是一个坚实可靠的起点。记住对于生产环境务必妥善处理用户权限、网络安全、资源限制和监控告警这比单纯的安装要重要得多。
返回列表