我在提到的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吗?
答案 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 ,而不是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构建并再次运行一个新容器。它应该为您工作。
答案 2 :(得分:0)
我看到两个选择-
使用您的docker主机的私有IP,即mysql服务器在其中运行。
在运行容器时使用主机网络模式,以防您要使用本地主机。
docker container --net=host ...