环境:
主机(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. Atitit。Tree文件解析器的原理流程与设计实现  java  c# php js

    Atitit.Tree文件解析器的原理流程与设计实现  java  c# php js 1. 解析原理与流程1 1.1. 判断目录  ,表示服  dirFlagChar = "└├─&quo ...

  2. C语言基础(17)-作用域

    一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域. 不推荐写法 int a; // 出现了语法的二义性,可能是声明也可能是定义,所以最好定义完成之后声明 void func();  ...

  3. 使用pycharm手动搭建python语言django开发环境(四) django中buffer类型与str类型的联合使用

    在django中,如果用到buffer类型时,buffer的编码格式是utf-8类型.使用str()进行转为字符串类型会异常. 异常会有如下提示:'ascii' codec can't decode ...

  4. linux嵌入式大神的博客文章---持续更新中

    linux kernel子系统相关博客:http://www.wowotech.net/ 经典博文: http://blog.csdn.net/zqixiao_09 http://blog.china ...

  5. 15:开发Rsync服务启动脚本案例

    [root@m01 ~]# rsn_count="ps -ef|grep 'rsync --d[a]emon'|wc -l" [root@m01 ~]# echo ${rsn_co ...

  6. mysql的两个备份语句

    适合多引擎混合(例如:myisam与innodb混合)的备份命令如下: mysqldump -A -R --triggers --master-data=2 --single-transaction  ...

  7. java算法学习

    最大公约数 欧几里得算法 描述:计算两个非负整数p和q的最大公约数: 若q是0,则最大公约数为p. 否则,将p除以q得到余数r,p和q的最大公约数即为q和r的最大公约数. 根据算法的自然描述,我们可以 ...

  8. android自定义View_4——自定义属性的格式选择

    reference - if it references another resource id (e.g, "@color/my_color", "@layout/my ...

  9. windows Objective-C模拟环境搭建

    安装GNUstep GNUstep Windows Installer提供了Windows平台下的Objective-C的模拟开发环境,一共有四个软件包,其中GNUstep System和GNUste ...

  10. poll机制实例参考

    poll机制:为了减少CPU资源的占用率,在编写驱动函数中添加poll机制 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就 ...