用Jenkins来做节点控制、版本管理、流程设置、触发Job,用Docker来搭建编译部署环境。把这一切连接起来的就是流程脚本和Dockerfile的编写。
触发条件:由Jenkins控制,如设置定时执行,或者github中的每一个commit,或者每一个PR执行一次。
构建流程:各个环节,Job,之间用Pipeline来实现整个构建流程的控制。
构建Job:如java工程,编译一般用maven等构建工具来完成的话,大可以放在外面,只是把运行环境搬到Docker容器里。
环境准备:
git 主机安装git | 192.168.1.30 |
---|---|
docker02主机安装jenkins/regesitry | 192.168.1.20 |
docker01部署docker tomcat | 192.168.1.10 |
git version 1.8.3.1
Docker version 1.12.6
Jenkins 2.60.3
一、本地git和远程github关联
1 提前注册一个github项目,在github 新创建一个java.git仓库
2 在git主机上安装git
[root@git ~]# yum -y install git
[root@git ~]# useradd git
[root@git ~]# passwd git
[root@git ~]# mkdir java.git
[root@git ~]# cd java.git/
[root@git java.git]# git init
初始化空的 Git 版本库于 /root/java.git/.git/
3 克隆远程java仓库
[root@git java.git]# git clone https://github.com/lincyou/java.git
[root@git java.git]# cd java/
4 在本地git上设置与github关联的邮箱
[root@git java]# git config --global user.email "[email protected]" //设置和github关联的邮箱
[root@git java]# git config --global user.name "lincyou" //用户名
5 测试关联是否成功
提前先拷贝一个项目放到java目录
[root@git java]# git add javaee-template.zip //提交到本地缓存仓库
[root@git java]# git commit -m "first javaee commit" //提交到本地仓库
[master(根提交) 5cae23a] first javaee commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 javaee-template.zip
[root@git java]# git remote add origin https://github.com/lincyou/java.git //提交到远程仓库
fatal: 远程 origin 已经存在。
[root@git java]# git push -u origin master
Username for 'https://github.com': //输入github帐号用户名
Password for 'https://[email protected]': //输入密码
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 220.98 KiB | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/lincyou/java.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
[root@git java]#
6 查看github上的java仓库
本地git和远程github关联成功。
二、Docker打开TCP管理端口
1 创建目录/etc/systemd/system/docker.service.d
[root@docker02 ~]# mkdir /etc/systemd/system/docker.service.d
2 在这个目录下创建tcp.conf文件,增加以下内容(Ubuntu和CentOS7 通用版)
[root@docker02 ~]# cat > tcp.conf <
区别在于用何种方式指定Docker守护进程本地套接字监听
-H fd:// 仅Ubuntu可用
-H unix:///var/run/docker.sock CentOS和Ubuntu通用
3 Daemon重新reload ,并重启docker
[root@docker02 ~]# systemctl daemon-reload
[root@docker02 ~]# systemctl restart docker
4 查看端口是否打开
[root@docker02 ~]# netstat -an | grep 5678
或ps aux |grep dockerd
5 测试,可以查看到有Server的信息
docker -H localhost:5678 version
6 关闭TCP管理端口(不用操作)
rm /etc/systemd/system/docker.service.d/tcp.conf -rf
systemctl daemon-reload
systemctl restart docker
ps aux |grep dockerd
三、使用Dockerfile部署jenkins
[root@docker02 ~]# vim /etc/hosts
192.168.1.20 docker02 docker02.com
1 提前在部署好两台docker01和docker02。
安装前准备:64位操作系统,RHEL6.5以上,关闭防火墙。这里使用CentOS7
2 (可选)添加国内镜像仓库,可以加快下载镜像速度
[root@docker02 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries":["docker02.com","192.168.1.20"]
}
[root@docker02 ~]# systemctl daemon-reload
[root@docker02 ~]# systemctl restart docker
3 拉取jenkins镜像.进行部署
[root@docker02 ~]# mkdir jenkins_docker
4 拷贝Docker02主机的yum源到 jenkins_docker目录下
5 在jenkins_docker目录下,编辑Dockerfile,jdk、tomcat、tomcat-ant来源:华为开源镜像站
[root@docker02 ~]# vim Dockerfile
FROM centos:latest
MAINTAINER lincyou
RUN yum install wget -y
RUN wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/8u201-b09/42970487e3af4f5aa5bca3f542482c60/jdk-8u201-linux-x64.tar.gz
RUN wget https://mirrors.huaweicloud.com/apache/tomcat/tomcat-8/v8.0.53/bin/apache-tomcat-8.0.53.tar.gz
RUN wget https://mirrors.huaweicloud.com/apache/ant/binaries/apache-ant-1.9.14-bin.tar.gz
RUN cd /opt
RUN tar -xvf apache-tomcat-8.0.53.tar.gz -C /opt/
RUN tar -xvf apache-ant-1.9.14-bin.tar.gz -C /opt/
RUN tar -xvf jdk-12_linux-x64_bin.tar.gz -C /opt/
ENV JAVA_HOME /opt/jdk1.8.0_201
ENV ANT_HOME /opt/apache-ant-1.9.14
ENV CLASSPATH .:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $JAVA_HOME/bin:$ANT_HOME/bin:$PATH
RUN wget -P /opt/apache-tomcat-8.0.53/webapps http://mirrors.jenkins-ci.org/war/latest/jenkins.war
RUN yum install git -y
CMD /opt/apache-tomcat-8.0.53/bin/catalina.sh run
# expose memcached port
EXPOSE 8080
6 构建jenkins:v1 镜像、 生成jenkins容器
[root@docker02 ~]# mkdir -p data/jenkins
[root@docker02 ~]# chmod -R 777 data/jenkins
[root@docker02 jenkins_docker ~]# docker build -t jenkins:v1 .
[root@docker02 ~]# docker run -d -p 8081:8080 -p 50000:50000 --name jenkins -v /root/data/jenkins:/var/jenkins_home --restart unless-stopped jenkins:v1 //这里开启容器,做了端口和家目录映射
8080端口是jenkins的端口,50000端口是master和slave通信端口
–name jenkins 给容器起一个别名
-v /var/jenkins_home目录为jenkins工作目录,将硬盘上的/root/data/jenkins目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。
7 检查服务是否正常开启
STATUS的状态是:Up,证明正常开启。
STATUS的状态是:Restarting,证明不正常,排错看后面。
8 访问:在浏览器输入:http://ip:8081
访问成功。
四 配置Jenkins
1 获取administrator password并拷贝多对应的输入框
[root@docker02 jenkins]# docker exec -it da8 bash
jenkins@da8cadfb6380:/$ cat /var/jenkins_home/secrets/initialAdminPassword
或
docker logs -f jenkins查看控制台的密码
2 选择默认插件
3 创建Admin的账户以及密码
4 安装可选插件Docker以及SSH
5 安装Maven
系统管理-> Global Tool Configuration
在maven区域选择新增
选择自动安装并设置对应的名称以及版本
6 配置SSH插件
第一步:先创建一个用于连接Docker主机的凭据。
主页面 -> 凭据 -> 系统 -> 右击全局凭据 -> 添加凭据:
输入连接docker01(部署Tomcat)主机的用户名和密码:
第二步:添加SSH远程主机,配置成需要最终部署的服务器地址。用于远程执行服务器的启动命令
主页面 -> 系统管理 -> 系统设置 -> SSH remote hosts:
配置好可以点击右下角的测试配置进行验证,显示版本证明配置正确
7 配置云->Docker: 配置成jenkins所在服务的Docker地址(上面的开启Docker Remote Api对应的地址:tcp://ip:5678)
配置好可以点击右下角的测试配置进行验证,显示版本证明配置正确
—————####################################################################################———
错误问题:
一、
问题描述:创建好之后启动了,可以ping通外网(比如能够ping 通百度),能够查到端口。但是访问不了。
排错步骤:
1 查看Dockerfile的端口是否开放:
2 查看容器运行状态
状态是:Restarting,不是Up,证明没有在运行。
3 查看日志:
[root@docker02 ~]# docker logs -tf --tail 100 d5958c0cf583
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
显示目录权限问题
4 分别查看容器的用户和目录权限
[root@docker02 ~]# docker run -it --rm --entrypoint="/bin/bash" jenkins -c "whoami && id"
[root@docker02 ~]# docker run -it --rm --entrypoint="/bin/bash" jenkins -c "ls -la /var/jenkins_home"
用户和目录权限没有问题
5 最后排查容器的信息,并且找到Mounts模块,路径映射信息:
docker inspect d5958c0cf583
发现是映射本地路径错误:/data/jenkins,查看历史命令,如下。而本地创建的目录是:/root/data/jenkins,因此重新创建容器,解决问题。
[root@docker02 ~]# docker run -d -p 8081:8080 -p 50000:50000 --name jenkins -v /data/jenkins:/var/jenkins_home --restart unless-stopped jenkins
二 、问题描述: 因为已经部署好jenkins,再去docker宿主机做Docker打开TCP管理端口步骤,重新启动容器(出现一系列报错)
1出现错误:exec: “docker-proxy”: executable file not found in $PATH
解决方法:
1)查看下 docker-proxy 的位置:
[root@docker02 docker]# cat /usr/lib/systemd/system/docker.service | grep proxy
–userland-proxy-path=/usr/libexec/docker/docker-proxy-current
2)创建一条软连接到 /usr/bin/ 下:
[root@docker02 docker]# ln -s /usr/libexec/docker/docker-proxy-current /usr/bin/docker-proxy
2 运行容器, 执行docker start
出现错误端口被占用:Bind for 0.0.0.0:50000 failed: port is already allocated
解决方法:
1)使用ps aux | grep docker 查看
2)kill 进程号
3)查询容器docker ps -a
出现无法连接到Docker守护进程Cannot connect to the Docker daemon
4)重启docker
3 运行容器,执行docker start
出现错误:shim error: docker-runc not installed on system
解决方法:
[root@docker02 docker]# cd /usr/libexec/docker/
[root@docker02 docker]# ln -s docker-runc-current docker-runc
[root@docker02 docker]# docker start af
af
问题解决成功
—————####################################################################################———
扩展:
JDK,J2EE,J2SE,J2ME的概念区别是什么呢?
1.JDK是Javadevelopmenttoolkit,相当于是Java的库函数,是编译,运行java程序的工具包。
J2EE是Java2enterpriseedition是Java的一种企业版用于企业级的应用服务开发
J2SE是Java2standardedition是Java的标准版,用于标准的应用开发
J2ME是Java2MicroEdition是Java的微型版,常用于手机上的开发