【问题标题】:Laravel with Docker-ComposeLaravel 与 Docker-Compose
【发布时间】:2019-03-01 19:28:13
【问题描述】:

我正在尝试使用 Docker 为 Laravel 应用程序创建 PHP、Apache、MySQL 映像。这是我的第一个 Docker 应用程序。

运行docker-compose up -d时,我在浏览器中收到以下错误:


这是我的 docker-compose.yml 文件:

version: "3"
services:

webserver:
    build: 
    context: ./bin/webserver
    container_name: 'webserver'
    restart: 'always'
    ports:
    - "${HOST_MACHINE_UNSECURE_HOST_PORT}:80"
    - "${HOST_MACHINE_SECURE_HOST_PORT}:443"
    links: 
    - mysql
    volumes: 
    - ${DOCUMENT_ROOT-./www}:/var/www/html
    - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
    - ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
    - ${LOG_DIR-./logs/apache2}:/var/log/apache2
    networks:
    - app-network

mysql:
    build: ./bin/mysql
    container_name: 'mysql'
    restart: 'always'
    ports:
    - "${HOST_MACHINE_MYSQL_PORT}:3306"
    volumes: 
    - ${MYSQL_DATA_DIR-./data/mysql}:/var/lib/mysql
    - ${MYSQL_LOG_DIR-./logs/mysql}:/var/log/mysql
    environment:
    MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    MYSQL_DATABASE: ${MYSQL_DATABASE}
    MYSQL_USER: ${MYSQL_USER}
    MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    networks:
    - app-network

phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: 'phpmyadmin'
    links:
    - mysql
    environment:
    PMA_HOST: mysql
    PMA_PORT: 3306
    PMA_USER: ${MYSQL_USER}
    PMA_PASSWORD: ${MYSQL_PASSWORD}
    MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    MYSQL_USER: ${MYSQL_USER}
    MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    ports:
    - '8080:80'
    volumes: 
    - /sessions
    networks:
    - app-network

networks:
    app-network:
        driver: bridge

volumes:
    dbdata:
        driver: local

这是我的 .env 文件:

DOCUMENT_ROOT=./vbs-master/public
VHOSTS_DIR=./config/vhosts
APACHE_LOG_DIR=./logs/apache2
PHP_INI=./config/php/php.ini
MYSQL_DATA_DIR=./data/mysql
MYSQL_LOG_DIR=./logs/mysql

HOST_MACHINE_UNSECURE_HOST_PORT=80
HOST_MACHINE_SECURE_HOST_PORT=443

HOST_MACHINE_MYSQL_PORT=3306

MYSQL_ROOT_PASSWORD=rootroot
MYSQL_USER=root
MYSQL_PASSWORD=rootroot
MYSQL_DATABASE=dockertest

这是我的 bin/webserver/Dockerfile:

FROM php:5.6-apache

RUN apt-get -y update && apt-get upgrade -y

