在docker中部署Jenkins和Jenkins-slave并进行持续集成

一些对docker的介绍

首先是一点复制自docker官方网站的docker介绍:

Docker is an open platform for building, shipping and running distributed applications. It gives programmers, development teams and operations engineers the common toolbox they need to take advantage of the distributed and networked nature of modern applications.

说的简单些,docker就是一个利用linux内核中的cgroups进行了资源隔离之后的容器,基于LXC。其实就是一种简化版的虚拟机。可以这么理解,一个进程运行在docker中实际上就是它被docker隔离开了,它看不到docker之外的进程。同时,它所能访问的资源也受到了相应的cgroups的限制。

docker有以下优势:

  1. 创造一个不受干扰的环境
  2. 在docker hub上已经有大量的配置好的镜像,下载就可室友
  3. docker与虚拟机相比更加轻量级

先明确几个概念:

1.images,镜像,即一个系统的磁盘文件,docker使用的镜像是差量的,这就是说,docker会自动在一个镜像上覆盖一个新的layer,每次虚拟机中的文件修改发生在新的layer上。同时,也可以在已有的image上叠加layer构成新的镜像。

2.container,容器,即实实在在运行的虚拟机,container从一个image中启动一个进程,该进程退出后container自动关闭。但对应的新创建的layer不会自动清除,也就是说,仍然可以用 docker start $ID 的方法重新启动container。

其余内容请参阅https://docs.docker.com/

Jenkins

Jenkins是一个持续集成工具,也就是说能执行自动构建、部署、单元测试等功能。

安装方法

Jenkins官方docker

上面那个链接给出了详细的部署方法,只要 docker pull jenkins 再执行

一个含有jenkins的container就运行起来了,省去了安装jdk的麻烦。接下来,访问127.0.0.1:8000,在其中的系统管理中搜索安装Docker Plugin插件。值得注意的是,因为在国内无法访问Google,所以check internet 需要很长时间,而且会超时。建议执行

然后修改/etc/hosts,将www.google.com指向www.baidu.com对应的ip…….

接下来,就是配置Jenkins Slave了。

这里有个问题,Jenkins是通过访问宿主机上的docker API来启动对应的slave的,而Jenkins本身就在container中,因此无法访问宿主机上的docker API,这时,需要在宿主机中的docker配置文件中加入

以让docker监听所有接口。(注意配置防火墙)

然后在宿主机上建立Dockerfile。关键有以下几部分:

  • 安装ssh-server
  • 允许ssh-server登陆
  • 安装openJDK并设置环境变量
  • 设置好locale之类的设置
  • 因为我的项目使用python,还需配置virtualenv,python等内容。以下为完整的Dockerfile

然后对其进行docker build . slave就可以了。接下来,在Jenkins的系统设置->云里,并设置好宿主的ip地址等信息,并添加一个docker template,label的作用和nodes里label的作用相同,id填docker build时起的image的name。大功告成!

让位于反向代理后的wordpress获得真实ip

由于freeshell使用nginx作为反向代理,导致apache不能获取到客户端的ip,从而wordpress中评论的ip地址都显示为了nginx反向代理的ip。

在apache上安装mod_rpaf插件,将nginx设置的 X-Real-IP 变量中的真实ip复制到 X-Forwarded-For 变量内:

下载插件:

编译安装:

编辑apache的配置文件:添加一个配置文件

 

 

但诡异的是,wordpress并不认这个 X-Forwarded-For 变量,需要再安装一个叫reverse-proxy-comment-ip-fix的插件,方可获取到真实的客户端ip。

为反向代理后的wordpress添加https

今天我兴高采烈的申请完startssl的免费ssl证书后,就想部署到freeshell上,将证书和私钥都上载好了后,通过https访问博客发现大量的css,js都是http格式的,导致浏览器自动禁用了不安全的脚本,使网站看起来一团糟。我赶紧在wordpress控制台中将网站地址改成了https开头的,结果不仅仍然一团糟,还导致wp-admin管理控制台无限重定向了。

接着,我在qq上咨询了boj,得知freeshell前端采用nginx进行反向代理,使用服务器头x-scheme向后端传递所使用的协议。我猜测是这样的:

结果wordpress认为当前使用的协议是http,又因为将站点地址设置为了https,导致登陆时wordpress无限重定向到https,且用https访问时所用资源使用http加载。 所以只要让wordpress认为是通过https访问的即可。

设置方法如下,在apache的配置文件中加入下面的内容:

意思就是如果x-scheme满足https开头就将服务器变量https设为on,这样wordpress在检测变量 $_SERVER["https"]时得到的结果就是on,就能正常显示了。

mysql服务启动失败解决方法

近期,在freeshell的一次重启之后,我发现我的mysql服务器无法启动。启动时显示Starting MYSQL…..后没有反应,但通过mysqld –user=root 服务能正常启动。

查看日志, tail -n 30 /var/lib/mysql/*.err

发现有以下内容

./ibdata1 can't be opened in read-write mode

怀疑是权限问题,因此用如下方法进行修复:

chown mysql:mysql -R /var/lib/mysql

问题得到解决。以后遇到此类问题,需要想到查看日志。

在USTC freeshell上配置snmp使用监控宝

刚被中科大录取没几天,便发现中科大提供freeshell服务,便试图在上面配置监控宝。

我使用的发行版是centos 6, 内置了net-snmp,只需创建一个账户并配置权限即可。

1.编辑配置文件 /etc/snmp/snmpd.conf ,添加以下内容:

意思是:给账号kwxdg只读的权限,并需要验证。

创建账号kwxgd,密码使用md5加密,密码为passowrd

2.启动服务

3.设置开机启动

4.在ustc freeshell里添加端口映射:

端口映射

5.在监控宝中添加相关项目:

监控宝

 

 

然后就完成了。