Docker Compose部署FastAPI连接MySQL自定义端口时连接失败求助
问题原因
在Docker Compose的网络环境中,每个容器都是独立的网络节点,127.0.0.1对API容器来说指向自身,而非MySQL容器。虽然你配置了依赖健康检查,但主机地址错误导致连接被拒绝。单独启动MySQL后本地跑API能成功,是因为此时127.0.0.1指向你的宿主机,而MySQL容器端口映射到了宿主机的17001端口。
解决步骤
1. 修改数据库配置文件的DB_HOST
把配置里的DB_HOST=127.0.0.1改成Docker Compose中MySQL服务的名称(比如你配置的database),示例:
# 数据库配置示例 DB_HOST = "database" DB_PORT = 3306 # 注意:这里用容器内部的MySQL默认端口,不是宿主机映射的17001 DB_USER = "your_user" DB_PASSWORD = "your_password" DB_NAME = "your_db"
2. 检查Docker Compose配置
确保你的docker-compose.yml配置符合以下要求:
- MySQL服务的端口映射正确(宿主机17001映射到容器3306)
- API服务的依赖和健康检查配置正确,示例:
version: '3.8' services: database: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: your_root_pw MYSQL_DATABASE: your_db MYSQL_USER: your_user MYSQL_PASSWORD: your_password ports: - "17001:3306" # 宿主机端口:容器内部端口 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s timeout: 5s retries: 5 api: build: ./your_api_dir depends_on: database: condition: service_healthy # 等待数据库健康检查通过 environment: - DB_HOST=database # 可在这里覆盖配置,或直接用修改后的配置文件 - DB_PORT=3306 ports: - "8000:8000"
3. 重启服务
执行以下命令重新部署:
docker compose down docker compose up --build
关键说明
- 容器间通信使用服务名作为主机名,Docker Compose会自动在内部网络中解析对应的容器IP。
- 容器内部的MySQL端口是默认的3306,宿主机映射的17001是给外部访问用的,容器间通信不需要使用这个映射端口。
内容的提问来源于stack exchange,提问作者Minuta18
相关产品推荐
相关产品推荐

