Docker+Jenkins 搭建多版本php环境

Stella981
• 阅读 600

Docker+Jenkins 搭建多版本php环境

这几天刚刚搭建了一个小项目的服务器,使用了docker +( jenkins,nginx,php-fpm,mysql,redis) 的组合,今天总结一下。

Docker 确实已经出来很久了,连k8s这种高端玩意儿也都很“普及”了,然而说实话,这才是我第一次在生产环境中使用docker。

利用docker容器可以实现“真·多版本php”😎,多版本php适合一个服务器上同时有老项目和新项目的情况,甚至可以用不同版本来跑一个项目的不同部分​。。。​

宿主机:Ubuntu16.0.4

对只有一台宿主机,说了是小项目就是小项目绝不骗人(主要什么集群啦什么节点啦太高端咱也搞不了)。

安装docker:

不多说,看这个:https://www.runoob.com/docker/ubuntu-docker-install.html

安装nginx:

docker run -d --name nginx \

-v /var/www:/var/www \  #映射站点目录,也可以把配置文件和日志也映射出来

-p 80:80 \    #映射端口 本地端口:容器端口

nginx

安装php:

这里贴两个php-fpm的Dockerfile,包含了常用的扩展

FROM php:7.4-fpm

RUN apt-get update && apt-get install -y \

        libfreetype6-dev libjpeg62-turbo-dev libpng-dev \

        curl libcurl4-openssl-dev

RUN docker-php-ext-configure gd --with-freetype --with-jpeg \

    && docker-php-ext-install -j$(nproc) gd

RUN pecl install redis && docker-php-ext-enable redis

RUN docker-php-ext-install bcmath pdo pdo_mysql mysqli curl

FROM php:7.3-fpm

RUN apt-get update && apt-get install -y \

        libfreetype6-dev libjpeg62-turbo-dev libpng-dev \

        curl libcurl4-openssl-dev

RUN docker-php-ext-configure gd \

--with-png-dir \

--with-jpeg-dir \

--with-freetype-dir \

&& docker-php-ext-install -j$(nproc) gd

RUN pecl install redis && docker-php-ext-enable redis

RUN docker-php-ext-install bcmath pdo pdo_mysql mysqli curl #php源码包里包含的扩展都可以用 docker-php-ext-install 命令直接安装,这个还挺方便的。(但是这个并不能解决依赖问题,扩展如果依赖其他系统组件还是需要另外安装的)

通过Dockerfile创建镜像

docker build -t \

dubox/php-fpm7.4 \ #镜像的 命名空间/名字

.     #Dockerfile所在目录

从dubox/php-fpm7.4 创建php容器

docker run -d --name php-fpm74 -v /var/www:/var/www dubox/php-fpm7.4

#这里因为并不需要从宿主机外部访问PHP,所以不需要映射9000端口;后面的mysql、Redis一样的道理;

安装mysql

docker run --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7

#这里根据需要看是否映射3306端口

安装Redis

docker run --name redis -d redis

安装Jenkins

docker run \

  -u root \

  -d \

  -p 8080:8080 \

  -p 50000:50000 \

  -v /var/jenkins-data:/var/jenkins_home \

  -v /var/run/docker.sock:/var/run/docker.sock \ #这项很重要,它可以使你在Jenkins所在的容器中,像宿主机一样操作其他容器

  jenkinsci/blueocean

访问http://ip:8080 进行初始化jenkins ,选择需要的插件。更多详情可以参见:https://jenkins.io/zh/doc/book/installing/

容器间的网络访问

nginx容器 需要访问 php容器 ,php容器需要访问mysql和redis,容器间的网络互联可以通过:

1.使用容器ip //容器重启ip可能会变化,不靠谱

2.使用--link参数指定容器的别名 //对新增加的容器就没办法了,不靠谱

3.创建一个桥接网络:

# my-bridge 是网络的名字可以自定义

docker network create -d bridge my-bridge


#将容器连接到网络

docker network connect my-bridge nginx

docker network connect my-bridge php-fpm74


#查看网络连接情况

docker network inspect my-bridge

这样容器之间就可以通过容器名称进行访问,比如在nginx容器中可以直接 ping php-fpm74

容器有了,也可以互相访问了,下来就该配置jenkins构建任务了

配置jenkins构建任务

创建一个自由风格的任务

Docker+Jenkins 搭建多版本php环境

Docker+Jenkins 搭建多版本php环境

点击添加,添加github访问私钥

Docker+Jenkins 搭建多版本php环境

Docker+Jenkins 搭建多版本php环境

检出到子目录这个功能还挺有用的,而且支持jenkins环境变量(环境变量说明:http://ip:8080/env-vars.html/),这样从github拉下来的代码就会放在类似 /var/jenkins_home/workspace/job-name/job-name-123 的位置。

Docker+Jenkins 搭建多版本php环境

构建脚本说明:

BuildFolder=$JOB_NAME-$BUILD_NUMBER

Home="job-name"

cd $BuildFolder

rm -rf .git .gitignore

chown -R root:33 .    #修改项目文件的归属用户和数组,33 是www-data用户组的gid

chmod -R 750 .

chmod -R 770 runtime

cd ..

ln -sf /var/www/jenkinsBuild/$BuildFolder $Home   #创建软链,即便jenkins容器中并没有 /var/www/jenkinsBuild/$BuildFolder 目录 软链也是可以创建成功的;

docker cp -a ./$BuildFolder nginx:/var/www/jenkinsBuild/   #将项目文件夹拷贝到nginx容器中的相应目录,因为php容器也映射了/var/www目录 所以php容器也可以访问得到;这里的 -a 参数很重要,它可以将文件的属主和属组(uid:gid)信息一同拷贝过去;

docker cp -a $Home nginx:/var/www/   #拷贝软链

docker restart php-fpm74

docker exec -w /var/www/$Home/ php-fpm74 sh Start.sh   #可以在目标容器执行一些命令,-w 参数可以指定命令的工作目录

这里需要说一下docker映射目录的文件权限问题:

多个容器可以映射同一个宿主机目录,文件的权限以文件携带的uid:gid为准,如:

/var/www/index.html 在php容器中的属主是www-data 属组也是www-data ,对应的uid和gid 都是 33,那么,就有3种情况:

1.在宿主机或nginx容器中也存在 www-data:www-data 且uid:gid 也是 33:33 ,则该文件的属主和属组在这里也是www-data;

2.在宿主机或nginx容器中不存在 www-data 但是有个叫someone的用户的uid是33 ,那么此文件的属主就是someone;

3.在宿主机或nginx容器中不存在uid和gid 33,则文件没有归属用户,使用ls -l 查看时会直接显示uid和gid;

所以,这里要注意nginx和php容器中运行nginx和php-fpm的用户和用户组,它们的用户名和组名可以不相同,但是一定要有相同的uid或gid,否则会出现文件访问权限问题;如果同时跑多个版本的php也是同理;

而jenkins容器是用root用户运行的,而且只起到“搬运工”的作用,所以jenkins容器中有没有用户和用户组www-data以及uid:gid 33都不重要,只要在修改文件归属时指定你需要的uid:gid即可​;​

提供几个可能用得到的命令:

useradd [username]    #新建用户

groupadd [groupname]   #新建用户组

usermod -G [groupname] [username]   #将用户添加到用户组

usermod -u NEW-UID username  #修改用户的uid

groupmod -g NEW-GID groupname  #修改用户组的gid

最后推销一下自己的公众号😂😂

Docker+Jenkins 搭建多版本php环境

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这