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
相关产品推荐
相关产品推荐

