Laravel Docker 容器无法连接到远程 AWS RDS 数据库
Laravel Docker Container Cannot connect to remote AWS RDS Database
我正在使用一个应该连接到远程 rds 数据库的容器化 Laravel 应用程序,这是一个示例 .env
DB_HOST=xxxxxx.rds.amazonaws.com
DB_DATABASE=sample
DB_USERNAME=sample
DB_PASSWORD=sample
DB_PORT=3306
DATABASE_DRIVER=mysql
容器正常工作,但问题是,当我尝试 运行 composer ie:
时,它无法连接到远程 rds 数据库
$ docker exec -ti laravel-php bash
$ composer install
我收到这个错误:
[PDOException]
SQLSTATE[HY000] [1045] Access denied for user 'sample'@'192.168.66.1' (using password: YES)
Script php artisan clear-compiled handling the post-install-cmd event returned with error code 1
192.168.66.1 作为我的 docker 容器的 ip,我怀疑数据库策略是通过 @localhost 访问打开的,因为我的开发人员确认它对 public 连接开放。
我正在使用 docker-compose 版本 2 顺便说一句,这是一个示例 docker-compose:
version: '2'
services:
sample-server:
build:
context: ./
dockerfile: sample.server.docker
volumes:
- ../backend:/var/www
ports:
- "8081:80"
environment:
- VIRTUAL_HOST=sample.local
links:
- sample-php
depends_on:
- sample-php
sample-php:
build:
context: ./
dockerfile: sample.php.docker
volumes:
- .:/var/www
links:
- sample-database
environment:
- "DB_PORT=3306"
- "DB_HOST=sample-database"
sample-database:
image: mysql:5.7
environment:
- "MYSQL_ROOT_PASSWORD=samplepassword"
- "MYSQL_DATABASE=sample"
ports:
- "33081:3306"
sample-nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
default:
external:
name: sample-nginx-proxy
我该如何解决这个问题?
我猜这是一个 MySql 问题,您是如何创建用户的?
如果你想允许从任何地方访问只需输入 %
:
GRANT ALL PRIVILEGES ON *.* TO 'sample'@'%' IDENTIFIED BY 'samplepassword' with grant option;
FLUSH PRIVILEGES;
检查以下内容:
数据库 public 可以访问:
在数据库所在的 VPC 外部连接,更具体地说,通过 Internet 访问,需要为数据库配置 Public 可访问性。你说的已经完成了。由于您有一个内部 IP,而数据库没有 public IP,因此这并不是必需的。
基本配置:
检查数据库名称和端口设置是否正确,我相信你已经完成了。
安全组入站规则:
这是最有可能的情况,数据库将有一个或多个security groups。确保安全组配置为允许来自您的客户端的入站访问:192.168.66.1
确认客户端IP地址:
192.168.66.1 是一个奇怪的容器 IP,VPC 子网的前 4 个 IP 地址是 reserved.
确认网络路由:
确认包含客户端的 VPC 可以连接到数据库。由于客户端在 docker 容器中 运行,因此确保容器可以访问数据库。执行此操作的简单方法是在数据库子网中的 EC2 实例上启用 ICMP 数据包,并检查您是否可以 Ping 它或使用 VPC 路由 analyser.
检查数据库用户权限:
数据库用户可以连接任何不是 localhost.
的地址吗
VPC 上的安全性:
检查入站和出站子网的 ACLs
更新:
这是来自 AWS 的 link:Amazon RDS 故障排除。
我正在使用一个应该连接到远程 rds 数据库的容器化 Laravel 应用程序,这是一个示例 .env
DB_HOST=xxxxxx.rds.amazonaws.com
DB_DATABASE=sample
DB_USERNAME=sample
DB_PASSWORD=sample
DB_PORT=3306
DATABASE_DRIVER=mysql
容器正常工作,但问题是,当我尝试 运行 composer ie:
时,它无法连接到远程 rds 数据库$ docker exec -ti laravel-php bash
$ composer install
我收到这个错误:
[PDOException]
SQLSTATE[HY000] [1045] Access denied for user 'sample'@'192.168.66.1' (using password: YES)
Script php artisan clear-compiled handling the post-install-cmd event returned with error code 1
192.168.66.1 作为我的 docker 容器的 ip,我怀疑数据库策略是通过 @localhost 访问打开的,因为我的开发人员确认它对 public 连接开放。
我正在使用 docker-compose 版本 2 顺便说一句,这是一个示例 docker-compose:
version: '2'
services:
sample-server:
build:
context: ./
dockerfile: sample.server.docker
volumes:
- ../backend:/var/www
ports:
- "8081:80"
environment:
- VIRTUAL_HOST=sample.local
links:
- sample-php
depends_on:
- sample-php
sample-php:
build:
context: ./
dockerfile: sample.php.docker
volumes:
- .:/var/www
links:
- sample-database
environment:
- "DB_PORT=3306"
- "DB_HOST=sample-database"
sample-database:
image: mysql:5.7
environment:
- "MYSQL_ROOT_PASSWORD=samplepassword"
- "MYSQL_DATABASE=sample"
ports:
- "33081:3306"
sample-nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
default:
external:
name: sample-nginx-proxy
我该如何解决这个问题?
我猜这是一个 MySql 问题,您是如何创建用户的?
如果你想允许从任何地方访问只需输入 %
:
GRANT ALL PRIVILEGES ON *.* TO 'sample'@'%' IDENTIFIED BY 'samplepassword' with grant option;
FLUSH PRIVILEGES;
检查以下内容:
数据库 public 可以访问: 在数据库所在的 VPC 外部连接,更具体地说,通过 Internet 访问,需要为数据库配置 Public 可访问性。你说的已经完成了。由于您有一个内部 IP,而数据库没有 public IP,因此这并不是必需的。
基本配置: 检查数据库名称和端口设置是否正确,我相信你已经完成了。
安全组入站规则: 这是最有可能的情况,数据库将有一个或多个security groups。确保安全组配置为允许来自您的客户端的入站访问:192.168.66.1
确认客户端IP地址: 192.168.66.1 是一个奇怪的容器 IP,VPC 子网的前 4 个 IP 地址是 reserved.
确认网络路由: 确认包含客户端的 VPC 可以连接到数据库。由于客户端在 docker 容器中 运行,因此确保容器可以访问数据库。执行此操作的简单方法是在数据库子网中的 EC2 实例上启用 ICMP 数据包,并检查您是否可以 Ping 它或使用 VPC 路由 analyser.
检查数据库用户权限: 数据库用户可以连接任何不是 localhost.
的地址吗VPC 上的安全性: 检查入站和出站子网的 ACLs
更新: 这是来自 AWS 的 link:Amazon RDS 故障排除。