Laravel Docker容器无法连接到本地MySQL

zy1mlcev  于 2023-01-21  发布在  Docker
关注(0)|答案(4)|浏览(207)

我有一个问题,连接到mysql运行在本地机器在我的DockerFile我已经提到

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?

axr492tv

axr492tv1#

更简单的解决方案(适用于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地址。

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

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

fcg9iug3

fcg9iug32#

你正在尝试连接到mysql在localhost,这是(令人惊讶的)引用到本地主机.因为它是一个相对地址,在容器内部它被解析为容器自己的地址,并且没有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进行远程访问:

我们必须让它监听所有接口而不仅仅是localhost,因此我们运行:
sudo sed 's/.*bind-address.*/bind-address=0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
(you将被提示输入密码。这个命令只是替换mysql配置文件中的行)

第4步-更新:

1.在项目目录中:php artisan config:cache

  1. service mysql restart
    然后Docker重新构建并运行一个新的容器,它应该对你有效。
b4lqfgs4

b4lqfgs43#

我看到两个选择-
1.使用您的docker主机的私有IP,即mysql服务器运行的地方。
1.如果您想使用localhost,请在运行container时使用主机网络模式。
docker container --net=host ...

0dxa2lsx

0dxa2lsx4#

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

sudo systemctl stop mariadb.service

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

相关问题