热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux环境自动部署案例,Linux下基于Gitlab和Jenkins的自动化部署实例(二)—构建docker镜像,并利用构建的镜像运行容器...

续我的上篇博文:https:mp.csdn.netpostedit89260300。即test项目已经配置好本篇博文配置的自动化部署之推送docker镜像是在上篇博文

续我的上篇博文:https://mp.csdn.net/postedit/89260300。即test项目已经配置好

本篇博文配置的自动化部署之推送docker镜像是在上篇博文的hello项目构建成功之后,才触发的。

git——>gitlab——>jenkins——>docker  build  images——>docker  engine ——>container

在实验之前,先进行设置,使得虚拟机可以上网(因为本次实验需要在安装有Jenkins软件的虚拟机server2上下载有关docker的软件)

##物理机

[root@foundation83 Desktop]# iptables -t nat -I POSTROUTING -s 172.25.83.0/24 -j MASQUERADE

##server2

[root@server2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=static

IPADDR=172.25.83.2

PREFIX=24

GATEWAY=172.25.83.83 #设置网关地址

DNS1=114.114.114.114 #设置DNS域名解析

[root@server2 ~]# ping www.baidu.com #测试网络是否ok

PING www.a.shifen.com (220.181.112.244) 56(84) bytes of data.

64 bytes from 220.181.112.244 (220.181.112.244): icmp_seq=1 ttl=50 time=23.0 ms

64 bytes from 220.181.112.244 (220.181.112.244): icmp_seq=2 ttl=50 time=23.7 ms

64 bytes from 220.181.112.244 (220.181.112.244): icmp_seq=3 ttl=50 time=35.0 ms

^C

--- www.a.shifen.com ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2001ms

rtt min/avg/max/mdev = 23.070/27.307/35.090/5.513 ms

一、实验环境(rhel7.3版本)

1、selinux和firewalld状态为disabled

2、各主机信息如下:

主机

ip

server1(git)

172.25.83.1

server2(git,jdk,jenkins)

172.25.83.2

二、基于Gitlab和Jenkins的自动化部署实例—构建docker镜像,并利用构建的镜像运行容器

1、在server2端:进入jenkins界面:在jenkins上创建一个新的自由风格的项目(项目的名字随意给,我这里给的名字是docker)

c8976578e2e5f86d350031ddd7e60426.png

点击“新建任务”

003b699c80dc1ebf49a01cf401d9e761.png

配置界面如下图:(1)在任务名称这栏中填入“docker”;(2)选择“构建一个自有风格的软件项目”

63b7df326cede1287b6a67e535bf5918.png

点击确定

27bfc01949eb2fd19f631745329074b6.png

就这样,一个自由风格的项目(docker)就创建好了。

“点击”最上面一行的“Jenkins”,回到主界面

2、在jenkins下载有关docker的插件(Docker,CloudBees  Docker  Build and  Publish)

7528d35bf16a14271801c215c869120b.png

系统管理—>管理插件—>可选插件

838a0c1ef308b14aa0ddc4c56b148c03.png

可以在过滤选择框内搜索docker,在搜索结果中选择“Docker”,和“CloudBees  Docker  Build and  Publish”

6b7ccfa9d6fde7547e8a17883c4e8a25.png

1de2d01902e5e449e56c6ee972b0274e.png

点击“直接安装”,安装选中的这两个插件

ccf583cd30c9a6577066c396b896eb84.png

下面的图片是插件安装成功之后的界面图

8934295e07c08f25dd392e96c6443d1e.png

3、在server2端:安装docker的相关软件,启动docker服务,导入registry和nginx镜像,并利用registry镜像建立一个本地仓库服务。

7b3535f1acec98b3e6a2814ef13d11a4.png

9d3864b234707c34cd3aac0c94af4d4e.png

[root@foundation83 docker]# yum install * -y

[root@server2 docker]# systemctl start docker

[root@server2 ~]# ls

docker nginx.tar registry.tar

[root@server2 ~]# docker load -i nginx.tar

[root@server2 ~]# docker load -i registry.tar

[root@server2 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

nginx latest e548f1a579cf 13 months ago 109MB

registry 2.3.1 83139345d017 3 years ago 166MB

[root@server2 ~]# mkdir /opt/registry

[root@server2 ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry/:/var/lib/registry registry:2.3.1

[root@server2 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

010759261e68 registry:2.3.1 "/bin/registry /etc/…" 4 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp registry

[root@server2 ~]# netstat -antulpe | grep 5000

tcp6 0 0 :::5000 :::* LISTEN 0 31191 2596/docker-proxy

4、修改上篇博文配置好的hello项目中的配置(因为下面配置的docker项目是在hello项目构建好的基础上才触发的)

<1>配置“源码管理“——上上篇博文已经做过&#xff0c;不用进行修改

<2>配置构建触发器——上篇博文已经做过&#xff0c;不用进行修改

<3>配置“构建”

[root&#64;server2 ~]# ll -d /var/run/docker.sock

srw-rw---- 1 root docker 0 Apr 15 11:37 /var/run/docker.sock

[root&#64;server2 ~]# chmod 777 /var/run/docker.sock #修改docker启动时对应的套接字文件(docker.socket)的权限,使得其对jenkins用户有读写的权限

fd4424b933cf04900911fa52841f7556.png

添加“增加构建步骤”中的“Docker  Build  and  Publish”

2ec592524e25a038fcdc8840a8730ca8.png

删除之前添加的“执行shell脚本”的构建步骤

a035ceae8b27cb3d9694afe2999e3ad1.png

在该构建步骤中&#xff0c;写入如下的内容

2382cebff94d2be039d3080bc405aef9.png

点击“高级”&#xff0c;并在其中进行配置&#xff0c;配置图如下&#xff1a;

9f1b367f62fdde69d1d358b490426330.png

点击“保存”

4856b0a7781f86498f03eed8e18c1290.png

就这样想要的hello项目就配置好了。

5、在创建好的docker项目中进行设定&#xff0c;使得该项目能够自动推送docker镜像

<1>配置“源码管理“&#xff1a;其配置图如下&#xff1a;

91f297f7f6763917bb4647848c4a24c3.png

<2>配置“构建触发器“&#xff1a;其配置图如下&#xff1a;

39807c27425ce49aa30bb5b073e4d95c.png

<3>配置“构建“

[root&#64;server2 ~]# vim /etc/sudoers #编辑/etc/sudoer文件,赋予jenkins用户全部的权限。并输入":wq!"强制保存退出

91 root ALL&#61;(ALL) ALL

92 jenkins ALL&#61;(ALL) NOPASSWD: ALL #新添加的内荣

0fa69c787b5815d634f26387362e99c8.png

在“构建“中的“增加构建步骤”的下拉菜单中选择“执行shell”

edf956bce4e1629e932806b57f276ab2.png

在命令这栏写入想要执行的shell命令

2c7697db3af60487ea517db865fa4fb5.png

点击“保存”

2604594bff94848b6ae32a3a85ecf822.png

就这样想要的docker项目就配置好了。

6、在server2端编写Dockerfile&#xff0c;进行测试&#xff0c;以保证Dockerfile的编写是正确的。

[root&#64;server2 ~]# mkdir test

[root&#64;server2 ~]# cd test/

[root&#64;server2 test]# vim Dockerfile

FROM nginx

COPY index.html /usr/share/nginx/html

[root&#64;server2 test]# vim index.html

xin

[root&#64;server2 test]# docker build -t nginx:v1 .

[root&#64;server2 test]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

nginx v1 5c0bec80cba3 10 seconds ago 109MB

nginx latest e548f1a579cf 13 months ago 109MB

registry 2.3.1 83139345d017 3 years ago 166MB

[root&#64;server2 test]# docker run -d --name vm1 -p 80:80 nginx:v1

[root&#64;server2 test]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

c37471f8bbb6 nginx:v1 "nginx -g &#39;daemon of…" 8 seconds ago Up 7 seconds 0.0.0.0:80->80/tcp vm1

010759261e68 registry:2.3.1 "/bin/registry /etc/…" 3 hours ago Up 3 hours 0.0.0.0:5000->5000/tcp registry

[root&#64;server2 test]# curl localhost

xin

[root&#64;server2 test]# docker rm -f vm1

[root&#64;server2 test]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

010759261e68 registry:2.3.1 "/bin/registry /etc/…" 3 hours ago Up 3 hours 0.0.0.0:5000->5000/tcp registry

7、将server2端编写的Dockerfile文件以及所需要的index.html(覆盖server1之前推送的index.html文件)发送到server1端的Gitlab对应的目录(test目录)下。

[root&#64;server2 test]# ls

Dockerfile index.html

[root&#64;server2 test]# scp * server1:/root/test

root&#64;server1&#39;s password:

Dockerfile 100% 49 0.1KB/s 00:00

index.html 100% 4 0.0KB/s 00:00

[root&#64;server1 test]# pwd

/root/test

[root&#64;server1 test]# ls

Dockerfile file1 file2 index.html README.md

[root&#64;server1 test]# cat index.html

xin

8、在server1端&#xff1a;向Gitlab远程仓库推送Dockerfile文件和index.html文件

[root&#64;server1 test]# git add Dockerfile

[root&#64;server1 test]# git commit -m "add Dockerfile"

[root&#64;server1 test]# git add index.html

[root&#64;server1 test]# git commit -m "add index.html"

[root&#64;server1 test]# git push -u origin master

a5579c0dc1fb5ff494ef9fb37fd2b5d9.png

9、测试&#xff1a;

<1>测试一&#xff1a;

点击“返回面板”&#xff0c;查看可以hello工程和docker是否已经配置好。s下面的球显示蓝色的&#xff0c;即表示构建成功

e7a9275966934d4fe455dc6476bbfafd.png

<2>测试二&#xff1a;

点击“hello”&#xff0c;进入hello工程的构建历史的主界面&#xff0c;点击“#5“左边”蓝色的球“&#xff0c;查看控制台输出&#xff0c;如果有输出&#xff0c;则表示hello工程已经配置好

45bfbbf6c316914d68cfa47757edbbe4.png

7be581a2ca4371bc12d382137a8acaf1.png

点击“返回面板”——>“docker”&#xff0c;进入docker工程的构建历史的主界面&#xff0c;查看控制台输出&#xff0c;如果有输出&#xff0c;则表示可以docker工程已经配置好

184c4864a95d99f4667e613f36e144ad.png

283540d00d364839e8f43f76085cde40.png

<3>测试三&#xff1a;

进入Jenkins的工作目录&#xff0c;查看是否有Gitlab上test项目中的内容&#xff0c;如果有&#xff0c;则表示hello工程和docker工程已经配置好

[root&#64;server2 hello]# pwd

/var/lib/jenkins/workspace/hello

[root&#64;server2 hello]# ll

total 20

-rw-r--r-- 1 jenkins jenkins 49 Apr 15 17:07 Dockerfile

-rw-r--r-- 1 jenkins jenkins 8 Apr 15 17:00 file1

-rw-r--r-- 1 jenkins jenkins 3 Apr 15 17:03 file2

-rw-r--r-- 1 jenkins jenkins 4 Apr 15 16:57 index.html

-rw-r--r-- 1 jenkins jenkins 8 Apr 15 16:57 README.md

<4>测试四&#xff1a;

在server2端查看对应的tag为5的镜像是否构建成功&#xff0c;查看webserver容器是否在运行&#xff0c;并访问webserver容器。如果镜像构建成功&#xff0c;容器在运行并且访问成功&#xff0c;则表示hello工程和docker工程已经配置好

[root&#64;server2 ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

localhost:5000/nginx 5 94cbfc629e0a 8 minutes ago 109MB

localhost:5000/nginx latest 94cbfc629e0a 8 minutes ago 109MB

nginx latest 344960c969db 26 minutes ago 109MB

nginx v1 5c0bec80cba3 3 hours ago 109MB

nginx bb776ce48575 4 days ago 109MB

registry 2.3.1 83139345d017 3 years ago 166MB

[root&#64;server2 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

75fb8c1692c8 localhost:5000/nginx "nginx -g &#39;daemon of…" 8 minutes ago Up 8 minutes 80/tcp webserver

010759261e68 registry:2.3.1 "/bin/registry /etc/…" 6 hours ago Up 6 hours 0.0.0.0:5000->5000/tcp registry

[root&#64;server2 ~]# docker inspect webserver | grep IPAddress

"SecondaryIPAddresses": null,

"IPAddress": "172.17.0.3",

"IPAddress": "172.17.0.3",

[root&#64;server2 ~]# curl 172.17.0.3

xin

值的注意的是&#xff1a;

1、因为在构建hello工程时&#xff0c;选中了“Skip  Push”&#xff0c;即相当于没有将构建好的镜像上传到registry私有仓库中&#xff0c;所以/opt/registry目录中应该是没有内容的。

[root&#64;server2 ~]# ls /opt/registry/

[root&#64;server2 ~]#

2、我们会发现一个问题&#xff1a;如果修改了index.html文件的内容&#xff0c;重新推送到Gitlab&#xff0c;那么就会触发hello工程(构建docker镜像)&#xff0c;hello工程构建成功之后&#xff0c;就会触发docker工程&#xff0c;而docker工程主要的作用就是利用新构建的镜像运行容器webserver。那如果webserver容器已经在运行&#xff0c;那么在构建docker工程时&#xff0c;就会报错&#xff0c;这该如何解决呢&#xff1f;请看我的下篇博文。



推荐阅读
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • Sublime P4语法高亮设置
    Github插件链接:p4-syntax-highlighter首先安装PackageControl。进入Package界面,我的目录:U ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 学习笔记(34):第三阶段4.2.6:SpringCloud Config配置中心的应用与原理第三阶段4.2.6SpringCloud Config配置中心的应用与原理
    立即学习:https:edu.csdn.netcourseplay29983432482?utm_sourceblogtoedu配置中心得核心逻辑springcloudconfi ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文主要介绍关于linux文件描述符设置,centos7设置文件句柄数,centos7查看进程数的知识点,对【Linux之进程数和句柄数】和【linux句柄数含义】有兴趣的朋友可以看下由【东城绝神】投 ... [详细]
author-avatar
手机用户2502855257
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有