Docker Compose部署.NET+MySQL时无法连接MySQL主机问题排查
问题分析与解决方案
核心问题1:连接字符串的主机地址错误
你的API容器里的localhost指向的是容器自身,而非宿主机上的MySQL容器。在Docker Compose默认创建的内部网络中,服务名称可直接作为域名解析到对应容器的IP,因此连接字符串里的server需改为MySQL服务的名称db,而非localhost。
修改后的连接字符串:
"Release": "server=db; userid=root;pwd=12345;port=3306;database=lc_dbt"
核心问题2:depends_on的局限性
depends_on: - db仅能保证db容器先于lc_erp启动,但无法确保MySQL服务已完成初始化并处于可连接状态。若API容器启动时MySQL仍在初始化,就会出现连接失败的情况。
可通过添加健康检查解决该问题,让lc_erp容器等待MySQL服务就绪后再启动:
修改后的docker-compose.yaml:
version: '3.4' services: db: image: mysql ports: - "3306:3306" environment: MYSQL_DATABASE: lc_dbt MYSQL_ROOT_PASSWORD: 12345 volumes: - ./dbdata:/var/lib/mysql - ./_MySQL_Init_Script:/docker-entrypoint-initdb.d restart: always healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p12345"] interval: 5s timeout: 5s retries: 5 lc_erp: depends_on: db: condition: service_healthy image: ${DOCKER_REGISTRY-}lcerp build: context: . dockerfile: LC_ERP/Dockerfile
额外说明
- 健康检查通过
mysqladmin ping命令验证MySQL服务是否就绪,每隔5秒检查一次,最多重试5次。 - 修改连接字符串后,API容器可通过Docker内部网络访问MySQL容器,无需依赖宿主机的端口映射(端口映射可保留,方便外部工具连接)。
内容的提问来源于stack exchange,提问作者Åfsħąl Ãtħąr
相关产品推荐
相关产品推荐

