我正在尝试开发一种从远程数据库获取信息的微服务,但是当我运行容器时,它无法建立与该数据库的连接。
容器在本地运行(我还在开发它),数据库托管在AWS RDS Aurora MySQL中。
数据库正在多个生产网站上使用我正在尝试在容器中使用的相同用户。用户拥有数据库的完全权限,而我的本地PHPMyAdmin使用同一个用户连接到数据库,并且使用它管理数据库没有任何问题。
问题是容器中的数据库连接失败并显示“拒绝访问”错误。
数据库用户设置为dbuser@%
,但错误显示为:
拒绝访问用户'dbuser'@'[my public ip]'(使用密码: YES)。
我尝试为dbuser@[my public ip]
添加另一个帐户,并为其授予与通配符主机帐户相同的权限,这没有任何区别。
作为另一项测试,我在容器内添加了一个curl调用来加载外部页面以确保它可以进行外部连接并且成功。这只是数据库连接失败没有意义。
我的dockerfile如下所示:
FROM php:7.2-apache
RUN apt-get update
RUN docker-php-ext-install mysqli pdo pdo_mysql
RUN a2enmod rewrite
我希望有人遇到这个和/或知道我在这里缺少的东西。
提前致谢!
更多信息:
我正在使用Docker for Windows和docker-compose来运行我的容器。我的docker-compose.yml文件看起来像:
version: "3"
services:
web:
image: repository/container:latest
volumes:
- ./src:/var/www/html
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "80:80"
networks:
- inv
networks:
inv:
答案 0 :(得分:0)
使用docker run --network host ...
启动容器将使容器共享主机的网络堆栈。这应该可以解决问题。
答案 1 :(得分:0)
我最后通过从我的API复制原始连接代码并用它替换容器中的连接代码来解决这个问题。
我注释掉了破碎的代码并对两者进行了比较,但看不出有什么区别。主机字符串中没有引号,没有拼写错误,没有任何意义。
唯一的区别是我设置构建主机字符串的变量的方式。这些变量的值是相同的,所以它确实没有意义。
无论如何,这样做会修复它。