前言:如果你想使用Jenkins调用同一台服务器上的代码,那么使用docker安装jenkins不是一个好的方法,容器的隔离使得Jenkins内部缺少非常多的库包,非常难以运行程序,运行镜像之类的还蛮适合的。

##.什么是docker
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。

Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

而 Linux 容器是 Linux 发展出了另一种虚拟化技术,简单来讲, Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

1.2 Docker和虚拟机的区别

Docker可以让一个应用在任何操作系统中非常方便的运行。而以前我们接触的虚拟机,也能在一个操作系统中,运行另外一个操作系统,保护系统中的任何应用。

两者有什么差异呢?

虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。

Docker仅仅是封装函数库,并没有模拟完整的操作系统,如图:

在这里插入图片描述

对比来看:
在这里插入图片描述

小结:

Docker和虚拟机的差异:

docker是一个系统进程;虚拟机是在操作系统中的操作系统
docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般

Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包
Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行

我们用的传统虚拟机如 VMware , VisualBox 之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。

2 docker的安装(centos7.9 为例)

2.1 下载及配置

  • 下载命令

    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

  • 创建/etc/docker/daemon.json文件

       cd /etc/
       ls
       mkdir docker
       cd docker/
       touch daemon.json
       vim /etc/docker/daemon.json
    
  • 写入配置镜像加速

{
"registry-mirrors": ["https://zfzbet67.mirror.aliyuncs.com"]
}
  • 免去sudo

     sudo groupadd docker  # 创建新用户组
     sudo gpasswd -a $USER docker # 当前用户加入用户组
     newgrp docker # 刷新用户组权限
    

2.2 启动服务及运行hello-world

  • 启动docker服务

      systemctl start docker
    
  • 运行hello-world

      docker run hello-world
    

    看到下图即是成功
    在这里插入图片描述

2.3 docker架构

  • docker是C/S架构
    docker client 发送指令
    docker server 接收指令,管理镜像,容器,系统资源
    在这里插入图片描述

3 docker命令

  • docker命令分为 镜像、网络、文件存储、容器(重点)四大类命令

3.1 镜像

镜像操作使用image命令

	docker image --help
Commands:
  build       Build an image from a Dockerfile 构建镜像
  history     Show the history of an image 查看构建镜像历史
  import      Import the contents from a tarball to create a filesystem image 从tarball导入内容以创建文件系统映像
  inspect     Display detailed information on one or more images 显示一个或多个映像的详细信息
  load        Load an image from a tar archive or STDIN 从tar存档或STDIN加载映像
  ls          List images 列出映像
  prune       Remove unused images 删除未使用的映像
  pull        Pull an image or a repository from a registry 从仓库拉取镜像
  push        Push an image or a repository to a registry 推送到仓库
  rm          Remove one or more images 删除镜像
  save        Save one or more images to a tar archive (streamed to STDOUT by default)导出镜像
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE 给镜像打标签
  • docker image pull 镜像名 从仓库中(国外)拉取镜像
    在这里插入图片描述
  • docker image ls 查看当前镜像列表
    在这里插入图片描述
  • docker image inspect 镜像名 列出一些详细信息
    在这里插入图片描述

3.2 网络

3.3 文件存储

为了持久化存在容器里的东西,不会随着容器的销毁而数据随之销毁

  • 创建数据卷 一般在/var/lib/docker/volumes
docker volume create jenkins-all-data
  • 查看数据卷
docker volume ls
  • 删除数据卷
 docker volume rm my-vol

3.4 容器

  • 查看运行过的容器(包括已经暂停的)
docker container  ps -la
  • 查看正在运行的容器
docker container  ps 

3.5 删除镜像步骤

3.5.1
  • 查看运行过的容器
docker container ps -a
  • 停止该容器运行
docker container stop 容器id
  • 移除该容器
docker container rm 容器id
  • 查看docker镜像
docker image ls
  • 删除该镜像
docker image rm 镜像名称或镜像id(hello-world:latest)
3.6查看镜像内容器目录
  • 其中 <image_name> 是Docker镜像的名称或ID,<directory_path> 是您想要查看的目录路径。此命令将创建一个新的容器,列出指定目录中的所有文件和子目录,并在完成后立即删除该容器
