codeigniter应用应容器化部署,但mysql等有状态中间件须宿主机部署;dockerfile禁止写入runtime目录,启动需指定非root用户;docker-compose中db_host应指向宿主机ip而非host.docker.internal。

将CodeIgniter应用容器化部署到Docker中,需权衡其对CI/CD流水线支持与有状态中间件管理的矛盾——比如GitLab、Jenkins这类无状态服务能秒级启停,但MySQL若强行塞进容器,数据卷权限错配或重启后丢失binlog就可能直接导致线上订单数据不一致。
适合容器化的CodeIgniter组件
GitLab、Jenkins、前端构建镜像这类无状态服务,天然适配Docker的生命周期管理。它们不依赖本地磁盘持久化关键业务数据,每次重建容器都能从配置中心拉取最新策略。
用Docker Compose统一编排时,把CodeIgniter应用打包为独立镜像:在Dockerfile里只COPY app/、public/和必要配置,【严禁在镜像层写入runtime目录或缓存文件】,否则镜像体积膨胀且无法复用分层缓存。
启动命令必须指定非root用户:docker run -u 1001:1001 --rm -p 8080:8080 codeigniter-app,避免因root权限误删宿主机文件或逃逸到宿主网络命名空间。
必须宿主机部署的中间件
MySQL、Redis、Elasticsearch这类有状态服务,直接在Linux宿主机用systemd管理更稳妥。容器化它们会引入三重风险:数据卷挂载路径权限混乱(如MySQL容器以uid=999启动却要写入宿主机/var/lib/mysql,SELinux拒绝访问)、跨容器网络延迟不可控(Redis主从同步超时被判定为脑裂)、备份脚本无法直连本地socket文件。
方法一:用apt安装原生MySQL
执行sudo apt update && sudo apt install mysql-server,再运行sudo systemctl enable mysql确保开机自启;
方法二:若必须用Docker启动MySQL,仅限开发环境,且必须绑定宿主机端口并映射数据目录:
docker run -d --name mysql-prod -p 3306:3306 -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
【生产环境禁止使用-e MYSQL_ROOT_PASSWORD明文传参,应改用--secret或挂载配置文件】
混合部署实操路径
第一步:在宿主机部署MySQL和Nacos
下载nacos-server-2.4.3.tar.gz解压后,执行sh startup.sh -m standalone启动单机模式;
第二步:构建CodeIgniter应用镜像
在项目根目录写Dockerfile,FROM php:8.5-apache,RUN docker-php-ext-install mysqli pdo pdo_mysql,COPY . /var/www/html/;
第三步:编写docker-compose.yml
定义codeigniter服务,links字段指向宿主机的nacos:192.168.1.100,environment中设置DB_HOST=192.168.1.100(不能写host.docker.internal,该DNS在生产环境常失效);
第四步:启动编排
执行docker-compose up -d,观察docker logs -f codeigniter容器日志,确认连接MySQL成功且Nacos注册中心返回200。











