海洋CMS Docker部署怎么做?容器化运行方法
海洋CMS 用 Docker 部署,标准做法是「Nginx + PHP-FPM + MySQL」三容器拆分,用一份 docker-compose.yml 编排:Web 目录和数据库数据都挂载到宿主机,装完后删掉 install 目录即可长期运行。整个过程熟练的话 10 分钟内能跑通,核心难点只有两个——PHP 扩展要自己补、数据库主机名要填容器服务名而不是 localhost。
海洋CMS 为什么要拆成三个容器?
结论:拆成三个容器比「单容器塞 PHP+MySQL」更好维护,因为数据库可以独立升级、独立备份,Web 目录出错时重建 Web 容器不丢数据。
PHP 类 CMS 的传统部署是装 LNMP 环境,升级 MySQL 或换 PHP 版本要动整机。容器化后,镜像版本写死在 compose 文件里,回滚就是改一行 tag 再 docker compose up -d。海洋CMS 属于 PHP + MySQL 架构,数据库和程序文件是唯一需要持久化的东西,其余全部可以随时销毁重建。
要注意:不要把 MySQL 端口映射到宿主机(比如 3306:3306),只在 Docker 内部网络互通就够了,暴露到公网等于把数据库直接交出去。
部署前要准备什么?
结论:宿主机只要装好 Docker 和 Docker Compose v2,建一个项目目录,准备 3 个文件(docker-compose.yml、nginx.conf、php.ini)加一个空的站点目录。
具体清单:
- Docker Engine 20.10 以上 + Compose v2(命令是
docker compose而不是docker-compose)。 - 宿主机空闲端口一个,示例用 8080,正式环境可以用 80。
- 目录结构:
seacms-docker/
├── docker-compose.yml
├── nginx.conf
├── php.ini
├── seacms/ # 站点程序目录(先留空)
└── mysql-data/ # 数据库持久化目录(自动生成)
PHP 版本建议先用 php:7.4-fpm 跑通。海洋CMS 各版本对 PHP 8 的兼容情况不一样,用错版本最常见的表现是安装页白屏或报 Deprecated/Fatal error,所以先按官方版本说明确认,再改镜像 tag。
docker-compose.yml 怎么写?
结论:三个服务分别用 nginx:1.25-alpine、php:7.4-fpm、mysql:5.7,站点目录用同一个宿主机路径挂到两个容器里。
services:
web:
image: nginx:1.25-alpine
ports:
- "8080:80"
volumes:
- ./seacms:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- php
php:
build: ./php # 见下方 Dockerfile
volumes:
- ./seacms:/var/www/html
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root123456
MYSQL_DATABASE: seacms
MYSQL_USER: seacms
MYSQL_PASSWORD: seacms123
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./mysql-data:/var/lib/mysql
php 容器需要自建 Dockerfile 补扩展,官方 php 镜像默认没有 pdo_mysql:
FROM php:7.4-fpm
RUN docker-php-ext-install pdo_mysql mysqli
如果海洋CMS 需要 GD 图形库(生成缩略图、验证码会用到),加这几行:
RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install gd
nginx.conf 的关键是三处:root /var/www/html、PHP 转发到服务名 php:9000、client_max_body_size 64m(默认 1m,后台上传大文件会 413)。
server {
listen 80;
root /var/www/html;
index index.php index.html;
client_max_body_size 64m;
location / { try_files $uri $uri/ /index.php?$query_string; }
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
include fastcgi_params;
}
}
怎么完成安装向导?
结论:启动容器后访问 http://服务器IP:8080/install/index.php,数据库主机填 db(compose 里的服务名),填完删掉 install 目录。
步骤:
- 把海洋CMS 程序包解压到
./seacms/,确保根目录下有 install 目录。 docker compose up -d,用docker compose ps确认三个容器都是 Up。- 浏览器打开安装地址,数据库信息按上面环境变量填:主机
db、库名seacms、用户seacms、密码seacms123,表前缀用默认值不要改。 - 安装完成后按提示删除
install目录:宿主机直接rm -rf ./seacms/install即可,容器里立刻生效。 - 权限报错时执行
chown -R 33:33 ./seacms,php-fpm 容器里的 www-data 用户 uid 是 33。 - 后台上传、采集等功能开启后,如果 URL 是伪静态形式,需要在 nginx.conf 里加对应 rewrite 规则,规则内容以海洋CMS 官方提供的那份为准。
常见坑有哪几个?
结论:90% 的失败集中在「数据库连不上」「目录不可写」「上传 413」这三类。
- 数据库连不上:主机名必须写
db。写 localhost 会指向 php 容器自己,那里没有 MySQL。 - 数据库还没初始化完就访问:MySQL 首次启动要初始化数据目录,等 20--30 秒再装,或者看
docker compose logs db出现 ready for connections 再继续。 - 目录不可写:安装时提示「目录不可写」,就是 uid 33 没权限,按上面的 chown 处理。
- 上传失败:php.ini 里补
upload_max_filesize=64M、post_max_size=64M、memory_limit=256M,并把文件挂到/usr/local/etc/php/conf.d/custom.ini。 - 备份:只备份
./seacms和./mysql-data两个目录,或者定期docker compose exec db mysqldump -useacms -pseacms123 seacms > backup.sql。
一句话收束:海洋CMS 的容器化就是把程序目录和数据库目录挂出来,用服务名互相访问,装完删 install,剩下的事全交给一份 compose 文件管理。
原文链接:https://www.gj0.com/thread-85.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。