docker run --rm -it <image_name> ls <directory_path>
docker run --rm -it  jenkins/jenkins ls

在这里插入图片描述

  • -v与–mount的区别

     -v 和 --mount 都可以用于将主机上的目录或文件挂载到容器中或将容器中的目录或文件挂载到主机上。
     --mount 选项支持更多的选项和更高级的用法,例如使用 type 选项指定挂载类型(例如 bind、volume 或 tmpfs)、使用 source 选项指定数据卷名称、使用 target 选项指定容器中的目标挂载点、使用 readonly 选项指定只读挂载等。此外,--mount 还支持在运行时动态添加和删除挂载点,而 -v 不支持此功能。
    
3.7进入容器内部
  • 需要容器在运行中 一般使用/bin/bash功能全一点
docker exec -it  CONTAINER_ID  /bin/bash
docker exec -it  CONTAINER_ID  /bin/sh

4.docker上安装Jenkins 需要java jdk)

4.1.搜索 Jenkins 镜像

docker search jenkins

在这里插入图片描述

在这里插入图片描述

4.2.拉取镜像

docker image pull jenkins/jenkins

安装镜像
在这里插入图片描述

4.3.创建 Jenkins 挂载目录并赋予权限

cd /usr/local
mkdir jenkins

4.4.创建并启动 Jenkins 容器

主义 9001和50000端口先在服务器上开启
在这里插入图片描述

docker run -d \
    -p 9001:8080 \
    -p 50000:50000 \
    -v /usr/local/jenkins:/var/jenkins_home \
    -v /etc/localtime:/etc/localtime \
    --restart=always \
    --name=jenkins \
    jenkins/jenkins 
  • -d:后台运行容器;
  • -p 9001:8080:将容器的 8080 端口映射到服务器的 9001端口;
  • -p 50000:50000:将容器的 50000 端口映射到服务器的 50000 端口 好像与jenkins相关;
  • -v /usr/local/jenkins:/var/jenkins_home:将容器中 Jenkins 的工作目录挂载到服务器的 /usr/local/jenkins;
  • -v /etc/localtime:/etc/localtime:让容器使用和服务器同样的时间设置;
  • –restart=always:设置容器的重启策略为 Docker 重启时自动重启;
  • –name=jenkins:给容器起别名
  • jenkins/jenkins:镜像名称
docker ps -la

出现下图就算成功
在这里插入图片描述

重新启动jenkins

docker run -d jenkins/jenkins 

查看启动日志

docker logs jenkins

4.5 jenkins国内镜像加速

cd /usr/local/jenkins
cat hudson.model.UpdateCenter.xml

在这里插入图片描述
将此文件的url替换为

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

在这里插入图片描述

4.6 本地配置jenkins

  • 使用公网地址+服务器映射docker 8080的端口号 我的是9001 ·-p 9001:8080
    在这里插入图片描述
  • 获得初始密码 填入地址中
cat /usr/local/jenkins/secret/initialAdminPassword

出现下面界面就算成功
在这里插入图片描述

  • 选择第一个安装jenkins插件

在这里插入图片描述

  • 设置管理员账号
    在这里插入图片描述
  • 确认jenkins连接
    在这里插入图片描述
  • 进入jenkins! 看到此界面就是成功
    在这里插入图片描述

4.7 Jenkins设置中文

一、下载Locale插件

1.点击【Manage Jenkins】->【Manage Plugins】选项。

2.点击【可选插件】选项,右侧输入【Locale】选项。

3.勾选【插件选项】,点击【直接安装】选项。

4.重启Jenkins:在URL后加上【/restart】,点击【回车】,点击【是】即可。

二、设置为中文

1.点击【Manage Jenkins】->【Configure System】选项。

2.找到【Locale】选项,输入【zh_CN】,勾选下面的选项,最后点击【保存】和【应用】即可
详细操作

4.8 重启Jenkins

在浏览器地址最后加上/restart即可

4.9 能在jenkins镜像里使用docker命令

  • 可以看见目前容器是不可以使用docker命令的
    若想使用jenkins运行其它的镜像 如运行自动化测试时则需要能使用docker命令;
    目的是在此镜像内操作其它容器

      当然这样一来Jenkins就可以管理所有容器了,包括他们自己,存在一定风险
    

