我正在尝试对 php Web 应用程序进行 dockerize,但到目前为止还没有成功。 在我的项目的根目录中,我有一个名为 public 的文件夹,index.php 位于其中。 到目前为止,我创建了两个文件:docker-compose.yml 和 Dockerfile,它们都位于项目的根目录下。 docker-compose.yml 看起来像这样:
version: '3'
services:
apache:
build:
context: .
dockerfile: Dockerfile
container_name: php
restart: always
ports:
- '80:80'
volumes:
- ./public:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: database
ports:
- "3306:3306"
Dockerfile 看起来像这样:
FROM php:7.4-apache
WORKDIR /var/www/html
COPY ./public /var/www/html
RUN sed -i 's!/var/www/html!/var/www/html/p!g' /etc/apache2/sites-available/000-default.conf
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-install fileinfo
RUN a2enmod rewrite
EXPOSE 80
CMD ["apache2-foreground"]
我构建容器并启动它,当我访问 http://localhost/ 时,我得到:
Not Found
The requested URL was not found on this server.
有人知道我错过了什么吗?预先感谢。
由于您的
index.php
位于 public
文件夹内,因此您可能需要配置 Apache 以使用此文件夹作为文档根目录并启用重写模块。
Dockerfile:
FROM php:7.4-apache
WORKDIR /var/www/html
# Copy the entire project (including Dockerfile) to the image
COPY . /var/www/html
RUN a2enmod rewrite
COPY apache-config.conf /etc/apache2/sites-available/000-default.conf
RUN docker-php-ext-install pdo pdo_mysql fileinfo
EXPOSE 80
CMD ["apache2-foreground"]
docker-compose.yml:
version: '3'
services:
apache:
build:
context: .
dockerfile: Dockerfile
container_name: php
restart: always
ports:
- '80:80'
volumes:
- ./public:/var/www/html/public
depends_on:
- db
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: database
ports:
- "3306:3306"
在项目的根目录中创建一个名为
apache-config.conf
的新文件:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/public
<Directory /var/www/html/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
此配置将
DocumentRoot
设置为 /var/www/html/public
并允许在目录块中进行覆盖。现在应该考虑 .htaccess
文件夹中的 public
文件。
进行这些更改后,重建 Docker 容器并查看问题是否仍然存在。如果仍然不起作用,请检查 Apache 日志中是否有任何错误消息,这些消息可能会提供对问题的更多了解。