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

Php 使用Docker运行Laravel artisan命令时连接被拒绝,php,mysql,laravel,docker,docker-compose,Php,Mysql,Laravel,Docker,Docker Compose,我在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 volu

我在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'
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=8889
DB_DATABASE=dev
DB_USERNAME=dev
DB_PASSWORD=dev
这是我的
.env
文件的相关部分:

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'
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,其中table_schema=dev和table_name=migrations)


我试过在
.env
文件中摆弄
主机
端口
参数。

首先编辑您的
docker compose.yml

mysql:
    image: mariadb:latest
    ports:
      - 8889:3306
然后在
.env
中设置正确的DB端口


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

中使用
DB_PORT=3306
,如果您不想像@kotapter的答案中那样设置DB端口,您可以通过运行以下命令通过docker调用artisan:

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

查看您的
docker compose.yml
,您的容器可能是
laravel\u app\u app\u 1
,但您可以通过运行
docker ps
来检查这一点,尝试将端口更改为3306,并使用DB\u 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

经过5个小时的研究,我在评论中发现了这句话:


Remove port exposing,mariadb:latest在其Dockerfile中设置它:此图像公开标准MySQL端口(3306)

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

这意味着仅在主机端口3306中,将您的Laravel连接到数据库。

这对我很有效: 将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 compose命令?你(手动)或某种脚本,jenkins,travis,gitlab ci…我手动:
docker compose up-d
Remove port exposing,mariadb:最新设置在其Dockerfile中:此图像显示标准MySQL端口(3306)…上帝保佑你@Kyslikth这是一个打字错误,应该删除,因为OP无法读取。如果这个规则被普遍应用,那么它将是当前大小的三分之一。我不是说那一定是件坏事…你怎么能做到?我们有连接被拒绝的问题。谢谢!!!!!!!!!!!!!!!!这对我有用。打开Docker并复制了我的mysql容器的名称:my-ap_mysql_1,并将其作为DB_主机。这很奇怪,它可以工作,但却花费了我数天的时间来搜索解决方案。谢谢你为我节省了更多的谷歌搜索时间:如果我没有看到这个,我永远也不会明白这一点。非常感谢。你知道为什么这对你有用吗?它对我不起作用,我想知道是否有任何文档