docker部署powerdns-admin时SQLAlchemy无法连接127.0.0.1的MariaDB问题求助
问题原因
Docker容器默认使用桥接网络模式运行时,其内部的127.0.0.1是容器自身的回环地址,和宿主机的回环地址完全隔离。你在宿主机上能正常连接127.0.0.1的MariaDB,不代表容器内部可以访问到这个地址的服务,这是报错的核心原因。
解决方案
以下3种方案按需选择即可:
方案1:容器改用host网络模式(适合快速测试)
修改docker-compose.yml,给app服务添加network_mode: host配置,此时容器会直接共享宿主机的网络命名空间,内部的127.0.0.1和宿主机完全一致:
version: "3" services: app: image: ngoduykhanh/powerdns-admin:latest container_name: powerdns_admin network_mode: host # 新增该行 # host模式下ports配置失效,服务默认监听宿主机80端口,不需要端口映射,可直接删除原ports配置 logging: driver: json-file options: max-size: 50m environment: - SQLALCHEMY_DATABASE_URI=mysql://root:dbpass@127.0.0.1/powerdns - GUNICORN_TIMEOUT=60 - GUNICORN_WORKERS=2 - GUNICORN_LOGLEVEL=DEBUG - OFFLINE_MODE=False
修改完成后重新执行docker-compose up -d即可生效。
方案2:通过宿主机docker网桥网关/局域网IP访问(适合生产场景使用宿主机数据库的情况)
- 先在宿主机执行
ip addr show docker0查看docker网桥的网关IP,默认一般是172.17.0.1,也可以直接用宿主机的局域网IP - 修改
SQLALCHEMY_DATABASE_URI中的数据库地址为上述IP:- SQLALCHEMY_DATABASE_URI=mysql://root:dbpass@172.17.0.1/powerdns - 额外做两项配置:
- 修改MariaDB配置文件中的
bind-address参数为0.0.0.0或者对应的docker网桥网段,重启MariaDB生效 - 执行SQL给root用户授权docker网段访问权限:
GRANT ALL PRIVILEGES ON powerdns.* TO 'root'@'172.17.%' IDENTIFIED BY 'dbpass'; FLUSH PRIVILEGES;
- 修改MariaDB配置文件中的
方案3:将MariaDB纳入docker-compose集群统一管理(适合长期稳定部署)
直接在同一个docker-compose.yml中添加MariaDB服务,两个服务同属一个内部网络,可以直接用服务名作为域名访问:
version: "3" services: db: image: mariadb:10.11 container_name: powerdns_db restart: always environment: - MYSQL_ROOT_PASSWORD=dbpass - MYSQL_DATABASE=powerdns volumes: - ./mariadb_data:/var/lib/mysql # 数据库数据持久化到宿主机目录 app: image: ngoduykhanh/powerdns-admin:latest container_name: powerdns_admin ports: - "9191:80" depends_on: - db restart: always logging: driver: json-file options: max-size: 50m environment: - SQLALCHEMY_DATABASE_URI=mysql://root:dbpass@db/powerdns # 数据库地址直接填服务名db即可 - GUNICORN_TIMEOUT=60 - GUNICORN_WORKERS=2 - GUNICORN_LOGLEVEL=DEBUG - OFFLINE_MODE=False
修改完成后执行docker-compose up -d即可同时启动数据库和应用服务。
内容的提问来源于stack exchange,提问作者ben shalev
相关产品推荐
相关产品推荐

