thinkphp 5.1 项目通过 docker 化 jenkins 实现自动部署,核心是打通「代码提交→构建镜像→推送仓库→启动容器」全链路;jenkins 容器需挂载 docker.sock 或使用 dind 以执行 docker 命令;项目需提供适配的 dockerfile,配置生产环境变量与 apache 指向 public 目录;pipeline 脚本定义构建、推送、远程部署阶段,并结合凭证管理、git webhook 和权限加固保障安全稳定。

ThinkPHP 5.1 项目接入 Docker 化的 Jenkins 实现自动部署,核心在于打通「代码提交 → 构建镜像 → 推送仓库 → 启动容器」全链路。整个流程不依赖宿主机环境,所有构建和运行均在隔离容器中完成,既保障一致性,也便于横向扩展。
一、Jenkins 容器需具备 Docker 执行能力
单纯运行 Jenkins 容器无法直接调用 docker 命令。必须让容器能与宿主机 Docker Daemon 通信,常用两种方式:
-
方案 A(推荐初试):挂载 /var/run/docker.sock
启动 Jenkins 容器时添加:-v /var/run/docker.sock:/var/run/docker.sock,并确保容器内安装了docker-cli(可用 alpine + apk add docker 或基于 debian 镜像安装)。这样容器内执行docker build、docker push实际操作的是宿主机 Docker 引擎。 -
方案 B(更隔离):Docker-in-Docker(dind)
启动一个专用 dind 容器作为守护进程,Jenkins 容器通过 TCP 连接它(如tcp://dind:2376),需配置 TLS 证书。适合多租户或强安全要求场景,但资源开销略高、调试稍复杂。
二、ThinkPHP 5.1 项目适配 Docker 构建
项目根目录需提供标准 Dockerfile,关键点包括:
- 基础镜像选用
php:7.3-apache或php:7.4-apache(TP5.1 兼容 PHP 7.0–7.4); - 复制源码后,执行
composer install --no-dev --optimize-autoloader安装生产依赖; - 设置
APP_DEBUG=false和APP_ENV=production环境变量; - Apache 配置需指向
public/目录(如通过a2enmod rewrite+ 自定义.htaccess支持 URL 重写); - 避免在镜像中硬编码数据库地址,改用环境变量(如
DB_HOST)并在运行时注入。
三、Jenkins Pipeline 实现自动化流水线
在 Jenkins 中创建 Pipeline 任务,使用 Jenkinsfile 定义阶段。示例关键段落:
pipeline {
agent any
environment {
IMAGE_NAME = "registry.example.com/myapp:latest"
DOCKER_REGISTRY = "registry.example.com"
}
stages {
stage('Checkout') {
steps { checkout scm }
}
stage('Build Image') {
steps {
script {
sh "docker build -t ${IMAGE_NAME} ."
sh "docker login -u admin -p \${DOCKER_PASSWORD} ${DOCKER_REGISTRY}"
sh "docker push ${IMAGE_NAME}"
}
}
}
stage('Deploy to Prod') {
steps {
sh "ssh deploy@prod-server 'docker pull ${IMAGE_NAME} && docker stop myapp || true && docker rm myapp || true && docker run -d --name myapp -p 8080:80 --env-file .env.prod ${IMAGE_NAME}'"
}
}
}
}
注意:DOCKER_PASSWORD 应配置为 Jenkins 凭证(Secret Text 类型),不可明文写入脚本。
四、关键配置项补全
仅靠 Pipeline 不足以稳定运行,还需手动配置:
- 凭证管理:添加 Git SSH 私钥(用于拉取代码)、Docker Registry 用户名密码、远程服务器 SSH 密钥;
- 全局工具:在「系统配置 → 全局工具配置」中声明 PHP 版本(非必需,因构建在镜像内完成)、Composer 路径(若需容器外预处理);
-
Git Webhook:在代码仓库(如 Gitee/GitLab)配置 Push 事件触发 Jenkins,URL 格式为
http://jenkins-host:8080/github-webhook/(需安装 GitHub Plugin 或 Generic Webhook Trigger Plugin); -
权限加固:Jenkins 容器不要以 root 运行;
/var/run/docker.sock挂载后,宿主机上该文件权限应为srw-rw----,且 Jenkins 容器用户需属docker组(可通过usermod -aG docker jenkins实现)。
整个流程跑通后,一次 Git Push 即可触发从构建到线上服务更新的完整闭环。ThinkPHP 的轻量级特性配合 Docker 分层缓存,通常能在 1 分钟内完成部署,真正实现 DevOps 提倡的快速反馈与可靠交付。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











