Docker容器化高可用架构部署方案(十三)

12-验证测试

本文档提供完整的验证测试命令,用于验证部署是否成功。

容器状态验证

查看所有容器

复制代码
# 在每个节点执行
docker ps -a

Node1预期输出

复制代码
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 minutes

Node1预期容器列表

  • mysql-01, redis-master, sentinel-01, nginx-lb, keepalived, php, php-fpm(7个容器)

Node2预期容器列表

  • mysql-02, redis-slave, sentinel-02, nginx-lb, keepalived, php, php-fpm(7个容器)

Node3预期容器列表

  • mysql-03, redis-slave, sentinel-03, nginx-lb, keepalived, php, php-fpm, backup-server(8个容器)

查看容器详情

复制代码
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

检查容器健康状态

复制代码
# 检查所有健康检查
docker ps --filter "health=healthy"

VIP验证

查看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 show

Nginx-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/health

PHP服务验证

健康检查测试

复制代码
# 测试每个PHP服务
curl http://172.20.2.11/health
curl http://172.20.2.12/health
curl http://172.20.2.13/health

# 预期输出:php-healthy

创建测试页面

部署一个用户登录注册界面,用于验证PHP+MySQL+Redis全链路:

复制代码
# 将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 MGR(172.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 -20

Redis集群验证

健康检查测试

复制代码
# 测试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:ip=172.20.3.12,port=6379,state=online
# slave1:ip=172.20.3.13,port=6379,state=online

测试数据同步

复制代码
# 在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_key

Sentinel验证

健康检查测试

复制代码
# 测试每个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

查看所有Sentinel

复制代码
docker exec sentinel-01 redis-cli -p 26379 SENTINEL sentinels mymaster

查看从节点

复制代码
docker exec sentinel-01 redis-cli -p 26379 SENTINEL slaves mymaster

MySQL MGR验证

健康检查测试

复制代码
# 测试每个MySQL
docker exec mysql-01 mysqladmin -uroot -p'YourStr0ng!Pass' ping -h127.0.0.1
docker exec mysql-02 mysqladmin -uroot -p'YourStr0ng!Pass' ping -h127.0.0.1
docker exec mysql-03 mysqladmin -uroot -p'YourStr0ng!Pass' ping -h127.0.0.1

查看MGR成员状态

复制代码
docker exec mysql-01 mysql -uroot -p'YourStr0ng!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 -p'YourStr0ng!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 -p'YourStr0ng!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 -p'YourStr0ng!Pass' -h127.0.0.1 -e "
USE app_db;
SELECT * FROM test_mgr;
"

docker exec mysql-03 mysql -uroot -p'YourStr0ng!Pass' -h127.0.0.1 -e "
USE app_db;
SELECT * FROM test_mgr;
"

全链路测试

通过VIP访问PHP服务

复制代码
# 测试1:基本请求
curl -I http://172.20.1.100/

# 测试2:PHP请求
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 -p'YourStr0ng!Pass' -h127.0.0.1 -e "
SELECT member_role FROM performance_schema.replication_group_members WHERE member_role='PRIMARY';
"

# 恢复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_CONTAINER="mysql-01"
        REDIS_CONTAINER="redis-master"
        ;;
    *"node2"*|*"Node2"*|*"NODE2"*)
        MYSQL_CONTAINER="mysql-02"
        REDIS_CONTAINER="redis-slave"
        ;;
    *"node3"*|*"Node3"*|*"NODE3"*)
        MYSQL_CONTAINER="mysql-03"
        REDIS_CONTAINER="redis-slave"
        ;;
    *)
        MYSQL_CONTAINER="mysql-01"
        REDIS_CONTAINER="redis-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 -p'YourStr0ng!Pass' ping -h127.0.0.1 2>/dev/null

echo ""
echo "【4. MGR状态检查】"
echo "----------------------------------------"
docker exec $MYSQL_CONTAINER mysql -uroot -p'YourStr0ng!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

问题3:VIP无法绑定

复制代码
# 检查网卡状态
ip link show ens33

# 检查Keepalived日志
docker logs keepalived

下一步

相关推荐
闵孚龙9 小时前
AI Agent 构建实战:Claude Code 模式迁移、Rust 代码审查 Agent、六层架构与工程闭环全解析
人工智能·架构
vivo互联网技术9 小时前
VAPD AgentKit:可组合 Agent 前端通用库实践
前端·ai·架构·agent
米高梅狮子10 小时前
01.mysql的备份与恢复
运维·数据库·mysql·docker·容器·kubernetes·github
console.log('npc')10 小时前
Windows 11 → WSL2 → Ubuntu → Docker → Codex → Sub2API
windows·ubuntu·docker
400分10 小时前
LangChain 最新版 Zero/One/Few-Shot 提示词模板实战详解
架构
贵慜_Derek10 小时前
《从零实现 Agent 系统》连载 03|控制循环:感知—决策—行动—反思
人工智能·设计模式·架构
Duang10 小时前
我把 Claude、Codex、Copilot、Gemini 拼成了一个工作流,接力写代码
人工智能·程序员·架构
白露与泡影10 小时前
轻量级微服务发布系统:Traefik + Nomad + Consul
微服务·架构·consul
humcomm10 小时前
如何利用AI进行智能监控
人工智能·架构