Docker-Compose部署API/Portal/MySQL无法连接MySQL主机求助
解决Docker-Compose中API/Portal无法连接MySQL的问题
看起来你的API和前端都连不上MySQL,我帮你梳理下问题根源和修复步骤:
1. 核心问题:端口配置搞混了
首先得明确一个Docker容器通信的关键逻辑:同一个自定义网络里的服务,互相访问用的是容器内部的端口,不是主机映射的端口。
看你的配置:
- MySQL的
ports写的是"3306:4406",这是把主机的3306端口映射到容器的4406端口,但MySQL容器默认的服务端口是3306,你等于强制让容器内的MySQL用了非标准端口,而且连接字符串里还写了port=4406——但其实容器间通信根本不需要用主机映射的端口,直接用容器内部的端口就行。
2. 一步步修复
第一步:修正MySQL的端口映射
把MySQL的端口映射改成"4406:3306"(主机端口4406映射到容器内部的默认3306端口),这样既不影响主机访问MySQL,也符合容器内部的服务端口规范:
services: xmysql: # ...其他配置不变 ports: - "4406:3306"
第二步:修正连接字符串的端口
因为容器内部MySQL用的是默认3306端口,所以API和Portal的连接字符串里的port要改成3306,而不是4406:
"ConnectionString": "server=xmysql;port=3306;Database=sbs_hani;User ID=hani;Password=123456; persistsecurityinfo=True;Charset=utf8; TreatTinyAsBoolean=false;"
第三步:优化配置(可选但推荐)
- Docker-Compose 3+版本里,
links已经被自定义网络取代了,同一个xnetwork里的服务可以直接通过服务名(比如xmysql)访问,所以可以删掉xapi和xportal里的links配置,简化文件。 - 给MySQL加个健康检查,确保它完全启动就绪后再启动API和Portal(
depends_on只保证启动顺序,不保证服务就绪):
给xmysql服务添加:
然后修改xapi和xportal的healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "hani", "-p123456"] interval: 10s timeout: 5s retries: 5depends_on:depends_on: xmysql: condition: service_healthy
3. 完整修正后的docker-compose.yml
version: '3' services: xmysql: container_name: xmysql hostname: xmysql image: mysql:latest restart: always environment: MYSQL_ROOT_PASSWORD: "123456" MYSQL_DATABASE: "sbs_hani" MYSQL_USER: "hani" MYSQL_PASSWORD: "123456" ports: - "4406:3306" networks: - xnetwork volumes: - data-volume:/var/lib/mysql - ./hanimysql/sbs_hani.sql:/docker-entrypoint-initdb.d/sbs_hani.sql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "hani", "-p123456"] interval: 10s timeout: 5s retries: 5 xapi: container_name: xapi hostname: xapi image: microsoft/dotnet:latest # restart: always tty: true command: ["dotnet", "/var/lib/volhaniapi/hani.APIs.dll"] ports: - "8081:80" - "8444:443" networks: - xnetwork depends_on: xmysql: condition: service_healthy volumes: - ./haniapi/:/var/lib/volhaniapi/ xportal: container_name: xportal hostname: xportal image: microsoft/dotnet:latest # restart: always tty: true command: ["dotnet", "/var/lib/volhaniportal/hani.Portal.dll"] ports: - "8083:80" - "8446:443" networks: - xnetwork depends_on: xmysql: condition: service_healthy volumes: - ./haniportal/:/var/lib/volhaniportal/ xfront: container_name: xfront hostname: xfront image: nginx:stable-alpine # restart: always ports: - "8082:80" - "4445:443" networks: - xnetwork depends_on: - xapi volumes: - ./hanifront/:/usr/share/nginx/html volumes: data-volume: {} networks: xnetwork: driver: bridge
最后,执行以下命令重启服务(清除旧数据卷避免初始化问题):
docker-compose down -v docker-compose up -d
内容的提问来源于stack exchange,提问作者Hani Gerges
相关产品推荐
相关产品推荐

