[英]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而不是localhost
或127.0.0.1
。
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
打开您的 mysql: mysql -u root -p
,提供您的 root 密码,然后运行以下命令:
CREATE USER 'laravel_server'@'%' IDENTIFIED BY 'testpassword';
GRANT ALL PRIVILEGES ON databasename.* TO 'laravel_server'@'%';
FLUSH PRIVILEGES;
我们创建了用户并授予它权限。
我们必须让它监听所有接口,而不仅仅是本地主机,因此我们运行:
sudo sed 's/.*bind-address.*/bind-address=0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
(会提示输入密码,这个命令只是替换了mysql配置文件中的那一行)
php artisan config:cache
service mysql restart
然后 docker build 并再次运行一个新容器。 它应该适合你。
我看到两个选项 -
使用 docker 主机的私有 IP,即运行 mysql 服务器的地方。
如果您想使用 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.