You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:40:01