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

