抱歉,这个问题已经得到解答。这是我第一次在 Web 开发中使用 Docker。我正在为我的项目设置 Nginx - PHP - MariaDB。每次我访问 php 文件时,我的 Nginx 都会显示 404 错误,这让我很卡。
docker-compose.yml
version: '3'
# Nginx
services:
web:
image: nginx:latest
restart: "always"
volumes:
- ./web.conf:/etc/nginx/conf.d/default.conf
# Index
- /home/hoangtho/Projects:/data/www/projects
ports:
- "80:80"
depends_on:
- mariadb
links:
- mariadb
- php
# Mariadb
mariadb:
# Install latest version
image: "mariadb:latest"
restart: "always"
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
MYSQL_DATABASE: "${MYSQL_DATABASE}"
MYSQL_USER: "${MYSQL_USER}"
MYSQL_PASSWORD: "${MYSQL_PASSWORD}"
ports: # ⇐ here
- "3306:3306"
# PHP services
php:
image: php:7.3-fpm-alpine
restart: "always"
build:
context: './php/'
volumes:
- /home/hoangtho/Projects:/data/www/projects
网页配置文件
server {
listen 80;
server_name localhost;
index index.php index.htm index.html;
# set root
location / {
root /data/www/projects;
index index.html index.php;
}
location /test {
alias /data/www/projects;
autoindex on;
}
# PHP
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Dockerfile
FROM php:7.3-fpm-alpine
Install PDO , PDO_MYSQLI
RUN docker-php-ext-install pdo pdo_mysql
您可以看到我的设置非常简单。但我不知道为什么我在访问 PHP 文件时不断出现 404 我的根目录/home/hoangtho/Projects
(其中包含我的所有项目 - 有效)
答案1
我认为使用 links 和depends_on 是不明智的。容器之间要进行通信,它们必须位于同一网络中。
例如,首先创建一个名为“projects”的网络:
docker network create projects
我修改了你的一些撰写文件:
version: '3'
# Nginx
services:
web:
image: nginx:latest
restart: "always"
volumes:
- ./web.conf:/etc/nginx/conf.d/default.conf
# Index
- /home/hoangtho/Projects:/var/www/html
networks:
- projects
# Mariadb
mariadb:
# Install latest version
image: "mariadb:latest"
restart: "always"
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
MYSQL_DATABASE: "${MYSQL_DATABASE}"
MYSQL_USER: "${MYSQL_USER}"
MYSQL_PASSWORD: "${MYSQL_PASSWORD}"
networks:
- projects
# PHP services
php:
image: php:7.3-fpm-alpine
restart: "always"
build:
context: './php/'
volumes:
- /home/hoangtho/Projects:/var/www/html
networks:
- projects
networks:
projects:
external: true
无需指定默认端口(NGINX 为 80,MariaDB 为 3306)。
links 和depends_on 可以替换为“networks”。您还可以使用两个网络,一个用于后端(MariaDB),一个用于前端(NGINX,不确定 PHP 是否需要放在前端,或者它是否只在后端工作)。如果您使用两个网络,请确保将 NGINX(可能还有 PHP)放在这两个网络中。
您指定的卷在容器(/data/www/projects)内不存在,我已将其替换为这些容器内的工作目录(/var/www/html)。
在你的 web.conf 文件中,
server {
listen 80;
server_name localhost;
index index.php index.htm index.html;
# set root
location / {
root /var/www/html;
index index.html index.php;
}
location /test {
alias /var/www/html;
autoindex on;
}
# PHP
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}