Docker概述

Docker是一个开源的容器引擎,基于Go语言开发.对Docker简单的理解就是使用Docker可以把一台服务器隔离成一个个独立的容器,我们可以把这地方描述的容器理解成一个沙盒。在每个容器中运行一个程序,不同的容器之间相互隔离,容器的创建,停止,以及启动基本都是秒为单位,而且容器对资源的需求也是非常有限的,比起虚拟化的技术而言,可以节约很多的资源成本。在DevOps技术栈体系和可持续交付中占据了重要的位置。

镜像相当于Linux的内核

镜像:image 容器:container(镜像运行后是容器)

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管理

获取镜像

镜像是从什么地方获取?是从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

-it:开启交互式的命令

--rm:容器退出时删除容器的记录信息

--name:指定容器的名称

-d:后台方式运行容器

 

 --name:指定容器的名称

-d:后台方式运行容器

  -p表示指定端口映射

 在浏览器中输入localhost,可成功跳转到以下页面:

 -P表示随机端口映射

安装Linux命令

使用Linux命令

使用结束后,可输入exit退出。

Docker 退出环境后,不会保留之前的任何操作。

查看容器的端口

docker port containerID

删除镜像

docker的镜像未被容器运⾏

使用镜像名称删除

 

使用镜像ID删除

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容器的一部分,然后再进行启动。特别需要注意的是:容器内的进程必须是前台运行状态,否则容器直接退出。

容器命令

在运行镜像中,后面需要带一些指令的信息,这些指令的信息具体汇总为如下:

• -d:后台运行

• -it:交互式命令(bash)

• --rm:容器关掉后自动被删除

• --name:给容器起一个名字

• -p:端口映射

• -P:指定任意的端口

容器信息查看

docker ps -a | findstr imageName:version

log查看

查看容器实时的错误日志: docker logs -f containerID

只显示最新的N条⽇志信息:

docker logs 51e2db607d0c | head -N   

docker logs 51e2db607d0c | tail -N   

容器提交

容器的提交生成镜像

 注意:提交容器的时候,切记⼀定要保持运⾏的容器是不能退出的

容器停止&启动

Dockerfile实战

使用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的脚本文件,编写如下内容:

 2、在控制台进入到Dockerfile脚本文件的目录下,然后进行构建。

docker build -t imageName .

 3、运行镜像。

docker run --rm imageName

不指定镜像名称直接构建

1、首先在桌面创建一个docker的文件夹,此文件夹中新建一个名为Dockerfile的脚本文件,编写如下内容:

 2、在控制台进入到Dockerfile脚本文件的目录下,然后进行构建。

docker build .

 3、修改镜像的名称,并查看镜像信息。

Docker实战

部署Nginx

1、首先在桌面创建一个docker的文件夹,此文件夹中新建一个名为Dockerfile的脚本文件,编写如下内容:

 2、在控制台进入到Dockerfile脚本文件的目录下,然后进行构建。

docker build -t imageName .

 3、指定80端口运行镜像。

 4、通过浏览器访问:http://localhost:80,请求成功后,显示如下:

 控制台显示docker日志信息如下:

 5、通过postman访问:http://localhost:80,请求成功后,显示如下:

部署Pyhton

1、在Dockerfile的脚本文件下存放名为app.py的Flask代码,代码内容如下:

 2、首先在桌面创建一个docker的文件夹,此文件夹中新建一个名为Dockerfile的脚本文件,编写如下内容:

 3、在控制台进入到Dockerfile脚本文件的目录下,然后进行构建。(docker build -t login .)

 4、指定5000端口运行镜像。

docker run --rm -p5000:5000 login

 5、通过浏览器访问:http://localhost:5000,请求成功后,显示如下:

 

部署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、控制台输入构建命令

mvn clean package -Dmaven.test.skip=true docker:build

 3、指定8081端口运行镜像

docker run --rm -p8081:8081 imageID

 4、找到controller下的配置文件,可查看url。

5、验证镜像

通过浏览器访问:http://localhost:8081/index,请求成功后,显示如下:

 

 通过浏览器访问:http://localhost:8081/testDev,请求成功后,显示如下:

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://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

maven的清理与打包

mvn clean :清理(指的是把构建成功的.war or .jar进行删除)

mvn package:打包 (把代码打包构建成.jar .war )

1、获取java8的镜像

 2、然后下载apache-maven-3.6.3并解压后,在path中添加环境变量

 3、控制台输入mvn -v,显示如下图,则表示mvn环境搭建成功。

4、将DBPlus工程文件存放到自己的代码目录下

 5、控制台进入DBPlus目录下,然后输入mvn clean,显示如下图:

 看到控制台输出BUILD SUCCESS,则表示mvn clean成功

 DBPlus目录下的target目录被删除。

 6、控制台输入mvn package进行打包,显示如下:

看到控制台输出BUILD SUCCESS,则表示mvn package成功,且DBPlus目录下的target目录重新被打包。

 7、控制台进入target目录下,输入java -jar DBPlus-0.0.1-SNAPSHOT.jar,运行jar包,运行结果显示如下:

8、通过查看D:\test\code\DBPlus\src\main\java\com\example\dbplus\controller路径下的配置文件,获取请求url和响应数据。

9、通过浏览器访问http://localhost:8080/login,请求成功后,显示如下:

浏览器中返回的响应数据与配置文件中的响应数据一致。

10、通过查看D:\test\code\DBPlus\src\main\java\com\example\dbplus\controller路径下的配置文件,获取请求url和响应数据。

11、通过浏览器访问http://localhost:8080/book/lists请求成功后,显示如下:

借助代码做接口测试

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 run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.10-management

 安装成功后,浏览器访问http://localhost:15672,输入账户名和密码guest,显示如下:

 控制台输入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服务。

 浏览器访问http://localhost:8081/containers/,页面显示Docker的资源监控情况:

环境部署的流程

 在云服务端搭建代码环境(包括maven、spingboot、docker等基础环境)

Jenkinsfile的两种书写方式

node

 1 node{
 2     stage("build"){
 3         echo "build"
 4     }
 5     stage("deloy"){
 6         echo "deloy"
 7     }
 8     stage("test"){
 9         echo "test"
10     }
11 }

pipeline

 1 pipeline{
 2     agent any
 3     stages{
 4         stage("hello"){
 5             steps{
 6                 echo "hello"
 7             }
 8         }  
 9     }
10 }

从程序到产品的体系(CI/CD体系)

 

 docker的最终目的是为了实现环境自动化部署。