简体   繁体   English

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

[英]Connection refused when running Laravel artisan command with Docker

I'm running Laravel 5.4 in Docker.我在 Docker 中运行 Laravel 5.4。 This is my docker-compose.yml file:这是我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'

This is the relevant part of my .env file:这是我的.env文件的相关部分:

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

I am able to see the Laravel welcome page - that side of things works.我能够看到 Laravel 欢迎页面 - 事情的那一面是有效的。 But when I run php artisan migrate I get this error:但是当我运行php artisan migrate我收到了这个错误:

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

I have tried fiddling with the host and port parameters in the .env file.我试过摆弄.env文件中的hostport参数。

First edit your docker-compose.yml .首先编辑你docker-compose.yml

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

After that set the correct DB port in .env .之后在.env中设置正确的数据库端口。

Your DB port is wrong.你的数据库端口是错误的。 You are trying to connect the exposed port inside the docker.您正在尝试连接 docker 内的暴露端口。 In this case you should use DB_PORT=3306 in your .env .在这种情况下,您应该在.env使用DB_PORT=3306

this worked for me: put the name of my mysql container instead of 127.0.0.1这对我有用:输入我的 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

Try change port to 3306 and use DB_HOST=localhost to yourdomain.com(your IP)尝试将端口更改为 3306 并使用 DB_HOST=localhost 到 yourdomain.com(your IP)

And don't forget Sudo Clear cache and config cache并且不要忘记 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

After 5 hours researching I found this quote in comments:经过 5 个小时的研究,我在评论中发现了这句话:

Remove port-exposing, mariadb:latest sets it in its Dockerfile: This image exposes the standard MySQL port (3306)...删除端口公开,mariadb:latest 在其 Dockerfile 中设置它:此图像公开标准 MySQL 端口 (3306)...

This mean you MUST use port 3306 in .env of each Laravel projects, either you define port for Mysql(or mariaDB).这意味着您必须在每个 Laravel 项目的.env中使用端口 3306,或者您为 Mysql(或 mariaDB)定义端口。

This mean in host only port 3306 connect your Laravel to database.这意味着在主机中只有端口 3306 将您的 Laravel 连接到数据库。

If you don't want to set the DB port like in @kotapeter's answer, you can instead invoke artisan through docker by running:如果您不想像@kotapeter 的回答那样设置 DB 端口,则可以通过运行以下命令通过 docker 调用 artisan:

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

Looking at your docker-compose.yml , your container could be laravel_app_app_1 but you can check this by running docker ps查看您docker-compose.yml ,您的容器可能是laravel_app_app_1但您可以通过运行laravel_app_app_1 docker ps来检查这一点

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM