【问题标题】:Cannot not connect to database server within docker-compose (php and MariaDB)无法连接到 docker-compose(php 和 MariaDB)中的数据库服务器
【发布时间】:2020-03-26 06:27:15
【问题描述】:

我已经构建了一个 docker-compose 文件,它创建了 2 个服务(PHP 和 MariaDB)。不知何故,我无法从 PHP 服务连接到数据库:在 PHP 服务中,一个 Laravel 应用程序正在运行。

错误信息(重定向是数据库中的一个表):

SQLSTATE[HY000] [2002] 连接被拒绝(SQL: select * from redirects

所有环境变量都应该是正确的。

这是我的 docker-compose.yml:

version: "3.7"
services:
  faaren_backend:
    image: php:alpine
    container_name: FAA-Backend
    volumes:
      - "./:/faaren_backend"
    working_dir: /faaren_backend
    command: "php artisan serve --host=0.0.0.0 --port=8000"
    ports:
      - 8000:8000
    build:
      context: docker/php
      dockerfile: dev.Dockerfile

  faaren_database:
    image: mariadb
    container_name: FAA-Database
    ports:
    - "3306:3306"
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      MYSQL_DATABASE: ${DB_DATABASE}
    volumes:
    - "faa-db-data:/var/lib/mysql/data"

volumes:
  faa-db-data: {}

我的 dev.Dockerfile

FROM php:7.3-fpm

RUN apt-get update
RUN apt-get update && apt-get install -y libzip-dev \
         && docker-php-ext-install zip

RUN apt-get update && apt-get install -y libmagickwand-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN pecl install imagick
RUN docker-php-ext-enable imagick

RUN apt-get install $PHPIZE_DEPS && \
    pecl install xdebug && docker-php-ext-enable xdebug && \
    docker-php-ext-install pdo_mysql pcntl

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

VOLUME /faaren_backend

最后是我的 .env 文件:

DB_CONNECTION=mysql
DB_HOST=faaren_backend
DB_PORT=3306
DB_DATABASE=faaren_db
DB_USERNAME=root
DB_PASSWORD=

我大部分时间都在学习这个教程:https://medium.com/swlh/laravel-with-docker-compose-de2190569084

【问题讨论】:

  • 您是否尝试将数据库的 ports 值从引号中取出?

标签: php mysql docker docker-compose


【解决方案1】:

看起来您正在处理竞争条件。您需要使用 depends_on 指令来控制启动顺序并使用 wait 脚本来确保服务准备好接受连接:

version: "3.7"
services:
  faaren_backend:
    image: php:alpine
    container_name: FAA-Backend
    volumes:
      - "./:/faaren_backend"
    working_dir: /faaren_backend
    command: entrypoint.sh
    ports:
      - 8000:8000
    depends_on:
      - faaren_database
    build:
      context: docker/php
      dockerfile: dev.Dockerfile

  faaren_database:
    image: mariadb
    container_name: FAA-Database
    ports:
      - "3306:3306"
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 1
      MYSQL_DATABASE: ${DB_DATABASE}
    volumes:
      - "faa-db-data:/var/lib/mysql/data"

volumes:
  faa-db-data: {}

有很多方法可以检查服务可用性,有时wait-for-it 真的很方便。在下面的示例中使用了netcat(您需要将其安装到容器中)。

另外,最好将脚本放入一个单独的文件中:

entrypoint.sh

#!/usr/bin/env bash
until nc -w 1 -z faaren_database 3306; do
  >&2 echo "Mysql is unavailable - sleeping"
  sleep 1
done
sleep 10
>&2 echo "Mysql is up - executing command"

php artisan serve --host=0.0.0.0 --port=8000

更新:指定正确的DB_HOST Dmitry 的建议方式。

【讨论】:

    【解决方案2】:

    您需要更改您的 docker 数据库主机:

    DB_CONNECTION=mysql
    DB_HOST=faaren_database <-- edit
    DB_PORT=3306
    DB_DATABASE=faaren_db
    DB_USERNAME=root
    DB_PASSWORD=
    

    并在 docker-compose.yml faaren_backend 部分添加:

    depends_on:
      - faaren_database
    

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-08-10
      • 2018-12-21
      • 2019-11-06
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      相关资源
      最近更新 更多