环境:
主机(mac osx)和虚拟机(Ubuntu 16.04)
mac osx系统,运行Jenkins
Ubuntu16.04系统,运行docker(用Ubuntu14.04镜像创建一个docker)
 
tips:
1、Jenkins运行在哪个环境都可以(这里运行在osx系统)
2、Jenkins创建的node(slave),launch slave agents on Unix machines via SSH(通过SSH远程登陆Unix,这里的Unix环境是用Ubuntu14.04镜像创建的docker)
3、http://www.cnblogs.com/hslzju/p/5839913.html这篇文章讲了SSH登陆docker的方式。本文采用公钥验证方式SSH登陆docker。
4、只有docker的宿主机才能SSH登陆docker(这个是我试验的结果,我猜测是因为docker的IP是虚拟出来的,和Jenkins运行的服务器不在同一个子网)。
5、http://www.cnblogs.com/hslzju/p/5839913.html这篇文章提到,可以采用端口映射方式登陆docker,即ssh root@172.17.0.2和ssh -p 32770 root@192.168.127.159都可以登陆docker(172.17.0.2是docker的IP,192.168.127.159是docker的宿主机的IP)。
6、所以,Jenkins可以通过端口映射登陆docker。需要以下几步:
1)在docker的宿主机内,用Ubuntu14.04镜像创建一个docker的时候,将docker的22端口映射到宿主机(可指定也可以随机分配)
2)将docker的sshd服务打开(docker作为server,宿主机作为client)
3)将宿主机的公钥给docker(这样宿主机可以通过SSH远程登陆docker)
4)测试宿主机是否能通过SSH公钥验证方式远程登陆docker,这样保证Jenkins也能通过SSH公钥验证方式远程登陆docker。Jenkins和docker集成的时候,docker的宿主机是不需要SSH远程到docker的。
5)把docker的宿主机的子网IP地址,以及和docker的22端口映射的端口,提供给Jenkins。
6)把docker的宿主机的私钥,提供给Jenkins。
7)在Jenkins中创建node,运行。
 
1、Ubuntu以SSH公钥验证方式运行docker(image是Ubuntu 14.04)
hsl@ubuntu:~$ sudo docker images
[sudo] hsl 的密码: 
REPOSITORY TAG IMAGE ID CREATED SIZE
hsl/ubuntu 14.04_JenkinsNodeRunDocker 659fcb00b0dc 23 hours ago 760.1 MB
hsl/ubuntu 14.04_Git d664d1c80431 41 hours ago 248.1 MB
ubuntu 14.04 4a725d3b3b1c 6 days ago 188 MB
hsl@ubuntu:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
hsl@ubuntu:~$ sudo docker run -tid -p 22 -P ubuntu:14.04
31f817fba3096c4d3ef9f08819bba159a4849cc368be586fe1c73635d8d0370e
hsl@ubuntu:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31f817fba309 ubuntu:14.04 "/bin/bash" 15 seconds ago Up 4 seconds 0.0.0.0:32768->22/tcp pedantic_curran
hsl@ubuntu:~$ sudo docker exec -it 31 /bin/bash
root@31f817fba309:/# which ssh
root@31f817fba309:/# apt-get update
root@31f817fba309:/# apt-get install openssh-server
root@31f817fba309:/# which ssh
/usr/bin/ssh
root@31f817fba309:/# sudo ps -e|grep ssh
root@31f817fba309:/# service ssh start
* Starting OpenBSD Secure Shell server sshd [ OK ] 
root@31f817fba309:/# sudo ps -e|grep ssh
3437 ? 00:00:00 sshd
root@31f817fba309:~# apt-get install vim
root@31f817fba309:~# which vim  
/usr/bin/vim
root@31f817fba309:~# cd /etc/ssh
root@31f817fba309:/etc/ssh# ls
moduli ssh_host_dsa_key ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key ssh_import_id
ssh_config ssh_host_dsa_key.pub ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub ssh_host_rsa_key.pub sshd_config
root@31f817fba309:/etc/ssh# vim sshd_config 
#三个地方改成:
PermitRootLogin without-password(默认的)
AuthorizedKeysFile %h/.ssh/authorized_keys(取消注释)
PasswordAuthentication yes(取消注释)
 
#PermitRootLogin yes #允许root用户以任何认证方式登录(貌似也就两种认证方式:用户名密码认证,公钥认证)
#PermitRootLogin without-password #只允许root用public key认证方式登录
#PermitRootLogin no #不允许root用户以任何认证方式登录
 
#AuthorizedKeysFile %h/.ssh/authorized_keys
存放该用户可以用来登录的 RSA/DSA 公钥。该指令中可以使用下列根据连接时的实际情况进行展开的符号:
%% 表示'%'、%h 表示用户的主目录、%u 表示该用户的用户名。
经过扩展之后的值必须要么是绝对路径,要么是相对于用户主目录的相对路径。
默认值是".ssh/authorized_keys"。
 
