jenkins加docker自动化部署

来源:互联网 发布:儿童医院在线咨询网络 编辑:程序博客网 时间:2024/05/16 19:08
系统 阿里云centos7
内网ip 172.17.188.51
外网ip 59.110.157.77
防火墙关闭
因为服务器资源有限 一台服务器需要部署很多的服务 为了资源隔离所以采用docker容器的方式让各个服务分开
购买的阿里云内存就2G 因为要部署很多应用 所以需要设置下交换分区swap来扩大内存 一般swap的大小为物理内存的2倍 所以我设置为4G
一、查看系统当前的分区情况:
>free -m
             total       used       free     shared    buffers     cached
Mem:           438        432          6          0          8        141
-/+ buffers/cache:        282        156
Swap:         0          0          0
二、创建用于交换分区的文件:如果要增加4G大小的交换分区,则命令写法如下,其中的 count 等于想要的块大小
只要建立/home目录就可以了 swap会自动建立
>dd if=/dev/zero of=/home/swap bs=block_size count=number_of_block
dd if=/dev/zero of=/home/swap bs=1024 count=4096000
2048000+0 records in
2048000+0 records out
2097152000 bytes (2.1 GB) copied, 60.4492 seconds, 34.7 MB/s
三、设置交换分区文件:
>mkswap /home/swap
四、立即启用交换分区文件:
>swapon /home/swap
五、若要想使开机时自启用,则需修改文件/etc/fstab中的swap行:
/home/swap swap swap defaults 0 0

