海洋CMS Docker部署怎么做?容器化运行方法

chinaz
chinaz 正式会员超兽战士
发布于 2026-10-07 05:07 ·1 浏览 ·0 回复

海洋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)加一个空的站点目录。

具体清单:

  1. Docker Engine 20.10 以上 + Compose v2(命令是 docker compose 而不是 docker-compose)。
  2. 宿主机空闲端口一个,示例用 8080,正式环境可以用 80。
  3. 目录结构:
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 目录。

步骤:

  1. 把海洋CMS 程序包解压到 ./seacms/,确保根目录下有 install 目录。
  2. docker compose up -d,用 docker compose ps 确认三个容器都是 Up。
  3. 浏览器打开安装地址,数据库信息按上面环境变量填:主机 db、库名 seacms、用户 seacms、密码 seacms123,表前缀用默认值不要改。
  4. 安装完成后按提示删除 install 目录:宿主机直接 rm -rf ./seacms/install 即可,容器里立刻生效。
  5. 权限报错时执行 chown -R 33:33 ./seacms,php-fpm 容器里的 www-data 用户 uid 是 33。
  6. 后台上传、采集等功能开启后,如果 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 文件管理。

版权声明:本文来自 GJ论坛《海洋CMS Docker部署怎么做?容器化运行方法》
原文链接:https://www.gj0.com/thread-85.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~