Docker Compose 不处理会话同步,需用 Redis 等外部服务实现:1. 禁用本地文件存储;2. 配置 PHP 使用 Redis 存 session(session.save_handler=redis);3. 通过自定义网络确保 PHP 与 Redis 服务互通。

Docker Compose 本身不直接处理“会话同步状态”(如 PHP 的 session_start() 共享、用户登录态跨实例一致),它只负责容器编排和网络连通。真正的会话状态同步,需要配合外部共享存储服务来实现——这是关键前提。
下面从实际落地角度,分三步讲清楚怎么做:
明确会话状态不能靠容器本地文件存储
PHP 默认把 session 存在 /tmp 或指定目录的文件中。如果启动多个 PHP-FPM 实例(比如用 --scale),每个容器都有独立文件系统,彼此 session 文件完全隔离,用户刷新可能就登出。
所以必须把 session 数据外迁,统一存到所有服务都能访问的中心化服务里。
使用 Redis 统一管理 PHP 会话
Redis 是最常用、轻量且 Docker 友好的选择。步骤如下:
-
在
docker-compose.yml中加入 Redis 服务:redis: image: redis:7-alpine ports: ["6379"]
-
修改 PHP 服务的
Dockerfile或运行时配置,让 PHP 使用 Redis 存 session:
在php.ini中添加(或通过environment+command注入):session.save_handler = redis session.save_path = "redis://redis:6379" session.cookie_secure = 0 session.cookie_httponly = 1
确保 PHP 容器安装了
redis扩展(docker-php-ext-install redis)和php-redis包。
这样所有 PHP 实例都会连接同一个 Redis 实例,session_start() 读写的是同一份数据,登录态自然同步。
配置服务间通信与网络保障
不要依赖默认 bridge 网络(不支持服务名解析)。
-
在
docker-compose.yml中显式定义网络,并让 PHP 和 Redis 都加入:networks: app-net: driver: bridge services: php: # ... networks: [app-net] redis: # ... networks: [app-net] PHP 代码中连接 Redis 时,主机名直接写
redis(即服务名),Compose 内置 DNS 会自动解析成对应容器 IP。
补充说明:若用 Nginx + PHP-FPM 分离部署,还需确认
fastcgi_pass指向正确的 PHP-FPM 服务名(如php:9000),并确保 Nginx 和 PHP 同属一个网络,才能完成完整请求链路。
不复杂但容易忽略


















