Docker Swarm global模式挂载本地卷后副本仅部署在管理节点问题咨询
问题原因分析
1. 全局模式仅manager节点有副本的根因
你新增的volumes配置为本地绑定挂载(bind mount),受Docker Swarm的调度规则限制触发了该问题:
- 你在manager节点执行
docker stack deploy命令,./html/是仅存在于manager节点的本地目录,node1、node2节点不存在对应路径 - Docker Swarm调度服务副本时会预先校验挂载资源可用性,若目标节点无法完成挂载(无对应本地目录),会直接拒绝调度副本到该节点,因此最终只有manager节点能正常启动服务实例。
2. 初始部署403 Forbidden的常见原因
最初用Dockerfile的COPY指令打包文件时返回403,一般是两类问题:
html目录下没有index.html/index.php这类默认索引文件,Apache默认关闭目录列表功能,无索引文件时会直接返回403- 本地
html目录下的文件权限配置不当,拷贝到容器后Apache的运行用户(默认www-data)没有文件读取权限。
解决建议
- 若要继续使用绑定挂载方案:需要在所有Swarm节点的相同路径下创建
./html目录并同步所有文件内容,调度器校验通过后会在所有节点启动global模式副本 - 更适合集群的方案:将静态资源打包到镜像内(修复初始403问题即可),或者使用共享存储(如NFS)作为volumes挂载源,所有节点统一访问共享存储内的文件
- 初始403问题修复示例:在Dockerfile中新增权限修正逻辑
FROM php:apache COPY html/ /var/www/html/ # 给Apache运行用户授予目录读写权限 RUN chown -R www-data:www-data /var/www/html/
内容的提问来源于stack exchange,提问作者Chariot
相关产品推荐
相关产品推荐

