[root@docker ~]# vim /etc/docker/daemon.json
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries": [ "172.18.18.34:5000"]
注意书写格式为json格式,有严格的书写要求;
第1行是国内镜像源,第2行是docker私有仓库地址;
172.18.18.34就是docker私有仓库的地址,添加后连接docker私有仓库就是用http协议了。
3、启动dokcer服务
[root@docker ~]# systemctl restart docker
4、部署JDK
由于后面运行java容器需要jdk环境,jdk如果放在容器中运行容器又相当重,所以就在宿主机上部署jdk,后面创建java容器的时候把宿主机的jdk路径挂载到容器就去。部署jdk很简单,解压就行:
[root@docker ~]# tar -zxvf jdk-8u45-linux-x64.tar.gz -C /usr/local/
我们把它解压在docker这台宿主机的/usr/local目录中。
5、构建tale开源博客的基础镜像
其实,这个镜像随便在哪台服务器上构建都行,在本文中就直接在这台docker服务器构建了:
[root@docker /]# mkdir dockerfile_tale
[root@docker /]# cd dockerfile_tale/
[root@docker dockerfile_tale]# vim Dockerfile
FROM centos:7
RUN yum install epel-release -y
RUN yum install nginx supervisor -y && yum clean all
RUN sed -i '47a proxy_pass http://127.0.0.1:9000;' /etc/nginx/nginx.conf
COPY supervisord.conf /etc/supervisord.conf
ENV PATH /usr/local/jdk/bin:$PATH
WORKDIR /tale
CMD ["/usr/bin/supervisord"]
说明:此Dockerfile以centos7为基础镜像,通过yum安装nginx、supervisor服务。定义jdk的环境变量,并通过supervisord来启动nginx和java项目。下面来看下supervisord.conf配置。
[root@docker dockerfile_tale]# ls /dockerfile_tale/
Dockerfile supervisord.conf
[root@docker dockerfile_tale]# cat supervisord.conf
[supervisord]
nodaemon=true
[program:tale]
command=/usr/local/jdk/bin/java -jar /tale/tale-least.jar
autostart=true
autorestart=true
[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true
上面的配置都是基础配置,分别是通过java -jar启动tale-least:jar包,nginx -g 启动nginx服务。
然后,构建镜像:
[root@docker dockerfile_tale]#docker build -t tale:base .
[root@docker dockerfile_tale]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tale base b6d5028ecc3b 2 seconds ago 372MB
centos 7 2d194b392dd1 6 days ago 195MB
对tale:base镜像打tag,并上传到registry私有仓库:
[root@docker /]#docker tag tale:base 172.18.18.34:5000/tale:base
[root@docker /]#docker push 172.18.18.34:5000/tale:base
3.5 部署jenkins
注意:这个步骤在 jenkins 服务器上操作
1、部署JDK
由于jenkins需要jdk环境,jdk如果放在容器中运行容器又相当重,所以就在宿主机上部署jdk,后面创建jekins容器的时候把宿主机的jdk路径挂载到容器就去。部署jdk很简单,解压就行:
[root@jenkins /]# tar -zxvf jdk-8u45-linux-x64.tar.gz -C /usr/local/
我们把它解压在宿主机的/usr/local目录中。
2、部署maven
由于本文后期是通过jenkins运行java项目,所以我们还需要maven工具,maven也和jdk部署一样,也不想在容器中运行maven,所以也是部署在宿主机上然后挂载到容器中。也是直接解压:
[root@jenkins local]# tar -zxvf apache-maven-3.5.0-bin.tar.gz -C /usr/local/
查看一下这两个源码软件是否解压:
3、生成jenkins镜像
在本文中我们引用docker hub中的官方镜像来编写个Dockerfile文件:
#说明:下面我创建个目录来放置jenkins的Dockerfile文件,这个文件随便放在哪个目录都行
[root@jenkins /]# mkdir /Dockerfile_jenkins
[root@jenkins /]# cd Dockerfile_jenkins/
[root@jenkins Dockerfile_jenkins]# vim Dockerfile
FROM jenkins
USER root
RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list && \
wget http://mirrors.163.com/.help/sources.list.jessie -O /etc/apt/sources.list
RUN apt-get update && apt-get install -y git
Dockerfile说明:
第1行FROM引用了官方镜像jenkins,这个jenkins是基于debiant系统构建的。
第2行USER使用root用户来运行。
第3行RUN更改了apt-get源为国内163的源。
第4行RUN是安装git客户端,由于官方的jenkins镜像没有安装git客户端,我们需要在jenkins容器中调用git命令,所以在此需要安装下git客户端,当然你也可以启动jenkins容器后在容器中安装;不过笔者建议需要安装的东西最好的Dockerfile中就弄好。
4、构建jenkins镜像
[root@jenkins Dockerfile_jenkins]# docker build -t jenkins:v1 .
查看一下构建的镜像:
5、创建jenkins镜像
[root@jenkins / ]#docker run -d \
--name jenkins \
-p 8080:8080 \
-v /var/jenkins_home/:/var/jenkins_home \
-v /usr/local/apache-maven-3.5.0:/usr/local/maven \
-v /usr/local/jdk1.8.0_45:/usr/local/jdk \
-v ~/.ssh:/root/.ssh \
jenkins:v1
参数说明,上面的参数都是最常用的,都比较很简单很好理解
-d:在后台运行容器;
-p:映射端口;
-v:宿主机的目录挂载到容器;/var/jenkins_home 这个目录在宿主机中空的,这是把容器中的jenkinis主目录绑定到宿主机中来,其它的两个目录是之前解压的工具;
来查看jenkins运行状态:
[root@jenkins Dockerfile_jenkins]# docker top jenkins
UID PID PPID C STIME TTY TIME CMD
root 25304 25289 0 10:10 ? 00:00:00 /bin/tini -- /usr/local/bin/jenkins.sh
root 25335 25304 1 10:10 ? 00:00:17 java -jar /usr/share/jenkins/jenkins.war
[root@jenkins Dockerfile_jenkins]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c10bec5812e jenkins:v1 "/bin/tini -- /usr/l…" 18 minutes ago Up 18 minutes 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins
上面的两个状态显示jenkins容器运行都是OK的!!!
4.配置jenkins
4.1 初始化配置
通过http://ip:8080 来访问jenkins服务;
从上图给出的提示,需要从/var/jenkins_home/secrets/initialAdminPassword获取密码
[root@jenkins /]# cat /var/jenkins_home/secrets/initialAdminPassword
dff1d41be2254f87ad80a65eac621cb8
登录成功后回让你选择插件的安装,可以选择建议的安装也可以自己进行选择,不清楚的话可以使用建议的安装。由于建议安装的插件比较多,安装的过程有点慢,多等待一会;
安装完成后最好新创建一个管理员账户代替之前的临时自动生成的密码账户;
4.2 系统设置
进入“系统管理” -- “系统设置”,主要是把docker这台服务器通过ssh的形式添加进来,后期部署dokcer容器,如下图:
参数说明:
Name:172.18.18.33-docker
Hostname:172.18.18.33
Username:root
Remote Directory:/data 这个意思是把代码发布到172.18.18.83 /data目录中,需要手动创建个目录
Use password authentication, or use a different key:勾选它
Passphrase / Password:输入172.18.18.83这台docker服务器的密码
4.3 配置Maven、jdk、git环境
1、jdk配置
进“系统管理” -- "Global Tool Configuration",添加jdk安装,如下图:
参数说明:
别名:自定义就行;
JAVA_HOME:这个是你jenkins容器里的JDK路径,不是宿主机的JDK路径;
2、maven配置
进“系统管理” -- "Global Tool Configuration",添加maven安装,如下图:
参数说明:和jdk一样,MAVEN_HOME 的路径也是指向jenkins容器里的maven路径;
3、git配置
这里我没有动git的配置,让它为默认配置,如下图:
4.4 配置java项目
1、构建maven项目
点击“新建” -- “构建一个maven项目,项目名称定为java-tale,如下图:
2、源码管理
在“源码管理”项中选择Git,只需要配置git仓库的地址 “Repository URL”,之前我们在jenkins服务器上把公钥传输到了git服务器上了,所以不需要做认证,如下图:
3、构建触发器
在“构建触发器”选项中,选上“Poll SCM”,日程表 * ,每分钟都去捡查代码,这个和linux crontab是一样的含义。这一项你也可以不用测试,如下图:
4、build配置
在“Build”选项中,Goals and options输入:clean package。如下图:
5、构建后的配置
在“Post Steps”选项中,配置如下操作:
配置说明:
Nmae:选择需要部署的docker服务器,前面我们SSH增加了一台,所以这里可以直接选择;
source files:需要部署到目标服务的打包成果路径
Remove prefilx: “Source files”配置的路径中要移除的前缀
Remote directory:成果要发送到的远程目标服务目录路径,这个路径与第一步配置中的Remote Directory对应。
Exec command:成果发送完成后,需要执行的命令,具体如下
docker rm -f tale-test
docker rmi -f 172.18.18.34:5000/tale:base
docker run -itd \
--name tale-test \
-p 80:80 \
-v /usr/local/jdk1.8.0_45:/usr/local/jdk \
-v /data/tale:/tale \
172.18.18.34:5000/tale:base
在Exec command执行中的命令都是在构建代码完成后的操作,会在172.18.18.33-docker这台服务器上执行。
第1/2条命令:其实这两步你先可以不用加上,到了下一次构建的时候你测试一下不加这两条命令会有什么结果。如果构建失败,你在加上这两条命令,其实这两条命令是事先删除容器和镜像文件,然后通过第3条命令运行全新的容器。
第3条命令:就是通过docker run来运行tale-test容器了,并把172.18.18.33-docker这台服务器的jdk和tale目录挂载到容器中。
6、测试
配置上之后,构建此项目:
查看控制台输出日志:
看到最上面完成的状态,就可以进行测试了,如果是第一次构建时间会比较久,它需要下载maven相关的依赖包。
然后登录docker服务器查看一下运行的容器:
[root@docker /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83b29455b2c5 172.18.18.34:5000/tale:base "/usr/bin/supervisord" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp tale-test
[root@docker /]#docker top tale-test
UID PID PPID C STIME TTY TIME CMD
root 815 797 0 20:03 pts/0 00:00:00 /usr/bin/python /usr/bin/supervisord
root 862 815 0 20:03 pts/0 00:00:02 /usr/local/jdk/bin/java -jar /tale/tale-least.jar
root 863 815 0 20:03 pts/0 00:00:00 nginx: master process /usr/sbin/nginx -g daemon off;
polkitd 869 863 0 20:03 pts/0 00:00:00 nginx: worker process
polkitd 870 863 0 20:03 pts/0 00:00:00 nginx: worker process
polkitd 871 863 0 20:03 pts/0 00:00:00 nginx: worker process
polkitd 872 863 0 20:03 pts/0 00:00:00 nginx: worker process
root 962 797 0 20:04 ? 00:00:00 bash
最后,通过用浏览器来访问一下这个用java写的tale开源博客项目:
从上面可以看到,我是通过docker那个服务器IP来访问的,访问是OK的。到此,实战docker+jenkins+git构建持续集成环境就结束了。
1、首先要对整个流程熟悉,思路不能乱,规划好服务器数量和部署的应用服务。
2、本文中用的jar包来测试的,一般jar包直接用jar命令运行、也可以部署在tomcat容器中。jar包不依赖tomcat,所以本文在基础镜像172.18.18.34:5000/tale:base中只是安装了nginx,并没有安装tomcat。如果大家用war包,那么这个基础镜像就要重新制作了。
3、在4.4步的第5小步中“构建后的操作”,是不是有一堆命令,其实也可以把它写成一个shell脚本,直接调用一执行,看个人操作习惯。
4、还有就是用Dockferfile构建基础镜像中,这些服务都是通过yum来安装的,我们也可以把它换成源码安装,大家可以自行测试一下。
5、遇到错误的时候自己先排错,不要急于百度或问别人答案,容器这一块的错误通过docker logs 容器、docker ps 、docker top 容器等命令可以很好的定位错误。并且可以很方便的用“docker exec -it 容器 bash ”进入容器直接排查错误。
喜欢我的文章,请点击最上方右角处的《关注》支持一下!
©著作权归作者所有:来自51CTO博客作者甘兵的原创作品,如需转载,请注明出处,否则将追究法律责任
docker
jenkins
docker+jenkins+git
Docker容器
Kubernetes(K8S)集群管理Docker容器(部署篇)
Spring Boot 2.0(四):使用 Docker 部署 Spring Boot
获取Centos7安装Docker各种姿势(指定版本)
Docker基础入门实战(一)
Gitlab+Jenkins实现自动部署
Spring Boot 2.0(五):感受 Docker 魅力, 排解决多应用部署之疼
tcpdump抓包分析过程
利用Helm部署高可用rancher集群
docker镜像瘦身行动
基于k8s Prometheus+Grafana+Altermanager钉钉报警
使用Prometheus Operator实现应用自定义监控
使用Prometheus Operator监控kubetnetes集群
Docker数据管理与网络通信
Docker架构、镜像和容器