在这里插入图片描述

  • 停止某个镜像

      docker container stop ${container id}
    

docker是通过 docker client 调用docker socket向docker server 发出请求

  • 找到docker client
which docker
/usr/bin/docker

在这里插入图片描述

  • 找到docker socket(一般都是都在这个目录下)

      /var/run/docker.sock
    
docker run -d \
    -p 9001:8080 \
    -p 50000:50000 \
    -v /usr/local/jenkins:/var/jenkins_home \
    -v /etc/localtime:/etc/localtime \
    -v /usr/bin/docker:/usr/bin/docker \
    -v /var/run/docker.sock://var/run/docker.sock \
    -u root \
    --restart=always \
    --name=jenkins \
    jenkins/jenkins 

-v /usr/bin/docker:/usr/bin/docker \ # 文件挂载 使用同一个客户端
-v /var/run/docker.sock://var/run/docker.sock \ # 文件挂载 使用同一个socket
-u root \ 给予Jenkins root的权限

进入容器 执行命令 看到就是成功

在这里插入图片描述

5.制作镜像

5.1下载并安装docker desktop

官网地址
在这里插入图片描述- 按照步骤安装即可若遇到问题 参考下面这篇文章可以解决
docker闪退处理方法

  • 验证是否安装成功docker
docker --version

出现下图即成功
在这里插入图片描述

5.2 为python脚本制作镜像

5.2.1 Dockfile编写
  • 基础知识
    1.关键字 指令使用大写字母
    2.执行从上到下顺序执行
    3.# 表示注释
    4.每一个指令都会创建提交一个新的镜像层

Dockerfile :构建文件,定义了一切的步骤,源代码
Docker images:通过DockerFile构建生成的镜像,最终发布和运行的产品!
Docker 容器︰容器就是镜像运行起来提供服务器

  • 镜像命令( 当前路径 为Dockfile的路径)
FROM			# 基础镜镜像,一切从这里开始构建 一般开始以 scar
MAINTAINER		# 镜像是谁写的,姓名+邮箱Phil<1299>
RUN				# 镜像构建的时候需要运行的命令
ADD				# 添加压缩包如nginx 会自动解压 ADD 支持添加远程url和自动提取压缩格式的文件,COPY 只允许从本机中复制文件
WORKDIR			# 镜像的工作目录 很重要!!!即是工作目录,
VOLUME         	# 挂载的目录 host目录
EXPOSE          # 暴露给外界端口配置 有点像-p
CMD 			# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT		# 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD			# 当构建一个被继承 DockerFile这个时候就会运行ONBUILD的指令。触发指令。
COPY			# 类似ADD ,将本地文件拷贝到镜像中 ,如果是相对路径,则是目标文件与Dockerfile的相对路径建议绝对路径
ENV 			# 构建的时候设置环境变量
  • 不要使用windows的绝对路径 若是当前路径可以使用 .替代
    在这里插入图片描述
  • Dockfile示例
FROM python:3.9-slim-buster
WORKDIR /usr/local/zhaotong
COPY  . /usr/local/zhaotong
COPY requirements.txt requirements.txt
RUN pip3  install --trusted-host mirrors.aliyun.com --no-cache-dir -i http://mirrors.aliyun.com/pypi/simple  -r requirements.txt
CMD ["python", "single_api_runall.py"]
5.2.2 制作镜像

在docker(在Dockerile路径下执行)

 docker build -t philyou/zhaotong:v1 .

看到下图即制作成功
在这里插入图片描述

5.2.3 推送镜像到dockerhub
  • 使用dockerlogin登录
docker login --u philyou

看到 suceeded即是成功
在这里插入图片描述

  • 推送到docker hub

后面是镜像名称:标签
这是你的仓库名称philyou/study_work 推送时会推到对应的仓库 注意是公有仓库还是私有仓库

docker push philyou/zhaotong:v1

在这里插入图片描述
dockerhub应该能看到
在这里插入图片描述

6.服务器拉去制作好的镜像