#PasswordAuthentication yes
PasswordAuthentication设置是否允许口令验证。
如果服务器不在本地,千万不能PasswordAuthentication yes->no,万一当前的ssh链接中断,万一RAS认证没弄好,密码验证又禁止了。
root@31f817fba309:~# exit
exit
hsl@ubuntu:~$ ssh-keygen -t rsa
#一直回车,生成宿主机的密钥
hsl@ubuntu:~$ cd .ssh
hsl@ubuntu:~/.ssh$ ls
id_rsa id_rsa.pub known_hosts
hsl@ubuntu:~/.ssh$ cat id_rsa.pub
hsl@ubuntu:~/.ssh$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31f817fba309 ubuntu:14.04 "/bin/bash" 3 hours ago Up 3 hours 0.0.0.0:32768->22/tcp pedantic_curran
hsl@ubuntu:~/.ssh$ sudo docker exec -it 31 /bin/bash
root@31f817fba309:/# cd .ssh
bash: cd: .ssh: No such file or directory
root@31f817fba309:/# ssh-keygen -t rsa
root@31f817fba309:/# cd
root@31f817fba309:~# cd .ssh
root@31f817fba309:~/.ssh# ls
id_rsa id_rsa.pub
root@31f817fba309:~/.ssh# touch authorized_keys 
#在/etc/ssh/sshd_config 可看到authorized_keys的拼写
root@31f817fba309:~/.ssh# ls
authorized_keys id_rsa id_rsa.pub
root@31f817fba309:~/.ssh# vim authorized_keys 
把client的公钥复制进去
********我的注释*********
ssh 客户程序可用于登录到远程服务器。所要求的只是该远程机器正在运行 sshd,即 ssh 服务器进程。
本地只需要生成一对密钥。然后把本地的公钥拷贝到想要访问的那些远程机器上。远程机器通过公钥加密信息,本地再用私钥解密。
并不需要为想要访问的每个远程服务器都准备一对密钥,本地只要有一对公钥密钥就足够了。
本地作为client,docker作为server。本地通过SSH的公钥验证方式连接docker。需要:
1、docker的sshd正在运行。2、docker有本地的公钥,放在authorized_keys文件中。
********我的注释*********
root@31f817fba309:~/.ssh# exit
exit
hsl@ubuntu:~/.ssh$ ssh -p 32768 root@192.168.127.152
#第一次通过SSH公钥验证方式登陆docker会出现警告,以后再登陆不用验证。因为做了端口映射,所以可以直接从映射的端口登陆。
root@31f817fba309:~# exit
logout
Connection to 192.168.127.152 closed.
hsl@ubuntu:~/.ssh$ cd
hsl@ubuntu:~$ ssh -p 32768 root@192.168.127.152
#成功通过SSH公钥验证方式登陆docker,不再有警告
Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-36-generic x86_64)
* Documentation:  https://help.ubuntu.com/
Last login: Fri Sep 2 06:35:04 2016 from 192.168.127.152
root@31f817fba309:~# exit
logout
Connection to 192.168.127.152 closed.
 
2、创建credentials
#Jenkins的node通过SSH连接远程unix有两种验证方式,密码验证和私钥签名(数字证书)。这里用私钥验证方式。创建credential,把Ubuntu的私钥复制进去。
hsl@ubuntu:~$ cd .ssh
hsl@ubuntu:~/.ssh$ ls
id_rsa id_rsa.pub known_hosts
hsl@ubuntu:~/.ssh$ cat id_rsa 
#找到Ubuntu的私钥复制到Jenkins的credential
生成如下证书
 
3、在Jenkins中创建slave node并运行
#运行成功,进入docker的root目录下可以看到如下文件。
hsl@ubuntu:~$ sudo docker exec -it 31 /bin/bash
root@31f817fba309:/# cd root
root@31f817fba309:~# ls
jdk jdk.sh slave.jar
 
4、创建新的镜像把环境保存下来
hsl@ubuntu:~$ sudo docker commit -m "14.04_JenkinsWithDocker" -a "hsl" 31f817fba309 hsl/ubuntu:14.04_JenkinsWithDocker
hsl@ubuntu:~$ sudo docker images 
#查看创建的image

部署Jenkins+docker集成环境的更多相关文章

  1. Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现

    前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇到一个问题,jenkins构建出来的镜像部署后,需要通过ip:port去访问,有什么更好的 ...

  2. Docker+Jenkins持续集成环境(5): android构建与apk发布

    项目组除了常规的java项目,还有不少android项目,如何使用jenkins来实现自动构建呢?本文会介绍安卓项目通过jenkins构建的方法,并设计开发一个类似蒲公英的app托管平台. andro ...

  3. Windows系统的Jenkins持续集成环境

    Windows系统的Jenkins持续集成环境 如题:本文将介绍如何在Windows环境下运用Jenkins部署持续集成环境.之所以写本文,是因为在最近工作当中,学习使用Jenkins时,确实遇到了一 ...

  4. Jenkins持续集成环境, 如何自定义 maven repositories

    假设自定义的仓库路径为“/opt/repository”,那么在“系统管理-系统设置”中,修改“全局MAVEN_OPTS”的值为如下的内容: -Dmaven.repo.local=/opt/repos ...

  5. Jekens 配置多项目SCM GitLab+Jenkins持续集成环境

    参考: 搭建GitLab+Jenkins持续集成环境图文教程 https://blog.csdn.net/ruangong1203/article/details/73065410 Jenkins中配 ...

  6. [Jenkins]持续集成环境下fingbug插件的安装使用与配置

    参考:https://wiki.jenkins.io/display/JENKINS/FindBugs+Plugin 突然,天降杂事.我是想安安静静的做个美丽的测试...但是事与愿违,项目经理叫我帮忙 ...

  7. Docker+Jenkins持续集成环境(2)使用docker+jenkins构建nodejs前端项目

    前文使用Docker搭建Jenkins+Docker持续集成环境我们已经搭建了基于docker+jenkins的持续集成环境,并构建了基于maven的项目.这一节,我们继续扩展功能,增加对Nodejs ...

  8. Docker+Jenkins持续集成环境(1)使用Docker搭建Jenkins+Docker持续集成环境

    本文介绍如何通过Jenkins的docker镜像从零开始构建一个基于docker镜像的持续集成环境,包含自动化构建.发布到仓库\并部署上线. 0. 前置条件 服务器安装docker,并启动docker ...

  9. 一步步部署基于Windows系统的Jenkins持续集成环境

    如题:本文将介绍如何在Windows环境下运用Jenkins部署持续集成环境.之所以写本文,是因为在最近工作当中,学习使用Jenkins时,确实遇到了一些问题,而大多数教程文档都是基于Mac或是Lin ...

随机推荐

  1. unity, 显示像素图,以及iOS下像素图变模糊解决办法

    在PS里画了个16x16像素的图: 在webplayer下Filter Mode选为Point,显示效果为: 在ios下显示效果为: 是由于iOS下会将图片压缩为pvr所致,想得到清晰的效果,需将Fo ...

  2. JavaScript之引用类型

    js中的引用类型和其他语言中类的概念很相似,但并不一样. 引用类型是一种数据结构,就像房子的骨架,承载着数据和功能的衔接. 而对象,则是引用类型的具体实现,即实例. var person = new ...

  3. JavaScript之变量、作用域和内存问题

    js中的变量可能包含2种数据类型,基础数据类型和引用数据类型. 一般而言,基本数据类型是数据段,引用数据类型是对象. 保存方式的不同: 基本类型可以直接操作保存在变量中的值:而引用类型真实的值是保存在 ...

  4. springmvc中action跳转

    return "redirect:/activity/listactivity.htm";

  5. 学习spring in action 第一天

    这段时间,开始学习java吧,因为C sharp 学习了java的大量语法格式,所以,留意下,就不会错了,java 有的c sharp也有,而且之前我也学习过java的桌面开发,但是一下子上来就要自己 ...

  6. Java并发编程(十三)在现有的线程安全类中添加功能

    重用现有的类而不是创建新的类,可以降低工作量,开发风险以及维护成本. 有时候线程安全类可以支持我们所有的操作,但更多时候,现有的了类只能支持大部分的操作,此时就需要在不破坏线程安全性的情况下添加一个新 ...

  7. VLC WebPlugin中文

    Documentation:WebPlugin 这篇文档讲述的是 VLC media player Web plugins 和怎样在网页使用它 Contents 1 介绍: 构建包含video的Web ...

  8. Spring MVC生成PDF文件

    以下示例演示如何使用Spring Web MVC框架生成PDF格式的文件.首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web应用程序: ...

  9. HTML5学习笔记简明版(10):废弃的元素和属性

    废弃的元素(Element) 这个小节里列出的元素在HTML5里将不再使用.现有文档升级到 HTML5的话能够使用一些替代方案. 比如parser section 能够处理isindex 元素的功能. ...

  10. 【转发】linux开发人员常用命令

    每个开发人员到了他们职业人生的某个阶段的时候,将会发现自己要寻找有关Linux的信息.我并不是这方面的专家.但是掌握了以下8个命令,我几乎可以得到我任何需要的东西. 注意:以下的命令都有很多扩展的文档 ...