环境:
主机(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. 一个关于git push失败的解决方案

    问题背景:在GitHub上创建了一个repositorie, 本地初始化并添加了远程仓库后,在GitHub上创建了一个README.md文件(注意不是从本地git push上去的),随后本地修改工程源 ...

  2. SpringCloud系列十二:手动创建Feign

    1. 回顾 上文讲解了自定义Feign.但是在某些场景下,前文自定义Feign的方式满足不了需求,此时可使用Feign Builder API手动创建Feign. 本文围绕以下场景,为大家讲解如何手动 ...

  3. eclipse Alt+/ 无法提示代码

    1.找到windows下的General 下的editors 下的keys 2.把word completion 的binding由原来的Alt+/该成Alt+c 3.把Content Assist下 ...

  4. grub的三种安装方式

    1.install命令 install: install [--stage2=STAGE2_FILE] [--force-lba] STAGE1 [d] DEVICE STAGE2 [ADDR] [p ...

  5. PHP输出xls文件

    PHP输出xls文件 标签: phpexcelxmlcsvborderheader 2008-11-17 09:33 2611人阅读 评论(0) 收藏 举报  分类: WebDev(9)  版权声明: ...

  6. 李洪强漫谈iOS开发[C语言-002]-开发概述程序的本质与简单执行过程

    李洪强iOS开发之应用程序的本质与简单执行过程 什么叫程序? 就是一段执行指令 程序的两个状态: 保存状态(保存到硬盘上)   运行状态(由CPU执行) 代码可以执行吗? CPU(中央处理器-> ...

  7. eclipse 断点类别

    行断点 行断点位于一般方法内,双击代码行左边就可以设置行断点: 行断点可以设置条件,右键断点-properties: 1设置效果是第几次到达时暂停,图中所示是当第三次到达时暂停 2是开启条件断点 3是 ...

  8. FreeBSD中实现root的ssh

    在虚拟机中刚装好FreeBSD,结果不能以远程方式登录root,然后在如下链接中找到了解决方法: http://blog.chinaunix.net/uid-26719405-id-3822697.h ...

  9. JAVA自定义注解 ------ Annotation

    日常开发工作中,合理的使用注解,可以简化代码编写以及使代码结构更加简单,下面记录下,JAVA自定义注解的开发过程. 定义注解声明类. 编写注解处理器(主要起作用部分). 使用注解. 相关知识点介绍, ...

  10. PHP下载远程文件的3种方法以及性能考虑

    今天在做导出Excel的时候,总是要测试导出的Excel文件,频繁的下载和打开,很麻烦 就想着写段代码一气呵成  服务端导出Excel==>下载Excel文件到本地==>并打开的操作. 这 ...