##.什么是docker
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
而 Linux 容器是 Linux 发展出了另一种虚拟化技术,简单来讲, Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
Docker可以让一个应用在任何操作系统中非常方便的运行。而以前我们接触的虚拟机,也能在一个操作系统中,运行另外一个操作系统,保护系统中的任何应用。
两者有什么差异呢?
虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。
Docker仅仅是封装函数库,并没有模拟完整的操作系统,如图:

对比来看:

小结:
Docker和虚拟机的差异:
docker是一个系统进程;虚拟机是在操作系统中的操作系统
docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包
Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行
我们用的传统虚拟机如 VMware , VisualBox 之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。
下载命令
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 # 刷新用户组权限
启动docker服务
systemctl start docker
运行hello-world
docker run hello-world
看到下图即是成功


镜像操作使用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 给镜像打标签



为了持久化存在容器里的东西,不会随着容器的销毁而数据随之销毁
/var/lib/docker/volumes下docker volume create jenkins-all-data
docker volume ls
docker volume rm my-vol
docker container ps -la
docker container ps
docker container ps -a
docker container stop 容器id
docker container rm 容器id
docker image ls
docker image rm 镜像名称或镜像id(hello-world:latest)
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 不支持此功能。
docker exec -it CONTAINER_ID /bin/bash
docker exec -it CONTAINER_ID /bin/sh
docker search jenkins


docker image pull jenkins/jenkins
安装镜像

cd /usr/local
mkdir 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
docker ps -la
出现下图就算成功

重新启动jenkins
docker run -d jenkins/jenkins
查看启动日志
docker logs jenkins
cd /usr/local/jenkins
cat hudson.model.UpdateCenter.xml

将此文件的url替换为
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

-p 9001:8080 
cat /usr/local/jenkins/secret/initialAdminPassword
出现下面界面就算成功





一、下载Locale插件
1.点击【Manage Jenkins】->【Manage Plugins】选项。
2.点击【可选插件】选项,右侧输入【Locale】选项。
3.勾选【插件选项】,点击【直接安装】选项。
4.重启Jenkins:在URL后加上【/restart】,点击【回车】,点击【是】即可。
二、设置为中文
1.点击【Manage Jenkins】->【Configure System】选项。
2.找到【Locale】选项,输入【zh_CN】,勾选下面的选项,最后点击【保存】和【应用】即可
详细操作
在浏览器地址最后加上/restart即可
可以看见目前容器是不可以使用docker命令的
若想使用jenkins运行其它的镜像 如运行自动化测试时则需要能使用docker命令;
目的是在此镜像内操作其它容器
当然这样一来Jenkins就可以管理所有容器了,包括他们自己,存在一定风险

停止某个镜像
docker container stop ${container id}
docker是通过 docker client 调用docker socket向docker server 发出请求
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的权限
进入容器 执行命令 看到就是成功

官网地址
- 按照步骤安装即可若遇到问题 参考下面这篇文章可以解决
docker闪退处理方法
docker --version
出现下图即成功

Dockerfile :构建文件,定义了一切的步骤,源代码
Docker images:通过DockerFile构建生成的镜像,最终发布和运行的产品!
Docker 容器︰容器就是镜像运行起来提供服务器
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 # 构建的时候设置环境变量
.替代
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"]
在docker(在Dockerile路径下执行)
docker build -t philyou/zhaotong:v1 .
看到下图即制作成功

docker login --u philyou
看到 suceeded即是成功

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

dockerhub应该能看到

docker login --u philyou

拉取镜像
docker pull philyou/study_work:v1

之前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

构建触发器
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 指的是这个任务的名称





2

3



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
/bin/bash和/bin/sh的区别
bash是sh的完整版,bash完全兼容sh命令,反之不行
停止一个容器后使用使用新命令重新启动该容器,该容器之前的数据会消失吗
如果您在启动容器时使用了挂载卷或持久化存储,那么即使您停止并重新启动容器,数据仍然会保留在卷或存储中,您可以在重新启
动容器后访问它们如果您在启动容器时使用了挂载卷或持久化存储,那么即使您停止并重新启动容器,数据仍然会保留在卷或存储中,
您可以在重新启动容器后访问它们
就是挂载后的数据不会消失
-v /python_project/zhaotong:/var/zhaotong \
-v /usr/local/python3.9:/var/python3.9 \