登录dockerhub

  • 使用dockerlogin登录(笔者拉取的是私人镜像)
docker login --u philyou

在这里插入图片描述
拉取镜像

docker pull philyou/study_work:v1

在这里插入图片描述

7.jenkins挂载测试镜像的allure报告

7.1 创建jenkins(也是宿主机)的挂载目录

之前jenkins是通过 -v /usr/local/jenkins:/var/jenkins_home \ 挂载到宿主机的 /usr/local/jenkins目录下的
要为allure-report 创建挂载的宿主机目录 /usr/local/jenkins的allure-result

mkdir -p allure-result && chmod 777 allure-result 

在这里插入图片描述

构建触发器

  • 构建后命令 把容器里生成的json和text挂载到jenkins里的工作空间里
docker run  \
	-v /usr/local/jenkins/workspace/$JOB_NAME/allure-result:/usr/local/zhaotong/report/temp_jsonreport \
	philyou/study_work:v1

/usr/local/jenkins/workspace/$JOB_NAME/allure-result的allure-result必须与7.2 中的allure的path一致
$JOB_NAME 指的是这个任务的名称
在这里插入图片描述

7.2 jenkins安装allure插件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1

在这里插入图片描述

  • 2 这是是来放置测试结果的
  • ![在这里插入图片描述](https://img-blog.csdnimg.cn/111c2a6a7a9a466f953faa29e1795195.png

在docker里直接把 项目everyday_check的结果映射到了workspace下

-v /usr/local/jenkins/workspace/everyday_check/allure-result:/var/everyday_check/report/temp_jsonreport \

若是主机部署的不进行相应的处理容易出现allure-results does not exist
在这里插入图片描述
则需要复制到当前的工作空间来

mkdir  ${WORKSPACE}/allure-results_${BUILD_NUMBER} && cp -r /python_project/tfblue_test/report/temp_jsonreport ${WORKSPACE}/allure-results_${BUILD_NUMBER}

项目名为tfblue_test
mkdir ${WORKSPACE}/allure-results_${BUILD_NUMBER} 创建文件夹
cp -r /python_project/tfblue_test/report/temp_jsonreport ${WORKSPACE}/allure-results_${BUILD_NUMBER}python_project/tfblue_test/report/temp_jsonreport 这是脚本产生的数据结果复制都当前项目空间下的${WORKSPACE}/allure-results_${BUILD_NUMBER}文件夹\

allure-reslts则为

allure-results_${BUILD_NUMBER}/temp_jsonreport

如下图所示
在这里插入图片描述

  • 3
    在这里插入图片描述

7.3 使用webhook自动执行(github public仓库)

  • 添加一个webhook
    在这里插入图片描述
  • 填入公网地址 + /github-webhook/ti
    在这里插入图片描述

jenkins配置项目
在这里插入图片描述

在这里插入图片描述
配置完成后重启下Jenkins即可

参考文献

https://yeasy.gitbook.io/docker_practice/introduction/what
https://blog.csdn.net/itcast_cn/article/details/124865268
https://blog.csdn.net/weixin_45847167/article/details/121242285
https://www.bilibili.com/video/BV1ce4y1S7hm
https://blog.csdn.net/aiwangtingyun/article/details/123523669
https://www.bilibili.com/video/BV1og4y1q7M4

8 docker答疑解惑操作技巧

  • /bin/bash和/bin/sh的区别

      bash是sh的完整版,bash完全兼容sh命令,反之不行
    
  • 停止一个容器后使用使用新命令重新启动该容器,该容器之前的数据会消失吗

如果您在启动容器时使用了挂载卷或持久化存储,那么即使您停止并重新启动容器,数据仍然会保留在卷或存储中,您可以在重新启
动容器后访问它们如果您在启动容器时使用了挂载卷或持久化存储,那么即使您停止并重新启动容器,数据仍然会保留在卷或存储中,
您可以在重新启动容器后访问它们

就是挂载后的数据不会消失

  • 如何向一个正在运行的容器挂载本地文件
    可以先stop、rm该容器
-v /python_project/zhaotong:/var/zhaotong \
-v /usr/local/python3.9:/var/python3.9 \
Logo

更多推荐