使用 Docker 运行 Laravel artisan 命令时连接被拒绝

Posted

技术标签:

【中文标题】使用 Docker 运行 Laravel artisan 命令时连接被拒绝【英文标题】:Connection refused when running Laravel artisan command with Docker 【发布时间】:2018-10-19 15:00:21 【问题描述】:

我在 Docker 中运行 Laravel 5.4。这是我的docker-compose.yml 文件:

version: '2'

services:
  app:
    container_name: laravel_app
    image: webdevops/php-apache-dev:ubuntu-16.04
    links:
      - mysql
    depends_on:
      - mysql
    ports:
      - 8888:80
    volumes:
      - .:/app
    environment:
      docker: 'true'
      WEB_DOCUMENT_ROOT: '/app/public'
      WEB_NO_CACHE_PATTERN: '\.(.*)$$'
      working_dir: '/app'
  mysql:
    image: mariadb:latest
    ports:
      - 8889:80
    environment:
      MYSQL_ROOT_PASSWORD: 'dev'
      MYSQL_DATABASE: 'dev'
      MYSQL_USER: 'dev'
      MYSQL_PASSWORD: 'dev'

这是我的.env 文件的相关部分:

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=8889
DB_DATABASE=dev
DB_USERNAME=dev
DB_PASSWORD=dev

我能够看到 Laravel 欢迎页面——这方面的工作。但是当我运行php artisan migrate 时,我得到了这个错误:

SQLSTATE[HY000] [2002] 连接被拒绝(SQL: select * from information_schema.tables where table_schema = dev and table_name = migrations)

我尝试在.env 文件中摆弄hostport 参数。

【问题讨论】:

谁调用了 docker compose 命令?你(手动)或者某种脚本,jenkins,travis,gitlab-ci... 我手动:docker-compose up -d 移除端口暴露,mariadb:latest 在其 Dockerfile 中设置它:此图像暴露标准 MySQL 端口 (3306)... 上帝保佑你@Kyslik 【参考方案1】:

首先编辑您的docker-compose.yml

mysql:
    image: mariadb:latest
    ports:
      - 8889:3306

然后在.env中设置正确的数据库端口。

您的数据库端口错误。您正在尝试连接 docker 内的暴露端口。在这种情况下,您应该在您的.env 中使用DB_PORT=3306

【讨论】:

这是一个错字问题,应该删除它,因为 OP 无法读取 hub.docker.com/_/mariadb。 如果该规则被普遍应用,那么 SO 将是其当前大小的三分之一。我并不是说这一定是件坏事…… 这就是我们面临的问题!感谢您指出!【参考方案2】:

如果您不想像@kotapeter 的回答那样设置数据库端口,您可以通过运行通过 docker 调用 artisan:

$ docker exec -it <name of container> php artisan migrate

查看您的docker-compose.yml,您的容器可能是laravel_app_app_1,但您可以通过运行docker ps 进行检查

【讨论】:

你怎么能做到这一点?我们遇到了连接被拒绝的问题。【参考方案3】:

尝试将端口更改为 3306 并使用 DB_HOST=localhost 到 yourdomain.com(您的 IP)

别忘了 Sudo 清除缓存和配置缓存

DB_HOST=My_ip_for_virtual_machine (yourdomain.com)
sudo docker-compose exec app php artisan config:clear
sudo docker-compose exec app php artisan cache:clear

【讨论】:

【参考方案4】:

经过 5 个小时的研究,我在 cmets 中找到了这句话:

移除端口暴露,mariadb:latest 在其 Dockerfile 中设置它:此图像暴露标准 MySQL 端口 (3306)...

这意味着您必须在每个 Laravel 项目的 .env 中使用端口 3306,或者为 Mysql(或 mariaDB)定义端口。

这意味着在主机中只有端口 3306 将你的 Laravel 连接到数据库。

【讨论】:

我在使用 mysql:latest 时也发现了这一点。尽管设置了自定义端口,但只有 3306 有效。【参考方案5】:

这对我有用: 把我的 mysql 容器的名称而不是 127.0.0.1

NAME CONTAINERS

project-db --> container mysql
project-app --> container laravel

DB_CONNECTION=mysql
DB_HOST=project-db
DB_PORT=3306
DB_DATABASE=project
DB_USERNAME=root
DB_PASSWORD=root

【讨论】:

谢谢!!!!!!!!!!!!!!!!这对我有用。打开 Docker 并复制我的 mysql 容器的名称:my-ap_mysql_1 并将其作为 DB_HOST。 这很奇怪,它有效但花了我几天时间寻找解决方案。感谢您为我节省了更多的谷歌搜索时间:D 如果我没有看到这个,我永远不会想到这一点。谢谢! 你知道为什么这对你有用吗?它对我不起作用,我想知道是否有任何文档 这可能不是 OP 提出的问题的实际解决方案,但这是最常见错误之一的解决方案

以上是关于使用 Docker 运行 Laravel artisan 命令时连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

使用 docker-compose 在 Docker 中运行 laravel/lumen

如何在 laravel 应用程序中使用 docker 容器启动运行 websockets

本地主机拒绝使用 laravel 帆(Docker)连接

使用Docker compose编排Laravel应用

如何使用 docker-compose 在 docker 容器中为 Laravel 环境安装 Behat?

如何在 Docker 上运行 Laravel (Lumen) 调度程序