簡體   English   中英

Laravel Docker 容器無法連接到遠程 AWS RDS 數據庫

[英]Laravel Docker Container Cannot connect to remote AWS RDS Database

我正在使用一個容器化的 Laravel 應用程序,它應該連接到遠程 rds 數據庫,這里是一個 sample.env

DB_HOST=xxxxxx.rds.amazonaws.com
DB_DATABASE=sample
DB_USERNAME=sample
DB_PASSWORD=sample
DB_PORT=3306
DATABASE_DRIVER=mysql

容器可以正常工作,但問題是,當我嘗試運行 composer 時,它無法連接到遠程 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 訪問打開的,因為我的開發操作確認它對公共連接開放。

我正在使用 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;

檢查以下內容:

數據庫可公開訪問:在數據庫所在的 VPC 外部進行連接,更具體地說是通過 Internet 訪問,需要將數據庫配置為可公開訪問。 你說的已經完成了。 由於您有一個內部 IP,並且數據庫沒有公共 IP,因此這並不是必需的。

基本配置:檢查數據庫名稱和端口是否設置正確,我相信你已經完成了。

安全組入站規則:這是最有可能的情況,數據庫會有一個或多個安全組 確保在您的情況下將安全組配置為允許來自客戶端的入站訪問:192.168.66.1

確認客戶端的IP地址: 192.168.66.1對於容器來說是一個奇怪的IP,前4個IP是一個VPC子網的預留地址

確認網絡路由:確認包含客戶端的VPC可以連接到數據庫。 由於客戶端在 docker 容器內運行,請確保容器可以訪問數據庫。 簡單的方法是在數據庫子網中的 EC2 實例上啟用 ICMP 數據包,並檢查您是否可以 Ping 它或使用 VPC 路由分析器

檢查數據庫用戶權限:數據庫用戶可以連接任何地址而不是localhost

VPC 上的安全性:檢查入站和出站子網的ACL

更新:這是來自AWS的鏈接:Amazon RDS 故障排除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM