CI服务器搭建

CI服务器

CI服务器,持续集成服务器,通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。本文搭建基于 Docker+Jenkis+Sonar+Nexus 的CI服务器。

环境准备

Docker环境准备(略),确信docker服务已安装并且docker命令可执行。

    sudo docker

Nexus安装

1.安装

    sudo docker search nexus

找到sonatype/nexus

    sonatype/nexus                       Sonatype Nexus                                  51                   [OK]
    sudo docker pull sonatype/nexus

下载image完成后,启动nexus

    sudo docker run -d -p 8081:8081 --name sonatype-nexus -v /app/nexus-data/sonatype-work:/sonatype-work sonatype/nexus:oss 

映射容器8081端口和数据存放目录/sonatype-work 到宿主机器上。

2.配置

访问 http://nexus:8081 默认管理员账号admin/admin123登录。

http://nexus:8081

Jenkins安装

1.安装

    sudo docker search jenkins

找到官方image

    jenkins                               Official Jenkins Docker image                   553       [OK]     
    sudo docker pull jenkins

下载image完成后,启动jenkins

    sudo docker run --name jenkins -d -u root -p 8080:8080 -v /app/jenkins_home:/var/jenkins_home jenkins

映射容器8080端口和数据存放目录/var/jenkins_home 到宿主机器上。

2.配置

访问 http://jenkins:8080

http://jenkins:8080

Read More

Docker学习<3>部署一个Web应用

部署一个web应用

  1. 下载jetty镜像

     $ docker pull jetty
     jetty     9        3f468c596b78        2 days ago          344.1 MB
    

    大概300M+,包括OpenJdk1.7 和操作系统

  2. 官方文档 Jetty registry

     $ docker run -d jetty
    

    测试 http://container-ip:8080 可以看到 jetty 已经运行,如果你想使用host的端口请做如下端口映射:

     $ docker run -d -p 8888:8080 jetty
    

    现在可以用 Docker host 的 ip 和端口 8888 来测试 jetty

     $curl http://docker-host-ip:8888
     <HTML>
     <HEAD>
     <TITLE>Error 404 - Not Found</TITLE>
     <BODY>
     <H2>Error 404 - Not Found.</H2>
     No context on this server matched or handled this request.<BR>Contexts known to this server are: <ul></ul><hr><a href="http://eclipse.org/jetty"><img border=0 src="/favicon.ico"/></a>&nbsp;<a href="http://eclipse.org/jetty">Powered by Jetty:// Java Web Server</a><hr/>
    

    jetty镜像的默认环境配置:

     $ docker run -i -t jetty env
     PATH=/usr/local/jetty/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
     HOSTNAME=9a862391d719
     TERM=xterm
     JAVA_VERSION=7u75
     JAVA_DEBIAN_VERSION=7u75-2.5.4-2
     JETTY_HOME=/usr/local/jetty
     JETTY_MAJOR=9
     JETTY_VERSION=9.2.10.v20150310
     JETTY_TGZ_URL=http://eclipse.org/downloads/download.php?r=1&file=/jetty/stable-9/dist/jetty-distribution-9.2.10.v20150310.tar.gz
     JETTY_BASE=/var/lib/jetty
     JETTY_RUN=/run/jetty
     JETTY_STATE=/run/jetty/jetty.state
     TMPDIR=/tmp/jetty
     HOME=/root    
    

    Webapps 被部署在容器内的 /var/lib/jetty/webapps.
    挂载 Docker Host 上的目录到容器内:

     $ docker run -d  -v /tmp/webapps:/var/lib/jetty/webapps -p 8080:8080 jetty
    

    挂载 Docker Host上的 /tmp/webapps 到容器的 /var/lib/jetty/webapps 目录并映射 Host 上8080端口到容器的 8080 端口。
    下面部署webapp/tmp/webapps 中,建立一个Web Project:jetty-webapp-test,在web根目录添加两个测试文件 index.jspindex.html,打包成 jetty-webapp-test.war。把war包移动到Docker Host/tmp/webapps 下:

     $ curl http://localhost:8080/jetty-webapp-test/index.html
     <!DOCTYPE html>
     <html>
     <head>
     <meta charset="UTF-8">
     <title>index.html</title>
     </head>
     <body>
     这是一个测试html!
     </body>
     </html>
     $ curl http://localhost:8080/jetty-webapp-test/index.jsp
     <html>
     <body>
     <h2>Hello World!</h2>
     hello world!
    

    部署完成。

Docker学习<2>入门

教程示例

入门教程

  1. 搜索可用的docker镜像

     $ docker search tutorial
     NAME                                       DESCRIPTION   STARS     OFFICIAL   AUTOMATED
     learn/tutorial                                           8                    
     caterpillar/java-tutorial                                2                    
     caterpillar/python-tutorial                              2                    
     florentbenoit/docker-angularjs-tutorials                 1                    [OK]
     fabioberger/dockerize-tutorial                           0                    [OK]
     tobegit3hub/tutorial-beego                               0                    [OK]
     wonderlamb/tutorial                        Tutorial      0                    
     kedarvaidya/rails-tutorial-v3-dev                        0                    [OK]
    

    找到 learn/tutorial,官方入门示例。

  2. 下载容器镜像

     $ docker pull learn/tutorial
     Pulling repository learn/tutorial
     8dbd9e392a96: Downloading [=================>                                 ]    20 MB/58.34 MB 7m40s
    
  3. docker容器中运行hello world!

     $ docker run learn/tutorial echo "hello word"
     hello word
    
  4. 在容器中安装新的程序

     $ docker run learn/tutorial apt-get install -y ping
    

    在执行apt-get 命令的时候,要带上-y参数。如果不指定-y参数的话,apt-get命令会进入交互模式,需要用户输入命令来进行确认,但在docker环境中是无法响应这种交互的。

  5. 保存对容器的修改

     $ docker ps -l
     CONTAINER ID        IMAGE                   COMMAND                CREATED             STATUS              PORTS               NAMES
     942f628e4d4f        learn/tutorial:latest   "ping www.sina.com.cn   7 seconds ago                                               modest_heisenberg   
     $ docker commit 942 learn/ping
     94015fcbbe9bdf9d788ba2085de6d7409cf9cf52a7899fa3313363505fb949bc
     $ docker images
     REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
     learn/ping          latest              94015fcbbe9b        15 seconds ago      128 MB
     centos              7                   88f9454e60dd        2 weeks ago         223.9 MB
     centos              centos7             88f9454e60dd        2 weeks ago         223.9 MB
     centos              latest              88f9454e60dd        2 weeks ago         223.9 MB
     learn/tutorial      latest              8dbd9e392a96        23 months ago       128 MB
    

    首先使用docker ps -l命令获得安装完ping命令之后容器的id。然后把这个镜像保存为learn/ping

  6. 运行新的镜像

     $docker run learn/ping ping www.sina.com.cn
    

网上对Docker的理解

  1. 每个container中运行的进程,是的的确确运行在host上的(用ps 可以查看的到), 这样的话,无论你的镜像是基于ubuntu, centos, 还是debian的,都是运行在主机内核上的(container中没有自己的内核)。也就是说如果主机内核不满足需求,container中的依赖此特性的应用程序就无法运行

  2. Image的分层,可以想象成photoshop中不同的layer。每一层中包含特定的文件,当container运行时,这些叠加在一起的层就构成了container的运行环境(包括相应的文件,运行库等,不包括内核)。Image通过依赖的关系,来确定整个镜像内到底包含那些文件。之后的版本的docker,会推出squash的功能,把不同的层压缩成为一个,和Photoshop中合并层的感觉差不多。

  3. Docker中的镜像就是一堆文件的集合,并不是像VM那样的是一个操作系统。镜像可以简单到只有一个程序文件。如果你写一个helloworld 静态编译后放到一个空的Image中(可以用FROM scratch作为基础镜像),那么整个image的大小,就是你编译后的二进制文件的大小。 如果你不是静态编译的话,就要把相应的链接库放到镜像中相应的位置,才能使得程序正确运行,否则会提示找不到文件。官方提供的ubuntu等基础镜像,就是把依赖的文件放到正确的地方,从而使得绝大部分程序可以正常运行。和VM的镜像是完全不同的概念

  4. Docker能够限制container使用的主机资源。lxc containerdocker最早版本的运行环境,现在他们默认采用libcontainer,今后估计会逐步减少lxc container的支持。如果要限制cpu和memory,在docker run 中直接使用-c -m参数即可。个人认为,这只是限制了container的资源,并不能够保证container能够确实分到足够的资源。当然,如果你的所有程序都是运行在container中,并且都限制好资源的话,那么应该还是可以满足你的需求的。每台host中,可以同时运行上百个container,互不干扰。每个container只是一个host中的进程,很轻量化。VM就不能做到同时运行这么多。编程接口,docker提供了Remote API和python library(docker-py), 同时还有github上还有很多第三方的库,支持不同的语言

相关资料

相关资源

Docker学习<1>环境准备

软件准备

Oracle VirtualBox4.3.6

CentOS-6.6-x86_64-minimal.iso

Docker 安装

  1. 确认你的CentOS 的版本
    首先通过以下命令确认你的CentOS 版本

     $ cat /etc/redhat-release 
     CentOS release 6.6 (Final)
    
  2. 下载EPEL 的rpm 安装包
    现在从上面的地址下载CentOS 版本所对应的EPEL 的版本

     $ wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
    
  3. 安装EPEL
    通过以下命令安装EPEL 软件包

     $ sudo rpm -ivh epel-release-6-8.noarch.rpm
    

    Read More