繁体   English   中英

Laravel Docker 容器未连接到本地 mysql

[英]Laravel Docker Container not connecting to local mysql

我在我提到的 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

这在 my.env 配置中

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

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

一个更简单的解决方案(适用于 Mac OSX 和 Docker for Windows )是将主机地址从localhost替换为host.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

您正在尝试连接到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;

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

第 3 步 - 打开 mysql 进行远程访问:

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

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

(会提示输入密码,这个命令只是替换了mysql配置文件中的那一行)

第 4 步 - 更新:

  1. 在项目目录中: php artisan config:cache
  2. service mysql restart

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

我看到两个选项 -

  1. 使用 docker 主机的私有 IP,即运行 mysql 服务器的地方。

  2. 如果您想使用 localhost,请在运行容器时使用主机网络模式。

    docker container --net=host ...

在我的情况下(Ubuntu 20.04 桌面),我已经运行了 MariaDB 并使用端口 3306。因此,当 docker 容器内的应用程序试图启动容器内的 MySQL 时,它失败了,因为它试图监听一个已经使用的端口. 我使用以下命令关闭了已经运行的 MariaDB:

sudo systemctl stop mariadb.service

然后尝试启动 docker 应用程序。 它运行成功,因为端口 3306 现在空闲并由容器内的 MySQL 使用。 但由于我打算同时使用它们,一个更永久的解决方案是配置任一数据库系统,即 docker 容器内的系统或 docker 容器外的系统,以使用默认 3306 以外的其他端口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM