Docker容器化高可用架构部署方案(十三) 12-验证测试本文档提供完整的验证测试命令用于验证部署是否成功。容器状态验证查看所有容器# 在每个节点执行 docker ps -aNode1预期输出CONTAINER ID IMAGE STATUS xxxxxxxxxxxx ednxzu/keepalived:2.3.4 Up X minutes xxxxxxxxxxxx nginx:alpine Up X minutes xxxxxxxxxxxx nginx:alpine Up X minutes xxxxxxxxxxxx php:8.2-fpm-alpine Up X minutes xxxxxxxxxxxx redis:7-alpine Up X minutes xxxxxxxxxxxx redis:7-alpine Up X minutes xxxxxxxxxxxx mysql:8.0 Up X minutesNode1预期容器列表mysql-01, redis-master, sentinel-01, nginx-lb, keepalived, php, php-fpm7个容器Node2预期容器列表mysql-02, redis-slave, sentinel-02, nginx-lb, keepalived, php, php-fpm7个容器Node3预期容器列表mysql-03, redis-slave, sentinel-03, nginx-lb, keepalived, php, php-fpm, backup-server8个容器查看容器详情docker ps --format table {{.Names}}\t{{.Status}}\t{{.Ports}}检查容器健康状态# 检查所有健康检查 docker ps --filter healthhealthyVIP验证查看VIP绑定# 查看VIP是否绑定到MASTER节点 docker exec keepalived ip addr show eth0 | grep 172.20.1.100 ​ # 预期输出inet 172.20.1.100/24 scope global secondary eth0测试VIP连通性# 从任意节点测试 ping -c 3 172.20.1.100 ​ # 从外部测试物理机 ping -c 3 172.20.1.100查看Keepalived状态docker exec keepalived cat /var/log/keepalived-notify.log ​ # 或查看VRRP状态 docker exec keepalived ip addr showNginx-LB验证健康检查测试# 测试每个Nginx-LB curl http://172.20.1.11/health curl http://172.20.1.12/health curl http://172.20.1.13/health ​ # 预期输出healthy通过VIP测试curl http://172.20.1.100/healthPHP服务验证健康检查测试# 测试每个PHP服务 curl http://172.20.2.11/health curl http://172.20.2.12/health curl http://172.20.2.13/health # 预期输出php-healthy创建测试页面部署一个用户登录注册界面用于验证PHPMySQLRedis全链路# 将index.php复制到共享卷 docker run --rm -v web-data:/data -v /opt/cluster-deploy/config/php/index.php:/index.php alpine cp /index.php /data/说明index.php已包含在config/php/index.php中是一个完整的登录注册系统 连接MySQL MGR172.20.4.11进行用户认证支持注册和登录功能。PHP测试# 直接访问PHP服务返回登录页面HTML curl -L http://172.20.2.11/index.php | head -20 curl -L http://172.20.2.12/index.php | head -20 curl -L http://172.20.2.13/index.php | head -20 # 通过Nginx-LB访问 curl -L http://172.20.1.11/index.php | head -20 curl -L http://172.20.1.100/index.php | head -20Redis集群验证健康检查测试# 测试Redis Master docker exec redis-master redis-cli -a YourStr0ng!Pass ping # 测试Redis Slave docker exec redis-slave redis-cli -a YourStr0ng!Pass ping查看复制状态# 查看主从复制状态 docker exec redis-master redis-cli -a YourStr0ng!Pass info replication # 预期输出 # role:master # connected_slaves:2 # slave0:ip172.20.3.12,port6379,stateonline # slave1:ip172.20.3.13,port6379,stateonline测试数据同步# 在Master写入 docker exec redis-master redis-cli -a YourStr0ng!Pass SET test_key Hello from Master # 在Slave读取 docker exec redis-slave redis-cli -a YourStr0ng!Pass -h 172.20.3.11 GET test_keySentinel验证健康检查测试# 测试每个Sentinel docker exec sentinel-01 redis-cli -p 26379 ping docker exec sentinel-02 redis-cli -p 26379 ping docker exec sentinel-03 redis-cli -p 26379 ping查看Sentinel主节点信息# 查看Sentinel认为的主节点 docker exec sentinel-01 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster # 预期输出172.20.3.11 6379查看所有Sentineldocker exec sentinel-01 redis-cli -p 26379 SENTINEL sentinels mymaster查看从节点docker exec sentinel-01 redis-cli -p 26379 SENTINEL slaves mymasterMySQL MGR验证健康检查测试# 测试每个MySQL docker exec mysql-01 mysqladmin -uroot -pYourStr0ng!Pass ping -h127.0.0.1 docker exec mysql-02 mysqladmin -uroot -pYourStr0ng!Pass ping -h127.0.0.1 docker exec mysql-03 mysqladmin -uroot -pYourStr0ng!Pass ping -h127.0.0.1查看MGR成员状态docker exec mysql-01 mysql -uroot -pYourStr0ng!Pass -h127.0.0.1 -e SELECT member_id, member_host, member_port, member_role, member_state FROM performance_schema.replication_group_members WHERE channel_name group_replication_applier; 预期输出三个节点都是ONLINE查看主节点docker exec mysql-01 mysql -uroot -pYourStr0ng!Pass -h127.0.0.1 -e SELECT member_id, member_host, member_role FROM performance_schema.replication_group_members WHERE member_role PRIMARY; 数据复制测试# 在Primary写入 docker exec mysql-01 mysql -uroot -pYourStr0ng!Pass -h127.0.0.1 -e USE app_db; INSERT INTO test_mgr (content) VALUES (Test at $(date)); SELECT * FROM test_mgr; # 在Secondary验证 docker exec mysql-02 mysql -uroot -pYourStr0ng!Pass -h127.0.0.1 -e USE app_db; SELECT * FROM test_mgr; docker exec mysql-03 mysql -uroot -pYourStr0ng!Pass -h127.0.0.1 -e USE app_db; SELECT * FROM test_mgr; 全链路测试通过VIP访问PHP服务# 测试1基本请求 curl -I http://172.20.1.100/ # 测试2PHP请求 curl http://172.20.1.100/index.php | grep -i php # 测试3健康检查 curl http://172.20.1.100/health测试负载均衡# 多次请求观察upstream切换 for i in {1..10}; do curl -s http://172.20.1.100/health echo done测试故障转移# 模拟Node1故障 docker stop mysql-01 # 观察VIP是否漂移到Node2 sleep 5 docker exec keepalived ip addr show eth0 # 查看MGR状态 docker exec mysql-02 mysql -uroot -pYourStr0ng!Pass -h127.0.0.1 -e SELECT member_role FROM performance_schema.replication_group_members WHERE member_rolePRIMARY; # 恢复Node1 docker start mysql-01一键验证脚本#!/bin/bash # 完整验证脚本 echo echo Docker容器化集群验证脚本 echo # 获取当前节点hostname NODE_NAME$(hostname) echo echo 【1. 容器状态检查】 echo ---------------------------------------- # 根据节点名称设置对应的容器前缀 case $NODE_NAME in *node1*|*Node1*|*NODE1*) MYSQL_CONTAINERmysql-01 REDIS_CONTAINERredis-master ;; *node2*|*Node2*|*NODE2*) MYSQL_CONTAINERmysql-02 REDIS_CONTAINERredis-slave ;; *node3*|*Node3*|*NODE3*) MYSQL_CONTAINERmysql-03 REDIS_CONTAINERredis-slave ;; *) MYSQL_CONTAINERmysql-01 REDIS_CONTAINERredis-master ;; esac for container in nginx-lb keepalived php php-fpm $REDIS_CONTAINER sentinel-01 $MYSQL_CONTAINER; do status$(docker ps --filter name$container --format {{.Status}} 2/dev/null) if [ -n $status ]; then echo ✓ $container: $status else echo ✗ $container: 未运行 fi done echo echo 【2. VIP检查】 echo ---------------------------------------- vip$(docker exec keepalived ip addr show eth0 2/dev/null | grep 172.20.1.100) if [ -n $vip ]; then echo ✓ VIP 172.20.1.100 已绑定 else echo ✗ VIP未绑定 fi echo echo 【3. 健康检查】 echo ---------------------------------------- echo Nginx-LB: curl -s http://172.20.1.11/health echo curl -s http://172.20.1.12/health echo curl -s http://172.20.1.13/health echo echo PHP服务: curl -s http://172.20.2.11/health echo curl -s http://172.20.2.12/health echo curl -s http://172.20.2.13/health echo echo Redis: docker exec $REDIS_CONTAINER redis-cli -a YourStr0ng!Pass ping 2/dev/null echo Sentinel: docker exec sentinel-01 redis-cli -p 26379 ping 2/dev/null echo MySQL: docker exec $MYSQL_CONTAINER mysqladmin -uroot -pYourStr0ng!Pass ping -h127.0.0.1 2/dev/null echo echo 【4. MGR状态检查】 echo ---------------------------------------- docker exec $MYSQL_CONTAINER mysql -uroot -pYourStr0ng!Pass -h127.0.0.1 -e SELECT member_host, member_role, member_state FROM performance_schema.replication_group_members WHERE channel_name group_replication_applier; 2/dev/null echo echo 【5. Redis复制状态】 echo ---------------------------------------- docker exec $REDIS_CONTAINER redis-cli -a YourStr0ng!Pass info replication 2/dev/null | grep -E role:|connected_slaves: echo echo echo 验证完成 echo 常见问题排查问题1容器启动失败# 查看容器日志 docker logs container_name # 查看Docker日志 journalctl -u docker -f问题2网络不通# 检查网络是否存在 docker network ls | grep -E frontend|backend|cache|database # 检查网络详情 docker network inspect frontend-net问题3VIP无法绑定# 检查网卡状态 ip link show ens33 # 检查Keepalived日志 docker logs keepalived下一步13-快速部署.md - 完整部署脚本14-运维手册.md - 日常运维指南