# Install tools && libraries
RUN apt-get -y install --fix-missing apt-utils nano wget dialog \
    build-essential git curl libcurl3 libcurl3-dev zip \
    libmcrypt-dev libsqlite3-dev libsqlite3-0 mysql-client \
    zlib1g-dev libicu-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
    && rm -rf /var/lib/apt/lists/*

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

# PHP5 Extensions
RUN docker-php-ext-install curl \
    && docker-php-ext-install tokenizer \
    && docker-php-ext-install json \
    && docker-php-ext-install mcrypt \
    && docker-php-ext-install pdo_mysql \
    && docker-php-ext-install pdo_sqlite \
    && docker-php-ext-install mysqli \
    && docker-php-ext-install zip \
    && docker-php-ext-install -j$(nproc) intl \
    && docker-php-ext-install mbstring \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && pecl install xdebug-2.5.5 && docker-php-ext-enable xdebug \
    && echo "xdebug.remote_enable=1" >> /usr/local/etc/php/php.ini

# Enable apache modules
RUN a2enmod rewrite headers

EXPOSE 80

ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

文件目录树:


我的 config/vhosts/default.conf 文件:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot "/var/www/html"
    ServerName localhost
    <Directory "/var/www/html/">
        AllowOverride all
    </Directory>
</VirtualHost>

【问题讨论】:

  • 你的config/app.php 存在吗?
  • 不,它没有。
  • 你能发一张你的文件目录树的截图吗?
  • 编辑了我的帖子以包含屏幕截图@party-ring。问题似乎与DOCUMENT_ROOT=./vbs-master/public 中的public 有关。我把它拿出来并导航到 localhost\public 而不是 localhost,它似乎可以工作,尽管会导致其他问题。

标签: php laravel docker


【解决方案1】:

您需要设置为DOCUMENT_ROOT=./vbs-master/,否则您的容器将只能访问公共文件夹,而 Laravel 项目需要访问父目录。

您需要更改 Apache 配置以在 /var/www/html/public 中查找 index.php。

【讨论】:

  • 谢谢,我已经应用了第一个更改。有了你的解释,现在更有意义了!我需要在哪里应用第二个更改?那会在 config/vhosts/default.conf 中吗?您能否添加该文件的外观?
  • 它可能在 ./config/vhosts 内带有 .conf 扩展名的 XML 文件中
  • 是的,我已经编辑了我的问题以显示该文件当前的样子(它位于最底部)。我需要同时更改 DocumentRoot 和 Directory 吗?该文件中还有其他需要更改的内容吗?
  • 我已经进行了第二次更改,现在我看到一个带有错误消息的灰/白页面:InvalidArgumentException in FileViewFinder.php line 137: View [users.signin] not found. 还有:in FileViewFinder.php line 137 at FileViewFinder-&gt;findInPaths('users.signin', array('/Users/MY-HOST-USERNAME/Documents/Docker/laravel-test-three/vbs-master/resources/views')) in FileViewFinder.php line 79 它如何知道我的主机用户名 如果它在容器中运行?
  • 您的浏览器是否可以通过主机中运行的其他 apache 访问您的应用程序?您显示的路径不应该存在于容器中。您可以使用这些命令更清楚地了解您的设置: 1. docker ps 向您显示所有正在运行的容器;和 2. docker exec -it [container-name] bash 在容器“内部”打开一个终端。在那里你可以检查容器文件系统。
【解决方案2】:

正如@thiago 建议的那样,您需要将所有应用程序挂载到您的容器中,因此请按如下方式更改您的webserver 服务:

webserver:
    build: 
    context: ./bin/webserver
    container_name: 'webserver'
    restart: 'always'
    ports:
    - "${HOST_MACHINE_UNSECURE_HOST_PORT}:80"
    - "${HOST_MACHINE_SECURE_HOST_PORT}:443"
    links: 
    - mysql
    volumes: 
    - ${APP_ROOT-./app}:/var/www/html # Here you may mount the root project of your application
    - ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
    - ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
    - ${LOG_DIR-./logs/apache2}:/var/log/apache2
    networks:
    - app-network

并将其添加到您的 .env 文件中

APP_ROOT=./vbs-master

最后但同样重要的是,将您的 DocumentRoot 指向 public 文件夹,更改您的 config/vhosts/default.conf 文件

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot "/var/www/html/public"
    ServerName localhost
    <Directory "/var/www/html/public">
        AllowOverride all
    </Directory>
</VirtualHost>

注意:确保在运行应用程序之前已执行composer install

【讨论】:

  • 非常感谢您在这方面的帮助。我已经完成了除了黄色注释之外的所有操作(之前已经这样做了)。现在错误消失了,我看到了 Apache “Index of /”页面,列出了 vbs-master 目录中的所有文件和文件夹。这就是 readme.md、public 等等。接下来我需要做什么?
  • 嗨,@Ben。您是否已经更新了 vhost 配置文件?确保它指向/var/www/html/public 目录。
  • 我已经更新了我的config/vhosts/default.conf,如果这就是你想要的。刚刚注意到:如果我单击公用文件夹,它只会显示与以前相同的错误消息:InvalidArgumentException in FileViewFinder.php line 137: View [users.signin] not found.
  • 再次,使用我的主机用户名:in FileViewFinder.php line 137 at FileViewFinder-&gt;findInPaths('users.signin', array('/Users/HOST-USER-NAME/Documents/Docker/laravel-test-three/vbs-master/resources/views')) in FileViewFinder.php line 79
  • 另外,您能否更具体地了解 docker-compose.yml 中的- ${APP_ROOT-./app}:/var/www/html # Here you may mount the root project of your application?为什么将DOCUMENT_ROOT 替换为APP_ROOT
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多