Docker是一个开源的容器引擎,基于Go语言开发.对Docker简单的理解就是使用Docker可以把一台服务器隔离成一个个独立的容器,我们可以把这地方描述的容器理解成一个沙盒。在每个容器中运行一个程序,不同的容器之间相互隔离,容器的创建,停止,以及启动基本都是秒为单位,而且容器对资源的需求也是非常有限的,比起虚拟化的技术而言,可以节约很多的资源成本。在DevOps技术栈体系和可持续交付中占据了重要的位置。
镜像相当于Linux的内核
Docker下载与安装
1、首先下载Docker,下载地址为:https://docs.docker.com/engine/install/centos/;
2、下载完成后解压压缩包,然后双击Docker Desktop Installer.exe进行安装;
3、Docker安装结束后,电脑自动重启,再安装wsl_update_x64.msi;
4、wsl_update_x64安装完后,手动重启电脑,然后打开Docker,显示如下,则表示安装成功。
控制台输入如下命令:
获取镜像
镜像是从什么地方获取?是从docker hub来获取,获取的命令是:pull
docker pull imageName:image的版本
获取镜像文件时,省略版本后,会默认获取最新的版本(即为docker pull imageName:latest)
查看镜像
查看所有的镜像
docker images
查看指定的镜像信息
docker images | findstr imageName
Windows系统的过滤使用findstr
Linux和Mac系统过滤使用grep
查看镜像ID
docker images -q
查看镜像的详细信息
docker image inspect IMAGE ID
运行镜像
docker run -it --rm imageName:version
--name:指定容器的名称
-d:后台方式运行容器
-p表示指定端口映射
在浏览器中输入localhost,可成功跳转到以下页面:
-P表示随机端口映射
使用结束后,可输入exit退出。
Docker 退出环境后,不会保留之前的任何操作。
查看容器的端口
docker port containerID
删除镜像
docker的镜像未被容器运⾏
使用镜像名称删除
docker的镜像被容器运⾏
镜像运行后在容器中生成一条记录,那么这个删除镜像的逻辑是:
1、获取容器的ID:docker ps -a
2、先停止镜像运行的容器:docker stop containerID
3、删除镜像在容器中的记录:docker rm containerID
4、删除镜像:docker rmi imageName
docker tag 镜像ID imageName:version
再根据名称删除镜像
docker image save 镜像名称 -o 导出镜像路径 导出镜像名称.taz
导入镜像
docker image load -i 导入镜像名称
docker容器管理
docker run 镜像名称 这个过程可以理解为:把镜像文件创建成docker容器的一部分,然后再进行启动。特别需要注意的是:容器内的进程必须是前台运行状态,否则容器直接退出。
容器命令
容器信息查看
docker ps -a | findstr imageName:version
log查看
查看容器实时的错误日志: docker logs -f containerID
只显示最新的N条⽇志信息:
docker logs 51e2db607d0c | head -N
docker logs 51e2db607d0c | tail -N
容器提交
容器的提交生成镜像
注意:提交容器的时候,切记⼀定要保持运⾏的容器是不能退出的
使用dockerfile主要是用于构建docker镜像文件信息,相当于一个脚本,通过dockerfile自己的指令,来构建软件依赖,文件依赖,存储等等情况。
Dockerfile组成部分
dockerfile的主要组成部分可以汇总为:
• 基础镜像信息
• 制作镜像操作指令 RUN
• 容器启动时执行指令CMD["/bin/bash"]
Dockerfile基本指令
dockerfile的指令主要可以汇总为如下,使用dockerfile的前提是学习会这些指令的基本使用,具体如下:
• FROM #指令基础镜像
• MAINTAINER #指定维护者信息,也可以没有
• RUN #具体执行的操作,在命令前面加上RUN即可
• ADD #COPY文件,会自动进行解压
• WORKDIR #设置当前工作目录
• VOLUME #设置卷,挂载主机目录
• EXPOSE #指定对外的端口
• CMD #指定容器启动后需要干的事情
• COPY #复制文件
• ENV #环境变量
• ENTRYPOINT #容器启动后执行的命令
Docker入门
指定镜像名称构建
1、首先在桌面创建一个docker的文件夹,此文件夹中新建一个名为Dockerfile的脚本文件,编写如下内容:
![](https://img2022.cnblogs.com/blog/2901509/202208/2901509-20220810173923963-1726428849.png)
2、在控制台进入到Dockerfile脚本文件的目录下,然后进行构建。
docker build -t imageName .
3、运行镜像。
docker run --rm imageName
2、在控制台进入到Dockerfile脚本文件的目录下,然后进行构建。
docker build .
3、修改镜像的名称,并查看镜像信息。
Docker实战
部署Nginx
1、首先在桌面创建一个docker的文件夹,此文件夹中新建一个名为Dockerfile的脚本文件,编写如下内容:
2、在控制台进入到Dockerfile脚本文件的目录下,然后进行构建。
docker build -t imageName .
3、指定80端口运行镜像。
控制台显示docker日志信息如下:
1、在Dockerfile的脚本文件下存放名为app.py的Flask代码,代码内容如下:
2、首先在桌面创建一个docker的文件夹,此文件夹中新建一个名为Dockerfile的脚本文件,编写如下内容:
3、在控制台进入到Dockerfile脚本文件的目录下,然后进行构建。(docker build -t login .)
4、指定5000端口运行镜像。
docker run --rm -p5000:5000 login
部署Spring Boot
1、首先在桌面创建一个docker的文件夹,此文件夹中新建一个名为Dockerfile的脚本文件,编写如下内容:
2、将DBPlus-0.0.1-SNAPSHOT.jar与Dockerfile的脚本文件存放在同一目录下,如下图所示:
3、然后构建镜像
docker build -t dbplus .
4、指定8080端口运行镜像
docker run --rm -p8080:8080 dbplus
Docker和Spring Boot整合
1、将app工程文件存放到自己的代码目录下,如下图:
(app工程包含Dockerfile脚本文件,自动打包,自动生成镜像)
2、控制台输入构建命令
3、指定8081端口运行镜像
docker run --rm -p8081:8081 imageID
4、找到controller下的配置文件,可查看url。
5、验证镜像
通过浏览器访问:http://localhost:8081/index,请求成功后,显示如下:
Docker-compose启动镜像
Docker-compose
1、控制台输入pip install docker-compose,安装docker-compose
2、控制台输入命令:docker -compose -v,验证安装是否成功,如下图所示:
3、删除app镜像。
4、创建网络,创建⽹络的⽬的是为了容器与宿主机是在同⼀个⽹络的模式下。
5、⽹络创建成功后,控制台输入docker network list,就可以查看到⽬前的⽹络情况中存在mynetwork,具体如下:
6、控制台输入mvn clean package -Dmaven.test.skip=true docker:build,进行maven构建。
7、在docker目录下docker-compose up启动
8、验证容器,通过浏览器访问:http://localhost:8081/index
9、docker-compose down停止
Docker与Jenkins整合(自动化部署验证)
1、启动Jenkins和Docker;
2、删除镜像app;
3、创建名为docker-ci的item,在配置的流水线中填写如下脚本并保存:
1 pipeline{ 2 agent any 3 stages{ 4 stage('build the image'){ 5 steps{ 6 bat '''cd D:/test/code/app 7 d: 8 mvn clean package -Dmaven.test.skip=true docker:build''' 9 } 10 } 11 stage('run the container'){ 12 steps{ 13 bat '''cd D:/test/code/app/src/main/docker 14 d: 15 docker-compose up -d ''' 16 } 17 } 18 } 19 }
4、下来我们开始构建镜像,点击build now。其实我们构建的过程,第⼀步主要就是打包镜像,第⼆步就是⾃动化测试的启动镜像,第三个步骤就是验证部署的服务这部分,这部分也是可以理解为⼀个冒烟测试的过程。具体构建后输出的结果信息如下:
5、然后在控制台中可查看到已经构建好的app镜像。
![](https://img2022.cnblogs.com/blog/2901509/202208/2901509-20220815110444158-289948788.png)
⾸先在https://hub.docker.com/地址注册⼀个账户,账户信息为:username: password:
如果想把⾃⼰的镜像发布到dockerhub的地址,那么镜像的名称必须是name/imageName如image的名称为hello那么要发布的镜像名称就为:caichuanghong/hello,如果不这样处理的话,进⾏push的时候,就会提示没有权限的操作,这点需要特别的注意。下⾯详细的演示发布镜像的过程,特别注意,邮箱必须要进⾏确认和验证:
1、登录到dockerhub
2、查看已打包的镜像⽂件
3、修改镜像⽂件为符合push的名称
4、发布镜像到dockerhub
5、dockerhub上可查看到发布的镜像
maven
Java语言环境部署:
1、maven把编写好的程序构建成.jar
2、java -jar .jar java -jar .war
mvn clean :清理(指的是把构建成功的.war or .jar进行删除)
mvn package:打包 (把代码打包构建成.jar .war )
2、然后下载apache-maven-3.6.3并解压后,在path中添加环境变量
3、控制台输入mvn -v,显示如下图,则表示mvn环境搭建成功。
4、将DBPlus工程文件存放到自己的代码目录下
![](https://img2022.cnblogs.com/blog/2901509/202208/2901509-20220811175014531-1257995551.png)
5、控制台进入DBPlus目录下,然后输入mvn clean,显示如下图:
看到控制台输出BUILD SUCCESS,则表示mvn clean成功
DBPlus目录下的target目录被删除。
6、控制台输入mvn package进行打包,显示如下:
看到控制台输出BUILD SUCCESS,则表示mvn package成功,且DBPlus目录下的target目录重新被打包。
![](https://img2022.cnblogs.com/blog/2901509/202208/2901509-20220811175134015-1463391262.png)
7、控制台进入target目录下,输入java -jar DBPlus-0.0.1-SNAPSHOT.jar,运行jar包,运行结果显示如下:
8、通过查看D:\test\code\DBPlus\src\main\java\com\example\dbplus\controller路径下的配置文件,获取请求url和响应数据。
浏览器中返回的响应数据与配置文件中的响应数据一致。
10、通过查看D:\test\code\DBPlus\src\main\java\com\example\dbplus\controller路径下的配置文件,获取请求url和响应数据。
借助代码做接口测试
GO语言
通过接口的代码,获取接口信息,发送接口请求:
1 package main 2 3 import "github.com/gin-gonic/gin" 4 5 func datas() map[string]float32 { 6 var salaryMap map[string]float32 7 salaryMap = make(map[string]float32) 8 salaryMap["功能测试"] = 1009 9 salaryMap["自动化测试"] = 15000 10 salaryMap["测试开发"] = 20000 11 return salaryMap 12 } 13 14 func main() { 15 16 //创建默认的路由引擎 17 r := gin.Default() 18 19 //GET请求 20 r.GET("/index", func(c *gin.Context) { 21 c.JSON(200, gin.H{ 22 "status": 0, 23 "msg": "ok", 24 "datas": datas(), 25 }) 26 }) 27 28 //POST请求 29 r.POST("/login", func(c *gin.Context) { 30 //请求参数 31 user := c.PostForm("username") 32 passwd := c.PostForm("password") 33 //返回响应数据 34 //c.String(200, "username=%s,password=%s", username, password) 35 c.JSON(200, gin.H{ 36 "status": 0, 37 "msg": true, 38 "nick": user, 39 "token": user + passwd, 40 }) 41 }) 42 43 //启动后默认是端口是8080 44 r.Run() 45 }
以上代码获取的接口信息为:
1、index接口:
请求方法:GET请求
请求地址:http:localhost:8080/login
2、login接口:
请求方法:POST请求
请求地址:http:localhost:8080/login
请求参数:user :username
passwd :password
响应数据:
Python语言
找到apps包下的url.py,可以获取请求地址,例如下图中的请求地址为:/login/auth/
找到apps包下的view.py,可以获取请求地址,例如下图中的请求方法、请求参数和响应数据。
Docker安装软件
RabbitMQ
控制台输入docker ps -a | findstr rabbitmq,查看rabbitmq端口,如下所示:
控制台输入docker logs -f containerID ,查看日志信息,如下所示:
Docker容器监控
Docker监控原理
如果容器出现资源的瓶颈,那么就会导致容器中的程序都会出现问题,因为需要监控容器的资源信息。监控我们分
为两个维度来进⾏思考,具体如下:
基础数据采集
健康数据维护
cAdvisor监控
控制台输入docker pull registry.cn-hangzhou.aliyuncs.com/e7book/cadvisor:v0.37.0,获取cAdvisor
控制台输入docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro --publish=8081:8080 --detach=true --name=cadvisor --privileged --device=/dev/kmsg registry.cn-hangzhou.aliyuncs.com/e7book/cadvisor:v0.37.0,启动cAdvisor服务。
在云服务端搭建代码环境(包括maven、spingboot、docker等基础环境)
1 node{ 2 stage("build"){ 3 echo "build" 4 } 5 stage("deloy"){ 6 echo "deloy" 7 } 8 stage("test"){ 9 echo "test" 10 } 11 }
1 pipeline{ 2 agent any 3 stages{ 4 stage("hello"){ 5 steps{ 6 echo "hello" 7 } 8 } 9 } 10 }
docker的最终目的是为了实现环境自动化部署。