Laravel Docker 容器未连接到本地 mysql

Posted

技术标签:

【中文标题】Laravel Docker 容器未连接到本地 mysql【英文标题】:Laravel Docker Container not connecting to local mysql 【发布时间】:2019-10-12 17:58:34 【问题描述】:

我在我提到的 DockerFile 中连接到本地机器上运行的 mysql 时遇到问题

FROM php:7
RUN apt-get update -y && apt-get install -y openssl zip unzip git
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN docker-php-ext-install pdo mbstring pdo_mysql
WORKDIR /home
COPY . /home
RUN composer install --ignore-platform-reqs

CMD php artisan serve --host=0.0.0.0 --port=8081
EXPOSE 8081

这在我的 .env 配置中

DB_HOST=localhost
DB_DATABASE=databasename
DB_USERNAME=root
DB_PASSWORD=testpassword

我对失败的地方知之甚少。我还需要为 Docker 容器安装 mysql 吗?

【问题讨论】:

那个 docker 文件中没有 mysql 的引用? 可以分享docker-compose.yml 嗨,我没有 docker-compose.yml,我只为服务编写 dockerfile,因为只有一项服务可以运行。也在同一个实例上,我运行了 mysql,但它不在 docker 中,它安装在机器本身中 From inside of a Docker container, how do I connect to the localhost of the machine?的可能重复 【参考方案1】:

一个更简单的解决方案(适用于 Mac OSX 和适用于 Windows 的 Docker)是将主机地址替换为 localhosthost.docker.internal

DB_HOST=host.docker.internal
DB_DATABASE=databasename
DB_USERNAME=root
DB_PASSWORD=testpassword

基本上,DNS 名称host.docker.internal 将解析为主机使用的内部 IP 地址。

注意:如果您将地址更改为host.docker.internal,但仍然收到connection refused 错误,很可能是因为MySQL 当前配置为仅侦听本地网络。

要解决此问题,请在您的my.cnf 配置文件中将bind_address 的值更新为0.0.0.0

【讨论】:

哇,这解决了我的问题。我不知道host.docker.internal实际上可以连接到localhost。 伟人,这是在mac上运行的docker的解决方案【参考方案2】:

您正在尝试连接到localhost 中的mysql,这是(令人惊讶的)对本地主机的引用。因为它是一个相对地址,所以在容器内它被解析为容器自己的地址,并且没有 mysql 在那里等着你...... 所以要解决它 - 只需给它您的真实主机 ip 而不是 localhost127.0.0.1

第 1 步 - 修复 .env 文件:

DB_HOST=<your_host_ip> #run `ifconfig` and look for your ip on `docker0` network
DB_DATABASE=databasename
DB_USERNAME=laravel_server #not root, since we are going to allow this user remote access.
DB_PASSWORD=testpassword

第 2 步 - 创建专用用户:

打开你的mysql:mysql -u root -p,输入你的root密码,然后运行以下命令:

CREATE USER 'laravel_server'@'%' IDENTIFIED BY 'testpassword';
GRANT ALL PRIVILEGES ON databasename.* TO 'laravel_server'@'%'; 
FLUSH PRIVILEGES;

我们创建了用户并授予它权限。

第三步——打开mysql进行远程访问:

我们必须让它监听所有接口,而不仅仅是本地主机,因此我们运行:

sudo sed 's/.*bind-address.*/bind-address=0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf

(系统会提示您输入密码。此命令只是替换 mysql 配置文件中的行)

第 4 步 - 更新:

    在工程目录下:php artisan config:cache service mysql restart

然后 docker build 并再次运行一个新容器。它应该适合你。

【讨论】:

嗨,我尝试将我的公共 IP 放入环境中,但仍然无法连接 SQLSTATE[HY000] [2002] 没有这样的文件或目录(SQL:select * from mdk_services_types where service_name like %diabetic-care% limit 1) 我找不到这样的文件或目录 @Divyeshpal 确保您没有任何 DB_SOCKET 环境变量。还在这里列出您的config/database.php 文件,我会尽力提供帮助 嘿,感谢您的回复,请找到我的 database.php : 'mysql' => [ 'driver' => 'mysql', 'read' => [ 'host' => env('DB_HOST ', 'localhost'), ], 'write' => ['host' => env('DB_HOST', 'localhost') ], 'port' => env('DB_PORT', '3306'), '数据库' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collat​​ion' => 'utf8_unicode_ci', ]【参考方案3】:

我看到两个选项 -

    使用 docker 主机的私有 IP,即运行 mysql 服务器的位置。

    在运行容器时使用主机网络模式,以防你想使用本地主机。

    docker container --net=host ...

【讨论】:

以上是关于Laravel Docker 容器未连接到本地 mysql的主要内容,如果未能解决你的问题,请参考以下文章

本地 Laravel 环境未连接到 AWS RDS 数据库

Keycloak Docker 容器未连接到 MySQL 数据库

AWS ElasticBeanstalk 上的 Laravel 应用程序未连接到 RDS 数据库

docker镜像未连接到mongodb

Docker中的Spring Boot未连接到Docker中的Mongo

运行 docker compose up 时 Postgres db 未连接到 docker