首页 > 代码库 > 部署Jenkins+docker集成环境

部署Jenkins+docker集成环境

环境:
主机(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 ps -a
[sudo] hsl 的密码: 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31f817fba309 ubuntu:14.04 "/bin/bash" 4 hours ago Up 4 hours 0.0.0.0:32768->22/tcp pedantic_curran
hsl@ubuntu:~$ sudo docker stop 31
31
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集成环境