You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器间间歇性无法通信问题排查(phpMyAdmin与MariaDB)

问题:phpMyAdmin间歇性无法连接MariaDB容器

环境配置(docker-compose.yml)

version: "3.9"
services:
    database:
        image: mariadb:latest
        container_name: ProjectDatabases
        hostname: database
        volumes:
            - /Temp/Project/Databases:/var/lib/mysql
        environment:
            - MARIADB_ROOT_PASSWORD=KlsIghYnx
        ports:
            - 55617:3306
        logging:
            driver: none
        # restart: always
        networks:
            - ProjectNetwork
    adminer:
        image: adminer
        container_name: ProjectAdminer
        # restart: always
        logging:
            driver: none
        ports:
            - 41412:8080
        environment:
            - ADMINER_DEFAULT_SERVER=database
        networks:
            - ProjectNetwork
    pma:
        image: phpmyadmin
        container_name: ProjectPma
        restart: always
        logging:
            driver: none
        ports:
            - 34964:80
        environment: 
            - PMA_HOST=database     
        networks:
            - ProjectNetwork
networks:
    ProjectNetwork:
        name: ProjectNetwork
        driver: bridge

问题现象

  • phpMyAdmin(pma服务)间歇性无法连接database容器,无规律可循;重启容器后有时恢复正常,有时依旧失败
  • 连接失败时,进入MariaDB容器执行mariadb -pKlsIghYnx可正常操作数据库
  • 连接失败时,进入phpMyAdmin容器执行telnet database 3306会卡住

可能的原因分析

  • 容器启动顺序与依赖问题:pma服务配置了restart: always但database未开启自动重启,且没有依赖等待配置。当database启动缓慢或意外重启时,pma可能已提前启动,缓存了异常的连接状态或DNS记录,导致后续连接不稳定。
  • Docker网络DNS解析波动:Docker bridge网络的DNS服务偶尔会出现解析延迟或失效,phpMyAdmin容器无法正确解析database主机名对应的容器IP,引发telnet卡住的情况。
  • MariaDB连接数触顶:开发环境频繁操作可能导致MariaDB连接数接近上限,新连接被拒绝;若连接释放不及时,就会出现间歇性无法连接的现象。
  • 宿主机资源不足:当宿主机CPU、内存资源紧张时,容器间的网络通信可能出现阻塞,导致连接超时或卡住,这类问题会随资源波动间歇性出现。
  • MariaDB绑定地址异常:如果挂载的数据库卷中my.cnf配置被修改,可能偶尔出现bind-address未绑定0.0.0.0的情况,导致外部容器无法连接,但容器内部可正常访问。

排查与修复建议

  • 调整容器依赖与健康检查:给database开启自动重启,同时配置健康检查,让pma等待database完全就绪后再启动:
    database:
        # 保留原有配置
        restart: always
        healthcheck:
            test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "-u", "root", "-p${MARIADB_ROOT_PASSWORD}"]
            interval: 5s
            timeout: 5s
            retries: 5
    pma:
        # 保留原有配置
        depends_on:
            database:
                condition: service_healthy
    
  • 验证DNS解析:连接失败时,在phpMyAdmin容器内执行nslookup database,若无法解析到正确IP,说明是DNS问题,可尝试重启Docker网络服务。
  • 检查MariaDB连接状态:进入database容器执行mariadb -pKlsIghYnx -e "SHOW STATUS LIKE 'Threads_connected'",对比max_connections值(执行SHOW VARIABLES LIKE 'max_connections'查看),确认是否接近上限。
  • 监控宿主机资源:用top或htop查看CPU、内存使用率,排查是否存在资源波动过大的情况。
  • 检查数据库配置:查看挂载卷内的my.cnf文件,确认bind-address配置为0.0.0.0,无访问限制。

内容的提问来源于stack exchange,提问作者Big boy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 22:38:22