Docker-Compose环境下Golang无法连接MariaDB的配置问题排查
Docker-Compose配置问题导致Golang连接MariaDB DNS解析失败
问题场景
执行docker-compose up --build启动服务时,Golang应用使用连接串root:password@tcp(mariadb:3306)/myappdb?parseTime=true连接MariaDB,出现错误:
lookup mariadb on 127.0.0.11:53: server misbehaving
用户提供的Docker-Compose配置如下:
version: "3" services: myapp: build: context: ../ links: - mariadb expose: - 6969 ports: - "6969:6969" networks: - app-network depends_on: - mariadb mariadb: image: mariadb:10.11.8 container_name: mariadb restart: always environment: - MYSQL_DATABASE=myappdb - MYSQL_ROOT_PASSWORD=password ports: - "3306:3306" volumes: - ./datadir:/var/lib/mysql - ../schema.sql:/docker-entrypoint-initdb.d/schema.sql networks: app-network: driver: bridge
问题原因
核心问题是MariaDB服务未加入自定义的app-network网络:
- 自定义网络
app-network已定义,但仅myapp服务配置了加入该网络;mariadb服务未指定networks字段,默认会加入Docker Compose创建的默认网络。 - 不同网络下的容器无法通过服务名直接解析DNS,因此
myapp容器无法找到mariadb服务,触发解析错误。
解决方法
给mariadb服务添加networks配置,将其加入app-network:
修改后的mariadb服务配置:
mariadb: image: mariadb:10.11.8 container_name: mariadb restart: always environment: - MYSQL_DATABASE=myappdb - MYSQL_ROOT_PASSWORD=password ports: - "3306:3306" volumes: - ./datadir:/var/lib/mysql - ../schema.sql:/docker-entrypoint-initdb.d/schema.sql networks: - app-network # 新增该行,加入自定义网络
额外优化建议
- 移除
myapp服务中的links字段:该字段在Docker Compose v3中已废弃,同一网络下容器直接通过服务名即可通信,无需配置链接。 - 在Golang代码中添加连接重试逻辑:
depends_on仅保证容器启动顺序,不保证MariaDB完成初始化(比如执行schema.sql的过程),添加重试可避免启动初期的连接失败。
内容的提问来源于stack exchange,提问作者Sombre Dreamer
相关产品推荐
相关产品推荐

