Docker基础与持续集成

docker 基础知识:

docker与虚拟机

Docker基础与持续集成_第1张图片

!左边为虚拟机,右边为docker环境 –

Server :物理机服务器Host OS :构建的操作系统Hypervisor :一种虚拟机软件,装了之后才能虚拟化操作系统Guest OS :虚拟化的操作系统Bins/Libs :执行命令、工具App A :构建的软件Docker Engine :跳过虚拟化内核的步骤,直接使用宿主机内核

从图片中我们可以清楚的了解到,相比于 Docker,虚拟机更加的臃肿。

虚拟机和容器都需要物理机以及操作系统,但是虚拟机有 Hypervisor 层以及 Guest OS 层。但是 Docker 是没有这两个部分的,只有一层 Docker Engine。

并且每个容器都和宿主机共享计算机的硬件资源以及操作系统。那么由Hypervisor带来的资源耗损,在容器这边是不存在的。所以Docker与虚拟机对比,是有很强大的优势的,当然,也会有一定的缺点。

优势(省去了虚拟化内核的步骤)

  1. 节省资源(CPU、内存)
  2. 秒级启动
  3. 轻量级方案(同样一台服务器可以启动几百个docker,但是不能启动几百个虚拟机)

劣势

  1. 隔离性、安全性相比虚拟机更弱(比如,如果其中一个容器将内核给"搞坏了",那所有的容器就都无法正常工作了)
  2. 某些情况下服务器会挑内核(eg.编译c++)

docker 安装:

支持centos7、8及以上版本64位系统

切换root用户:su

yum list installed | grep docker # 查看是否已安装docker列表

yum -y install docker # 安装docker

修改镜像源:

sudo yum-config-manager \ --add-repo \

http:// http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1、docker服务启动:service docker start

2、查看当前运行的容器:docker ps

docker ps -a 查看所有容器

补充说明一下 docker ps -a 的输出结果:

  • CONTAINER ID:容器 ID,唯一标识容器(和image ID无关)
  • IMAGE:创建容器时所用的镜像
  • COMMAND:在容器最后运行的命令
  • CREATED:容器创建的时间
  • STATUS:容器的状态
  • PORTS:对外开放的端口号
  • NAMES:容器名(具有唯一性,docker 负责命名)

3、启动一个已停止的容器:docker start <容器ID>

4、停止一个容器:docker stop <容器ID>

5、重启一个容器:docker restart <容器ID>

6、查询一个镜像:docker search xxxx (docker search appium)

7、下载一个镜像:docker pull xxxx (docker pull nginx:1.17.10)

8、查询已下载的镜像:docker images

9、镜像导入/导出:

导出镜像:docker save jenkins_python3:jp3(或镜像ID) > 目录/XXX.tar

导入镜像:docker load < jenkins_dir/jenkins_python3.tar

10、容器导入/导出:

容器导出:docker export 容器id > jenkins_dir/jenkins_python3.tar

容器导入:docker import - jenkins_python3:jp3 < jenkins_dir/jenkins_python3.tar

11、删除镜像:docker rmi xxxx:版本号

12、启动一个镜像(容器):docker run xxxx (镜像启动以后就成为容器)

13、启动一个容器在后台运行:docker run -d xxxx

14、启动一个容器并自定义名字:docker run -d --name 容器名 xxxx

  • -name 指定容器名称
  • d 后台运行
  • port 指定端口映射规则
  • -network 指定容器运行的网路模式
  • v 指定需要挂载的数据卷
  • env 指定需要传递给容器的环境变量

例:

docker run -d --name newjenkins -p 8081:8080 -p 50000:50000 -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai -v /jenkins_home:/var/jenkins_home 207d5ea41301

15、查看容器的资源占用:docker stats xxxx

16、关闭一个容器:docker stop 容器名/容器id

17、重启一个容器:docker restart 容器名/容器id

18、暂停一个运行的容器:docker pause 容器名/容器id

19、进入容器:docker exec -it 容器名/容器id bash

exec的意思是在容器中运行一个命令。如果使用bash 并且指定了-it 就会打开容器的shell 交互

20、docker rm -f name/id 删除容器

21、docker kill name kill掉运行的容器

22、docker stop $(docker ps -a -q) 停止所有容器

23、docker rm -f $(docker ps -a -q) 删除所有容器

24、docker inspect 容器名/Id 查询容器详细信息(元数据)

docker数据持久化

如果docker挂掉,在docker内产生的数据应该怎么办呢, 这些数据应该如何保存呢接下来,我们要了解的,docker是如何进行数据持久化的呢?当我们启动容器时,添加了数据挂载的参数 -v 宿主机_path:container_path ,docker就可以通过数据挂载的方式,使容器和宿主机的数据进行 同步 保存

注意此处有个坑:进行目录挂载时会报没有权限因为CentOS7中的安全模块selinux把权限禁掉了,无法使用-v命令进行挂载

