这更多的是一个为什么?问题。我有以下
docker-compose.yml
文件。
services:
nginx:
image: nginx:1.25
container_name: nginx
ports:
- "80:80"
volumes:
- ./.docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./app:/var/www/html
depends_on:
- php
networks:
- app-network
php:
image: php:8.3-fpm
container_name: php
volumes:
- ./app:/var/www/html
networks:
- app-network
mariadb:
image: mariadb:11.3
container_name: mariadb
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydatabase
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
ports:
- "3306:3306"
volumes:
- dbdata:/var/lib/mysql
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
dbdata: {}
我有以下 nginx 文件(上面的 default.conf)。
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
我的问题是针对
volumes:
的php
和nginx
上的docker-compose.yml
。我想知道为什么我要为两个容器指定相同的卷,而不仅仅是 nginx?我的印象是 nginx 加载的任何文件都是通过 fastcgi_pass
地址位置通过 php 容器传递的。因此,只有 nginx 需要安装该卷。
假设您的项目如下所示:
├── app
│ ├── index.php
│ └── static.html
├── default.conf
└── docker-compose.yml
在
app/
中既有 PHP 源文件,也有静态 HTML 文件。
这是简化版
docker-compose.yml
:
services:
nginx:
image: nginx:1.25
container_name: nginx
ports:
- "80:80"
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf
- ./app:/var/www/html
depends_on:
- php
php:
image: php:8.3-fpm
container_name: php
volumes:
- ./app:/var/www/html
app/
目录需要在两个服务上进行卷安装。
php
服务可将 .php
文件转换为 HTML。因此,.php
文件需要可供该服务使用。如果这里没有卷挂载,则 PHP-FPM 没有任何可处理的内容。
PHP-FPM 不处理静态文件,因此静态文件也需要直接卷挂载到
nginx
服务上。您可以删除 PHP-FPM 服务,静态文件仍然可以正常工作。