[root@test ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           438        433          5          0          2     


267
-/+ buffers/cache:        163        275
Swap:         4047       1465       2581
首先安装docker centos7使用yum安装的docker版本为1.12
yum install -y docker
启动docker
service docker start
查看版本
docker -v
Docker version 1.12.6, build 88a4867/1.12.6
设置docker开机启动
[root@blogfroum ~]# chkconfig --level 123456 docker on
首先安装docker的web管理界面 个人比较喜欢shipyard 部署也简单
下载shipyard的镜像
docker pull rethinkdb && docker pull microbox/etcd && docker pull shipyard/docker-proxy && docker pull swarm && docker pull dockerclub/shipyard
查看下载的镜像
[root@blogfroum ~]# docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
docker.io/swarm                   latest              7ecf8baf8eae        6 weeks ago         15.77 MB
docker.io/rethinkdb               latest              be24926bde9a        9 weeks ago         182.5 MB
docker.io/dockerclub/shipyard     latest              2ac2c13dfa84        17 months ago       61.36 MB
docker.io/shipyard/docker-proxy   latest              cfee14e5d6f2        20 months ago       9.464 MB
docker.io/microbox/etcd           latest              6aef84b9ec5a        2 years ago         17.86 MB
创建存放脚本的目录
[root@blogfroum shipyard]# mkdir /usr/local/software/shipyard
[root@blogfroum shipyard]# cd /usr/local/software/shipyard/
shipyard已经提供了安装脚本 直接运行脚本就可以进行安装 首先下载脚本 修改一些必要参数
[root@blogfroum shipyard]# wget https://shipyard-project.com/deploy
[root@blogfroum shipyard]# grep -n shipyard:latest deploy
[root@blogfroum shipyard]# sed -i 's/shipyard\/shipyard:latest/dockerclub\/shipyard:latest/g' deploy
脚本默认映射8080端口 如果想要修改端口 可以修改脚本
vim deploy
找到SHIPYARD_PORT
SHIPYARD_PORT=${PORT:-8080}
修改为
SHIPYARD_PORT=${PORT:-9000}
启动脚本
sh deploy
等待安装好
因为是阿里云所以还需要在阿里云上开放对应的端口

之后可以通过浏览器访问了




用户名默认为
admin
shipyard
登录以后可以修改密码

使用shipyard可以很直观的看到docker上的容器和镜像 也有缺点就是全部一起显示 没有分类或者搜索


可以通过页面对容器镜像关闭 启动 扩容 

我比较常用的是控制台 可以直接通过这个进入到容器内部  

不过这个管理工具功能还是比较简单的 所以很多操作还是需要在服务器上敲命令 平时注意是为了查看状态

docker默认的网桥docker0创建容器ip是自动获取的 而我为了管理需要ip为手动设置 自己来控制 所以我需要创建自己的网桥 自己自定义的网桥是可以手动设置ip的
创建一个名字为mynet的网桥 网段为172.20.1.0/24 这里要注意的是docker0默认的网段是172.17.0.0 我们新创建的不能和docker0为同一网段 不然会报错
[root@blogfroum shipyard]# docker network create --subnet=172.20.1.0/24 mynet
通过查看命令可以看到刚刚创建的mynet虚拟网桥
[root@blogfroum shipyard]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1144148743c8        bridge              bridge              local               
6b89afa520b6        host                host                local               
d7742bb8d929        mynet               bridge              local               
75cc9fca94ee        none                null                local   
[root@blogfroum shipyard]# ifconfig
br-d7742bb8d929: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.20.1.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 02:42:a3:a4:e6:c5  txqueuelen 0  (Ethernet)
        RX packets 6469  bytes 1724321 (1.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8848  bytes 1066783 (1.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


接下来安装Nginx
首先安装依赖包 
yum -y install pcre-devel openssl openssl-devel
从这个地址下载稳定版的Nginxhttps://nginx.org/en/download.html我下载的是1.12.1版本
之后下载到服务器解压
wget -c https://nginx.org/download/nginx-1.12.1.tar.gz
[root@blogfroum nginx]# tar -zxvf nginx-1.12.1.tar.gz
[root@blogfroum nginx]# ls
nginx-1.12.1  nginx-1.12.1.tar.gz
接下来进入目录进行编译安装 
[root@blogfroum nginx]# cd nginx-1.12.1
[root@blogfroum nginx-1.12.1]# ./configure --prefix=/usr/local/software/nginx
[root@blogfroum nginx-1.12.1]# make && make install
之后设置配置文件
[root@blogfroum nginx]# cd /usr/local/software/nginx/ conf
[root@blogfroum conf]# vim nginx.conf

开启gzip 静态资源压缩 可以提高网页访问速度
开启
gzip on;
设置压缩级别为4 可选为1-10 等级越高压缩率越好 不过也越占用CPU 这个可以根据实际需求来
gzip_comp_level 4;

然后保存退出 启动nginx
[root@blogfroum conf]# cd ..
[root@blogfroum nginx]# cd sbin/
[root@blogfroum sbin]# ./nginx
如果想停止为
[root@blogfroum sbin]# ./nginx -s stop
如果修改了nginx.conf文件 想重新加载可以
[root@blogfroum sbin]# ./nginx -s reload
接下来设置nginx开机自动启动
[root@blogfroum sbin]# vim /etc/rc.local

这样nginx就安装完毕了

接下来搭建自己的nexus服务器

通过docker部署nexus2

docker上已经有人直接提供nexus2的镜像 当然也提供了nexus3的镜像 不过3一般是用来做docker之类的仓库 而我是主要用来做maven仓库 所以使用nexus2所以用docker部署nexus很简单

可以先搜索镜像 可以看到有很多镜像 而我这边使用下载最多的docker.io/sonatype/nexus

[root@localhost /]# docker search nexusINDEX       NAME                                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATEDdocker.io   docker.io/sonatype/nexus                               Sonatype Nexus                                  340                  [OK]docker.io   docker.io/sonatype/nexus3                              Sonatype Nexus Repository Manager 3             213                  docker.io   docker.io/sonatype/docker-nexus3                       Sonatype Nexus 3 [DEPRECATED]                   25                   [OK]docker.io   docker.io/clearent/nexus                               Sonatype Nexus container                        20                   docker.io   docker.io/baselibrary/nexus                            ThoughtWorks Docker Image: nexus                7                    [OK]docker.io   docker.io/accenture/adop-nexus                         ADOP Nexus                                      5                    [OK]docker.io   docker.io/bradbeck/nexus-https                         Dockerized version of Nexus Repo Manager 3...   4                    [OK]docker.io   docker.io/frekele/nexus                                docker run --rm --name nexus -p 8081:8081 ...   4                    [OK]

下载镜像

 docker pull docker.io/sonatype/nexus

创建容器 ip设置为172.20.1.10 设置容器名字为nexus
[root@blogfroum nginx]# docker run -d -p 8081:8081 --net mynet --ip 172.20.1.10 --name nexus docker.io/sonatype/nexus


启动容器以后需要等待3分钟等服务彻底启动 之后可以访问docker主机的域名加nexus访问nexus 因为截图的时候域名还在备案 所以用ip代替

登录用户名密码默认为
admin
admin123
登录以后可以设置新密码

上传第三方jar包到nexus

接下来开始安装Jenkins配合docker实现自动化部署
Jenkins因为占用内存过大 所以没有安装到服务器上 而是安装到本地电脑 在本地编译以后上传到服务器部署
jenkins里面因为用到的maven仓库指向的是我搭建的私有仓库 所以没有用docker部署 而是传统方法部署
首先上传jdk1.8 tomcat8 maven到服务器
[root@docker1 software]# pwd
/usr/local/software
[root@docker1 software]# ls
apache-tomcat-8.0.33  jdk1.8.0_131  maven
设置环境变量
[root@docker1 software]# vi /etc/profile
在最下面新增
export MAVEN_HOME=/usr/local/software/maven
export PATH=${PATH}:${MAVEN_HOME}/bin

export JAVA_HOME=/usr/local/software/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin:$PATH:$HOME/bin
刷新环境变量
[root@docker1 software]# source /etc/profile
[root@docker1 software]# mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T08:41:47-08:00)
Maven home: /usr/local/software/maven
Java version: 1.8.0_131, vendor: Oracle Corporation
Java home: /usr/local/software/jdk1.8.0_131/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-327.el7.x86_64", arch: "amd64", family: "unix"

之后进入Tomcat的webapps目录下下载Jenkins目前最新的稳定版本为2.6
[root@docker1 software]# cd apache-tomcat-8.0.33/webapps/
[root@docker1 webapps]# wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
--2017-09-01 22:40:38--  http://mirrors.jenkins.io/war-stable/latest/jenkins.war
Resolving mirrors.jenkins.io (mirrors.jenkins.io)... 52.202.51.185
[root@docker1 webapps]# ls
docs  examples  host-manager  jenkins.war  manager  ROOT
进入Tomcat的bin目录 给所有文件可执行权限 之后执行启动tomcat
[root@docker1 webapps]# cd /usr/local/software/apache-tomcat-8.0.33/bin/
[root@docker1 bin]# chmod +x *
[root@docker1 bin]# ./startup.sh
Using CATALINA_BASE:   /usr/local/software/apache-tomcat-8.0.33
Using CATALINA_HOME:   /usr/local/software/apache-tomcat-8.0.33
Using CATALINA_TMPDIR: /usr/local/software/apache-tomcat-8.0.33/temp
Using JRE_HOME:        /usr/local/software//jdk1.8.0_131/jre
Using CLASSPATH:       /usr/local/software/apache-tomcat-8.0.33/bin/bootstrap.jar:/usr/local/software/apache-tomcat-8.0.33/bin/tomcat-juli.jar
Tomcat started.
之后等待一分钟就可以通过10.10.10.224::8080/jenkins访问网站了 

首先要输入初始化密码 这个密码存放的路径已经告诉我们了  /root/.jenkins/secrets/initialAdminPassword
[root@docker1 logs]# cat /root/.jenkins/secrets/initialAdminPassword
7868790f6cce48e0b7d48b980af8e218

7868790f6cce48e0b7d48b980af8e218 这个就是密码把密码输入进去点击进入下一步

之后选择自定义安装插件

因为我们项目是基于git加ssh所以这两个插件都要安装上 系统默认已经给我们勾选的插件可以不动


之后点击install就开始安装了 这一步需要安装很久 而且有可能安装失败

安装好以后创建管理员用户名密码 这里要注意信息要全部填写 如果有漏了 按保存会没反应

接下来开始进入jenkins

安装maven插件




然后先对全局工具进行一些配置

在10.10.10.224服务器上先安装git 不然进行全局工具的时候会提示git没有这个命令

[root@docker1 software]# yum -y install git
之后填写配置信息


之后保存退出 接下来配置系统设置

这里主要是配置ssh 因为我们是通过ssh把编译打包好的软件上传到阿里云服务器上
第一个为名字 这里填写自己想要设置的名称 第二个为阿里云的ip地址 第三个为连接的用户我这里用的是root为了安全性推荐是用其他用户来连接 第四个为要上传到阿里云的哪个目录下 所以设置这里之前需要在阿里云上创建对应的目录
[root@blogfroum ~]# mkdir /data/dockerfiles/blogforumnote -p

全部设置好了以后可以点击下面的test configuration进行测试连接 如果是success代表连接成功 保存

接下来开始创建任务

选择构建maven项目 如果前面没有安装maven插件是不会有这个的

之后开始进行一些设置  
设置只保留4次构建

设置git配置 因为我这边用的是github代码直接共享的 所以直接使用路径就可以了 如果用的是私人的git还需要设置Credentials填写用户名密码 代码直接使用master主干代码


编译的时候跳过测试

选择增加构建后的操作

填写相应的信息 第一个为前面设置系统设置的时候设置的ssh连接信息 第二个为jenkins本地编译打包好的war包 第三个为上传到阿里云服务器的时候去掉前置目录 只把war包上传 不然会把整个项目上传 这里的路径都是相对路径 最后一个为上传到服务器以后执行服务器上指定的脚本 我在这个脚本里写了创建容器并且把文件上传到容器中 脚本内容后面讲

之后保存退出
开始选择构建 只有刚刚设置的构建参数才会出现这个


之后等待构建完成

如果有问题的话可以看下日志
点击构建项
选择console output



可以看到成功的上传文件到阿里云上并且执行了脚本 因为只是测试脚本 所以只是打印了a
在阿里云上也可以看到上传的war包
[root@blogfroum blogforumnote]# pwd
/data/dockerfiles/blogforumnote
[root@blogfroum blogforumnote]# ls -lh
total 34M
-rw-r--r-- 1 root root 34M Sep  2 18:08 blogforum.war
-rwxr-xr-x 1 root root   7 Sep  2 16:18 run.sh

接下来设置docker宿主机
因为我是设置的阿里云上的  所以需要先设置Linux的熵池 不然Tomcat启动会很慢 原因可以看这里http://www.jianshu.com/p/576d356dc163
安装rngd
yum install -y rng-tools
systemctl start rngd
cp /usr/lib/systemd/system/rngd.service /etc/systemd/system
vi /etc/systemd/system/rngd.service

找到ExecStart 在最后加上-r /dev/urandom
ExecStart=/sbin/rngd-f-r /dev/urandom
重新载入服务     
systemctl daemon-reload
重启服务
systemctl restart rngd
之后因为要手动设置ip所以要自定义docker网络 创建一个名字为mynet的自定义网桥 网段为172.20.1.0
docker network create --driver=bridge --subnet=172.20.1.0/24 mynet
之后设置nginx
vi /usr/local/software/nginx/conf/nginx.conf
新加下面的配置 当访问note.bojisystem.com域名的时候会代理到172.20.1.10ip 这个ip是后面blogforumnote的ip
    upstream note{
        server 172.20.1.10;
    }

    server {
        listen 80;
        server_name note.bojisystem.com;
        location / {
          proxy_pass http://note/;
        }
    }
重启配置
/usr/local/software/nginx/sbin/nginx -s reload
接下来设置脚本
[root@blogfroum blogforumnote]# vi /data/dockerfiles/blogforumnote/run.sh

#!/bin/sh
#关闭blogforumnote容器
docker stop blogforumnote
#删除blogforumnote容器
docker rm blogforumnote
#基于docker.io/blogforum/centos6.9:tomcat8 创建一台ip为172.20.1.10的容器 名字为blogforumnote 
docker run -it --net mynet --ip 172.20.1.10 --name blogforumnote  -d docker.io/blogforum/centos6.9:tomcat8
#拷贝 Tomcat配置文件到容器
docker cp /data/dockerfiles/blogforumnote/server.xml blogforumnote:/root/tomcat8/conf/
#拷贝jenkins上传的war包到容器
docker cp /data/dockerfiles/blogforumnote/blogforum.war blogforumnote:/root/tomcat8/webapps/
#运行容器中tomcat的启动脚本
docker exec blogforumnote /bin/bash /root/tomcat8/bin/startup.sh

server.xml里主要是新增了项目文件 这样访问项目可以不用在ip后面加项目名
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
 <Context path="" docBase="blogforum"/>












原创粉丝点击