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

Docker环境下修改MySQL宿主机端口后PhpMyAdmin连接失败

问题原因与解决方案

核心问题

你搞错了Docker容器间通信的端口逻辑:

  • 容器内部端口 vs 宿主机映射端口:宿主机的3360:3306映射只是给外部(比如本地终端)访问容器服务用的,容器之间通过Docker内部网络通信时,必须用容器自身监听的端口(MySQL容器内部始终是3306),而不是宿主机的映射端口。
  • 你给PhpMyAdmin设置PMA_PORT: 3360,相当于让它去访问database服务的3360端口,但MySQL容器根本没在这个端口监听,自然会连接拒绝。

正确配置方案

删除错误的PMA_PORT: 3360(或改为3306,不过默认就是3306可以不写),同时移除过时的links配置(Compose v3默认网络已支持服务名访问),可选添加健康检查确保MySQL就绪后再启动PhpMyAdmin:

version: "3"

services:
  database:
    image: mysql
    networks:
      - my-network
    ports:
      - "3360:3306"  # 仅用于本地终端等外部访问
    environment:
      MYSQL_ROOT_PASSWORD: 1009
    restart: "always"
    # 可选健康检查:确保MySQL完全启动就绪
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1009"]
      interval: 5s
      timeout: 5s
      retries: 5

  phpmyadmin:
    image: phpmyadmin
    networks:
      - my-network
    ports:
      - "8080:80"
    environment:
      PMA_HOST: database  # 通过服务名直接访问MySQL容器
    restart: "always"
    depends_on:
      database:
        condition: service_healthy  # 等待数据库健康检查通过再启动

networks:
  my-network:

补充说明

  • 本地终端能用mysql -u root -P 3360 -p连接,是因为走的是宿主机到容器的端口映射路径,和容器间通信的内部网络完全不同。
  • 如果不配置健康检查,可能出现PhpMyAdmin先启动、但MySQL还未完成初始化的情况,此时稍等1-2分钟再刷新PhpMyAdmin页面即可。

内容的提问来源于stack exchange,提问作者Denis Lopatin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:40:22