docker 基础知识:
docker与虚拟机
!左边为虚拟机,右边为docker环境 –
Server :物理机服务器Host OS :构建的操作系统Hypervisor :一种虚拟机软件,装了之后才能虚拟化操作系统Guest OS :虚拟化的操作系统Bins/Libs :执行命令、工具App A :构建的软件Docker Engine :跳过虚拟化内核的步骤,直接使用宿主机内核
从图片中我们可以清楚的了解到,相比于 Docker,虚拟机更加的臃肿。
虚拟机和容器都需要物理机以及操作系统,但是虚拟机有 Hypervisor 层以及 Guest OS 层。但是 Docker 是没有这两个部分的,只有一层 Docker Engine。
并且每个容器都和宿主机共享计算机的硬件资源以及操作系统。那么由Hypervisor带来的资源耗损,在容器这边是不存在的。所以Docker与虚拟机对比,是有很强大的优势的,当然,也会有一定的缺点。
优势(省去了虚拟化内核的步骤)
- 节省资源(CPU、内存)
- 秒级启动
- 轻量级方案(同样一台服务器可以启动几百个docker,但是不能启动几百个虚拟机)
劣势
- 隔离性、安全性相比虚拟机更弱(比如,如果其中一个容器将内核给"搞坏了",那所有的容器就都无法正常工作了)
- 某些情况下服务器会挑内核(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、系统管理-全局工具配置-设置自动化安装
4、进入job-配置-修改构建后操作
对配置了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、新建任务
2、输入任务名称,点击【自由风格】,点击确定
3、在General输入项目描述
4、在源码管理中添加远程仓库项目
5、添加远程仓库登录凭证
6、进行构建操作设置
7、在shell中输入执行命令(注:该命令执行目录为项目目录)
注意:在jenkins容器中去执行python代码编写的测试框架时,需要在该容器中配置好python的环境,以及相关依赖如pip,pytest, allure, appium, yaml等等
8、要构建后操作中添加allure报告
9、在工程面板点击【立即构建】即可实现拉取代码到jenkins的/var/jenkins_home/workspace/目录下,执行shell中的python3 run.py,即执行项目中的run.py模块进行测试
10、查看构建的详细日志信息
对构建项目点击下拉箭头,选择【控制台输出】
通过jenkins进行定时构建
定时构建时间描述
在上述设置定时构建时,输入了一行命令 H2/ * * * * 来表示每隔 2 分钟构建一次,这是一种 crontab 的写法,具体描述分五个部分:
- 星号(*):代表所有可能的值,例如 month 字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”。
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如 “2-6” 表示 “2,3,4,5,6”。
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如 “0-23/2” 表示每两小时执行一次。同时正斜线可以和星号一起使用,例如 */10,如果用在 minute 字段,表示每十分钟执行一次
实际在 Jenkins 中进行定时构建时,写法相似但是还是有区别,还是以上述的 H/2 * * * * 来表示每隔 2 分钟为例,当我们用 */2 * * * * 写法时:
可以看到Jenkins 建议我们使用 H 来代表通配符,因此在表示每隔多久时建议使用 H/ 的方式。
例:每天上午9点构建
H 9 * * *
下面是一些常用定时方式的参考示例:
- 每 30 分钟构建一次: H/30 * * * *
- 每 2 小时构建一次: H H/2 * * *
- 每天早上 9 点构建一次: H 9 * * *
- 每天 8 点、12 点、21 点各构建一次: H 8,12,21 * * *
- 周一至周五,每天 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/容器名称