docker-network-test.sh 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #!/bin/bash
  2. # Docker容器内RTSP连接测试脚本
  3. set -e
  4. # 颜色定义
  5. RED='\033[0;31m'
  6. GREEN='\033[0;32m'
  7. YELLOW='\033[1;33m'
  8. NC='\033[0m'
  9. print_info() {
  10. echo -e "${GREEN}[INFO]${NC} $1"
  11. }
  12. print_warn() {
  13. echo -e "${YELLOW}[WARN]${NC} $1"
  14. }
  15. print_error() {
  16. echo -e "${RED}[ERROR]${NC} $1"
  17. }
  18. # 在Docker容器内测试RTSP连接
  19. test_rtsp_in_docker() {
  20. print_info "=========================================="
  21. print_info "Docker容器内RTSP连接测试"
  22. print_info "=========================================="
  23. # 确保容器正在运行
  24. if ! docker ps | grep -q jtjai_media; then
  25. print_error "jtjai_media容器未运行,请先启动容器"
  26. return 1
  27. fi
  28. print_info "容器状态: ✅ 运行中"
  29. # 在容器内执行网络诊断
  30. print_info "容器内网络环境:"
  31. docker exec jtjai_media bash -c "
  32. echo '=== 网络配置 ==='
  33. ip addr show | grep inet
  34. echo ''
  35. echo '=== DNS配置 ==='
  36. cat /etc/resolv.conf
  37. echo ''
  38. echo '=== 路由表 ==='
  39. ip route show
  40. echo ''
  41. "
  42. # 测试从容器内访问RTSP URLs
  43. print_info "测试容器内RTSP连接..."
  44. # 读取配置文件中的RTSP URLs
  45. local urls=($(grep -o '"rtsp://[^"]*"' config.json | sed 's/"//g'))
  46. for url in "${urls[@]}"; do
  47. print_info "测试RTSP URL: $url"
  48. # 解析主机和端口
  49. local host=$(echo $url | sed -n 's|rtsp://\([^:]*\):\([0-9]*\)/.*|\1|p')
  50. local port=$(echo $url | sed -n 's|rtsp://\([^:]*\):\([0-9]*\)/.*|\2|p')
  51. if [[ -n "$host" && -n "$port" ]]; then
  52. print_info "目标: $host:$port"
  53. # 在容器内测试连接
  54. if docker exec jtjai_media timeout 10 nc -z $host $port 2>/dev/null; then
  55. print_info "✅ 容器内端口连接成功"
  56. else
  57. print_error "❌ 容器内端口连接失败"
  58. fi
  59. # 测试DNS解析
  60. if docker exec jtjai_media nslookup $host > /dev/null 2>&1; then
  61. print_info "✅ 容器内DNS解析成功"
  62. else
  63. print_error "❌ 容器内DNS解析失败"
  64. fi
  65. else
  66. print_error "无法解析RTSP URL格式: $url"
  67. fi
  68. echo ""
  69. done
  70. }
  71. # 比较宿主机和容器的网络差异
  72. compare_network() {
  73. print_info "=========================================="
  74. print_info "宿主机vs容器网络对比"
  75. print_info "=========================================="
  76. echo "🖥️ 宿主机网络信息:"
  77. echo " 外网IP: $(timeout 5 curl -s ifconfig.me || echo '获取失败')"
  78. echo " DNS: $(cat /etc/resolv.conf | grep nameserver | head -1 | awk '{print $2}')"
  79. echo " 网关: $(ip route | grep default | awk '{print $3}')"
  80. echo ""
  81. if docker ps | grep -q jtjai_media; then
  82. echo "🐳 容器网络信息:"
  83. docker exec jtjai_media bash -c "
  84. echo ' 容器IP: '$(ip addr show eth0 2>/dev/null | grep 'inet ' | awk '{print $2}' || echo 'host模式')
  85. echo ' DNS: '$(cat /etc/resolv.conf | grep nameserver | head -1 | awk '{print $2}')
  86. echo ' 网关: '$(ip route | grep default | awk '{print $3}' || echo 'host模式')
  87. " 2>/dev/null || echo " 网络模式: host模式"
  88. else
  89. print_warn "容器未运行,无法获取容器网络信息"
  90. fi
  91. echo ""
  92. }
  93. # 提供解决方案建议
  94. provide_solutions() {
  95. print_info "=========================================="
  96. print_info "常见解决方案"
  97. print_info "=========================================="
  98. echo "如果遇到连接问题,可以尝试以下方案:"
  99. echo ""
  100. echo "1. 🌐 使用host网络模式 (推荐)"
  101. echo " - 修改docker-compose.yml添加: network_mode: host"
  102. echo " - 或使用: docker run --network host"
  103. echo ""
  104. echo "2. 🔧 调整超时设置"
  105. echo " - 增加config.json中的connection_timeout_seconds"
  106. echo " - 增加read_timeout_seconds"
  107. echo ""
  108. echo "3. 🛠️ 检查防火墙设置"
  109. echo " - 确保RTSP端口(通常554或自定义端口)未被阻止"
  110. echo " - 检查iptables规则"
  111. echo ""
  112. echo "4. 🌍 DNS配置"
  113. echo " - 在docker-compose.yml中添加public DNS:"
  114. echo " dns:"
  115. echo " - 8.8.8.8"
  116. echo " - 114.114.114.114"
  117. echo ""
  118. echo "5. 📡 网络驱动"
  119. echo " - 如果使用bridge网络,考虑切换到host模式"
  120. echo " - 或创建自定义网络"
  121. echo ""
  122. }
  123. # 主函数
  124. main() {
  125. echo ""
  126. print_info "Docker RTSP连接诊断工具"
  127. echo ""
  128. # 检查Docker是否安装
  129. if ! command -v docker &> /dev/null; then
  130. print_error "Docker未安装"
  131. exit 1
  132. fi
  133. # 比较网络环境
  134. compare_network
  135. # 测试容器内连接
  136. test_rtsp_in_docker
  137. # 提供解决方案
  138. provide_solutions
  139. print_info "诊断完成!"
  140. }
  141. # 执行主函数
  142. main