Laravel Docker容器未连接到本地mysql

时间:2019-05-27 07:12:09

标签: mysql laravel docker

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

3 个答案:

答案 0 :(得分:2)

一个更简单的解决方案(对于Mac OSX和Docker对于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当前配置为仅侦听本地网络

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

答案 1 :(得分:1)

您正在尝试连接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构建并再次运行一个新容器。它应该为您工作。

答案 2 :(得分:0)

我看到两个选择-

  1. 使用您的docker主机的私有IP,即mysql服务器在其中运行。

  2. 在运行容器时使用主机网络模式,以防您要使用本地主机。

    docker container --net=host ...