需要增加命令:

chcon -Rt svirt_sandbox_file_t 宿主机_path

把宿主机挂载目录添加白名单中,再进行 docker start 容器id/容器名

linux+jenkins+python自动化集成环境部署配置

通过docker启动jenkins服务

拉取jenkins镜像

1、docker pull jenkins/jenkins:lts

通过镜像,创建容器

2、docker run --name myjenkins -p 8080:8080 -p 50000:50000 容器Id

在jenkins容器中配置python3环境

1、进入容器

docker exec -itu root 容器名 bash

2、对apt-get 进行更新

apt-get update

3、通过apt-get安装配置python3

apt-get install python3

4、通过apt-get安装配置pip

apt-get install python3-pip

jenkins中配置allure

1、系统管理-插件管理-安装allure插件

2、重启jenkins容器

3、系统管理-全局工具配置-设置自动化安装

Docker基础与持续集成_第2张图片 

 4、进入job-配置-修改构建后操作

Docker基础与持续集成_第3张图片

对配置了python环境的jenkins容器创建新镜像

docker commit -m="描述消息" -a="作者" 容器ID或容器名 镜像名:TAG

例:docker commit -m="配置python3环境" -a="siyuan" myjenkins jenkins_python3:jp3

对创建的新镜像进行导出:docker save jenkins_python3:jp3 > 目录/XXX.tar

jenkins创建job

1、新建任务

 Docker基础与持续集成_第4张图片

2、输入任务名称,点击【自由风格】,点击确定

 Docker基础与持续集成_第5张图片

3、在General输入项目描述

 Docker基础与持续集成_第6张图片

4、在源码管理中添加远程仓库项目

 Docker基础与持续集成_第7张图片

5、添加远程仓库登录凭证

 Docker基础与持续集成_第8张图片

6、进行构建操作设置

 Docker基础与持续集成_第9张图片

7、在shell中输入执行命令(注:该命令执行目录为项目目录)

 Docker基础与持续集成_第10张图片

注意:在jenkins容器中去执行python代码编写的测试框架时,需要在该容器中配置好python的环境,以及相关依赖如pip,pytest, allure, appium, yaml等等

8、要构建后操作中添加allure报告

Docker基础与持续集成_第11张图片

Docker基础与持续集成_第12张图片 

Docker基础与持续集成_第13张图片 

9、在工程面板点击【立即构建】即可实现拉取代码到jenkins的/var/jenkins_home/workspace/目录下,执行shell中的python3 run.py,即执行项目中的run.py模块进行测试

 Docker基础与持续集成_第14张图片

10、查看构建的详细日志信息

对构建项目点击下拉箭头,选择【控制台输出】

Docker基础与持续集成_第15张图片

Docker基础与持续集成_第16张图片 

 Docker基础与持续集成_第17张图片

通过jenkins进行定时构建

 Docker基础与持续集成_第18张图片

 Docker基础与持续集成_第19张图片

定时构建时间描述

在上述设置定时构建时,输入了一行命令 H2/ * * * * 来表示每隔 2 分钟构建一次,这是一种 crontab 的写法,具体描述分五个部分:

Docker基础与持续集成_第20张图片

  • 星号(*):代表所有可能的值,例如 month 字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”。
  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如 “2-6” 表示 “2,3,4,5,6”。
  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如 “0-23/2” 表示每两小时执行一次。同时正斜线可以和星号一起使用,例如 */10,如果用在 minute 字段,表示每十分钟执行一次

实际在 Jenkins 中进行定时构建时,写法相似但是还是有区别,还是以上述的 H/2 * * * * 来表示每隔 2 分钟为例,当我们用 */2 * * * * 写法时:

 Docker基础与持续集成_第21张图片

可以看到Jenkins 建议我们使用 H 来代表通配符,因此在表示每隔多久时建议使用 H/ 的方式。

例:每天上午9点构建

H 9 * * *

下面是一些常用定时方式的参考示例:

  1. 每 30 分钟构建一次: H/30 * * * *
  2. 每 2 小时构建一次: H H/2 * * *
  3. 每天早上 9 点构建一次: H 9 * * *
  4. 每天 8 点、12 点、21 点各构建一次: H 8,12,21 * * *
  5. 周一至周五,每天 22 点到 23 点之间每隔 3 分钟构建一次: H/3 22-23 * * 1-5

对于docker中的jenkins,往往存在时间与本地时间不一致的问题

解决方法:

1、在通过镜像创建容器时,加入 -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai 参数

2、对于已经生成的容器:

容器内部创建Asia时区文件

echo Asia/Shanghai >/etc/timezone

localtime可以从宿主机拷贝到容器内部(exit退出容器,在宿主机上操作docker cp)

docker cp /usr/share/zoneinfo/Asia/Shanghai 容器id:/etc/localtime

docker restart 容器id/容器名称

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(学习python,docker,ci/cd,eureka)