Docker + Laravel 问题 [SQLSTATE[HY000] [2002]

我在 ubuntu 机器上安装了 docker,我正在尝试运行一个 laravel 应用程序。

MySQL 服务service_name: mysql在 docker-compose.yml 文件和 .env 文件中有DB_HOST=mysql.

我记得 .env 文件应该指出DB_HOST=mysql指向 mysql docker 服务 IP。然而这并没有发生,在运行迁移后我得到:

Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution (SQL: SHOW FULL TABLES WHERE table_type = 'BASE TABLE')

首先我跑了docker-compose build,然后我跑了,我docker-compose up -d所有的 3 个服务都启动并运行了。

如果我提取 MySQL 服务的 IP 并在这样的.env文件中使用它:

DB_HOST=172.18.0.2

然后我可以成功运行迁移,在这种情况下一切正常。

但是,我认为这是不好的做法,因为如果重新启动 MySQL 服务,IP 地址可能会更改。我在这里遗漏了什么,为什么service_name在我的.env文件中使用DB_HOST无法解析数据库主机名?

码头工人-compose.yml:

version: '3'


networks:

  laravel:


services:

  nginx:

    image: nginx:stable-alpine

    container_name: nginx

    ports:

      - "8080:80"

    volumes:

      - ./src:/var/www/html

      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

    depends_on:

      - php

      - mysql

    networks:

      - laravel

  mysql:

    image: mysql:5.7.22

    container_name: mysql

    restart: unless-stopped

    tty: true

    ports: 

      - "3306:3306"

    volumes: 

      - ./mysql:/var/lib/mysql

    environment:

      MYSQL_DATABASE: laraone

      MYSQL_USER: laraone_user

      MYSQL_PASSWORD: secret

      MYSQL_ROOT_PASSWORD: secret

      SERVICE_TAGS: dev

      SERVICE_NAME: mysql

    networks:

      - laravel

  php:

    build:

      context: .

      dockerfile: Dockerfile

    container_name: php

    volumes: 

      - ./src:/var/www/html

    depends_on:

      - mysql

    ports:

      - "9000:9000"

    networks:

      - laravel


繁华开满天机
浏览 302回答 3
3回答

慕少森

我认为您尝试在 php docker 容器之外运行“php artisan migrate”命令。您应该在 php 容器中运行 php artisan migrate 命令。尝试关注;docker ps --> list running containersdocker exec -it <your_container_id> bash现在你可以跑了;php artisan migrate编辑:您也可以在不输入容器 bash 的情况下编写工匠命令,如下所示;docker exec -i <your_container_id> php artisan migrate

郎朗坤

对于仍然想要 dockerized Laravel 环境的任何人,请查看 Laravel Sail。它使您可以使用 alias 轻松地将命令路由到 docker 实例sail。喜欢sail artisan migrate。https://laravel.com/docs/8.x/sailLaravel Sail 是一个轻量级的命令行界面,用于与 Laravel 的默认 Docker 开发环境进行交互。Sail 为使用 PHP、MySQL 和 Redis 构建 Laravel 应用程序提供了一个很好的起点,而无需之前的 Docker 经验。

慕森王

我通过在 php 容器中安装 laravel 应用程序解决了这个问题。简单的 1 行命令帮助我解决了这个问题:docker exec -it php php artisan app:install
打开App,查看更多内容
随时随地看视频慕课网APP