WSL内使用Docker时的常见问题记录
本文最后更新于 2024-08-08,文章内容可能已经过时。
Docker挂载权限问题
问题描述
使用docker挂载mysql下的
/var/lib/mysql
目录时碰到了个小问题,挂载到我系统自己的e盘内,会出现容器无限重启的情况,查看容器日志发现无法正常初始化,猜想是目录权限问题
解决方案
- 挂载到WSL子系统内,不挂载到主硬盘,列如在子系统根目录下创建一个目录:
mkdir /db
然后在挂载到子系统目录就行了 - 升级到WSL2,使用
9p
协议,缺点就是会增加性能开销,因此,如果只需要在WSL内部进行操作,则最好将数据存储在WSL文件系统中。
# Docker中部署PHP-FPM出现"File not found."的问题
问题描述
使用wsl搭建docker开发环境时,碰到了这个问题,看了下nginx日志,发现报错:
FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream
于是确定是通过FastCGI调用PHP-FPM时,传递的文件名有误。这就涉及到PHP的工作原理了:Nginx提供 HTTP服务,对于客户端对PHP文件的请求,Nginx将构造一个对应的CGI调用,通过配置的TCP套接字或者Unix 套接字,将请求发送给PHP。请求中有一个参数SCRIPT_FILENAME
标识了客户端请求的脚本文件的本地 路径。由于我将PHP环境放在了Docker内部,PHP通过Docker Volume访问重定向后的本机路径,这个路径 和外部的Nginx看到的路径不一样,从而导致了Nginx能看到这个PHP脚本文件、而PHP不能。
解决方案
在php容器内挂载和nginx /usr/share/nginx/html
相同的目录,让php和nginx两个容器下的程序文件目录保持一致,两个容器都可以读取到文件:
# docker-compose.yml配置[挂载部分]:
nginx:
volumes:
- /程序文件目录/wwwroot:/usr/share/nginx/html #文件目录`
php:
volumes:
- /程序文件目录/wwwroot:/usr/share/nginx/html #和上面保持一致
# conf.d/default.conf 文件配置
server {
listen 80;
listen [::]:80;
server_name localhost;
access_log /var/log/nginx/host.access.log main;
root /usr/share/nginx/html; #配置项目根目录
location / {
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 晴玖科技
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果