【Docker】从系统层面了解Docker&Docker常用命令解析

发布于:2022-07-28 ⋅ 阅读:(380) ⋅ 点赞:(0)

个人简介:

?个人主页:赵四司机
?学习方向:JAVA后端开发
?种一棵树最好的时间是十年前,其次是现在!
?喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。

前言:

1.前面基于Springboot的单体项目介绍已经完结了,至于项目中的其他功能实现我这里就不打算介绍了,因为涉及的知识点不难,而且都是简单的CRUD操作,假如有兴趣的话可以私信我我再看看要不要写几篇文章做个介绍。

2.完成上一阶段的学习,我就投入到了微服务的学习当中,所用教程为B站上面黑马的微服务教程。由于我的记性不是很好,所以对于新事物的学习我比较喜欢做笔记以加强理解,在这里我会将笔记的重点内容做个总结发布到“微服务学习”笔记栏目中。我是赵四,一名有追求的程序员,希望大家能多多支持,能给我点个关注就更好了。

一:问题引入

  在进行项目部署时候,一般都会将项目部署在Linux上,但是我们项目中不同的应用会有不同的依赖,比如Node.js、RabbitMQ和MySql之间需要的依赖是不同的(见下图),就算有的依赖相同但是版本不同也会带来困扰,如此复杂的关系会使得项目部署十分困难,很容易产生兼容性问题,就算把这些问题解决了,还有测试环境、生产环境的差异也还需要进一步处理。而且还有可能这些环境的操作系统版本可能是不同的,比如一个是Ubuntu一个是Centos也会产生很多兼容性问题。
在这里插入图片描述

  既然每个应用所需要的依赖不同,那么我们在进行打包时候将每个应用所需要的依赖、函数库等也一并打包不就行了吗?Docker就是通过这样的方法来解决不同应用之间不同依赖的问题的的。
在这里插入图片描述

二:如何解决不同操作系统间的问题

1.兼容性问题

  前面说了Dcker会将每个应用所需要的依赖、函数库等一起打包然后进行发送,并且将每个应用都单独放到一个隔离的容器中去运行,避免相互干扰。那么这仅仅是限于在同一个操作系统上面运行,因为我们打包时候是基于某个操作系统进行打包的,比如我们在Ubuntu上进行打包,将项目部署到Centos就不能运行了,不同的操作系统之间会带来兼容性问题。要想了解Docker是如何做到跨系统运行的,这就需要我们了解一下不同的操作系统之间有什么区别。

2.认识不同操作系统

​ 这里以Ubuntu系统为例进行讲解(见下图)
在这里插入图片描述
  其实所有的Linux操作系统都可以分成两层,一层是大家共有的操作系统内核,一层是每个操作系统特有的系统应用,当然每个操作系统的底层都脱离不了硬件的支持。内核是负责与计算机硬件打交道的,其提供操作硬件的指令,但是这些指令一般比较简陋,如果要基于这些指令进行开发会很复杂。所以我们就需要系统应用来帮我们简化这些指令,系统应用负责将内核指令封装成函数,以便于程序员进行调用。因此完整的调用流程为程序员调用函数库里面的函数,函数调用内核中的指令,指令负责与计算机硬件打交道。

  因为每个操作系统的系统应用是不同的,因此就会有不同的函数库,把一个在Ubuntu系统上开发好的项目放到Centos系统上面进行运行,假如项目中用到了Ubuntu系统特有的函数库,那么这时候在Centos上面显然是运行不了的。

3.Docker如何解决这一问题

  既然不同的操作系统之间的函数库是不同的,那么我们在打包时候将程序与所需要调用的系统(比如Ubuntu)函数库一起打包不就行了吗?Docker就是这么干的,当Docker运行到不同的操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行。

三:Docker简介

  Docker是一个快速交付应用、运行应用的技术,其允许开发中将应用、依赖、函数库、配置一起打包,形成可移植的镜像,可以迁移到任意Linux操作系统;不同的应用之间运行时利用沙箱机制形成隔离容器,使得他们之间互不干扰;且Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,每个不同的Linux操作系统都有相同的Linux内核,因此打包好的项目可以在任意Linux操作系统上面运行。

四:Docker与虚拟机的区别

  相信很多人都用过虚拟机,而且你是否会想过虚拟机也能解决上面因操作系统不同而带来的冲突。没错,虚拟机确实能解决上面提到的问题,因为虚拟机是安装在一个操作系统上面的,其结构可以见下图:
在这里插入图片描述

  那么虚拟机是如何做到在一个操作系统上面安装别的操作系统呢?其原因是在虚拟操作系统和底层操作系统之间采用了一种叫Hypervisor的技术,这种技术可以模拟出不同操作系统所需要的硬件,比如CPU、内存等。由于虚拟机是在一个操作系统里安装了另外的操作系统,因此采用虚拟机进行部署时候每个应用就相当于在一台真实的计算机上面运行,它会先调用其内部的操作系统,而该内置操作系统会通过Hypervisor与外部操作系统进行交互,可以看到经过了重重关卡,自然运行速率就会低下,而且我们都知道安装虚拟机是需要很大空间的,因此通过虚拟机作为服务器显然是不合实际的。
  而Docker则是直接与操作系统内核打交道的,其性能会比虚拟机好很多,而且Docker封装的只是一些函数库、依赖等等,因此其硬盘占用一般只有几兆到几百兆,与虚拟机的几GB相比会好很多。此外,Docker的启动时间是秒级的,而虚拟机由于还要进行开机,所以其启动时间是分钟级的。

五:Docker架构

1.镜像&容器

前面提到的内容中,主要的两个点还是镜像和容器,那么什么是镜像什么是容器呢?

  • 镜像(images):Docker将应用程序及其所需要的依赖、函数库、环境、配置文件等进行打包,称为镜像。
  • 容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。

  要注意的是,镜像是只读的,因为假如能对镜像进行写操作会造成镜像污染。就拿MySql来说,镜像里面包含data、logs、bin、lib等文件,由于镜像是只读的,所以当程序要运行时候就需要拷贝一份到自己的容器里面,当需要写数据时候就只能在自己的空间里面写数据和日志等,不能在其他地方进行操作。

2.DockerHub

  假如我们需要将镜像进行共享,那么就可以通过DockerHub来实现,DockerHub是一个Docker镜像托管平台,这样的平台称为Docker Registry,类似于GitHub,只不过GitHub是用来共享代码的,DockerHub是用来共享镜像的。

3.Docker架构总结

Docker是一个CS架构的程序,由两部分组成

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等。
  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或者远程向服务端发送指令
    在这里插入图片描述

六:Docker镜像

  在介绍Docker镜像相关命令之前我们先认识一下镜像的名称组成,镜像名称组成一般分为两部分:[repository]:[tag],前面代表镜像名称,后面代表镜像版本,比如MySqk:5.7,在没有指定tag时候,默认是lastest,代表最新版本。

Docker镜像常用命令有以下6个(参考下图):

  • docker images
  • docker rmi
  • docker pull
  • docker push
  • docker save
  • docker load

这6个命令的功能见下图
在这里插入图片描述

Docker容器相关命令主要有以下9个:

  • docker run
  • docker pause
  • docker unpause
  • docker stop
  • docker start
  • docker exec
  • docker logs
  • docker ps
  • docker rm

这9个命令的功能见下图
在这里插入图片描述

七:Docker镜像常用命令演示

1.镜像拉取

  通常我们都会去DockerHub官网进行镜像的拉取,进入官网之后,比如说我要拉取nginx的镜像,我就可以在上方搜索nginx
在这里插入图片描述

选择官方镜像
在这里插入图片描述

  点击进去之后在右边会出现一个命令docker pull nginx,执行这个命令拉去的是最新版,当然我们也可以自定义版本,也就是执行docker pull nginx:xx,下面我演示的是拉取最新版本:
在这里插入图片描述

查看系统中的镜像(docker images)
在这里插入图片描述
可以看到拉取到的是最新版本

2.保存&加载镜像

  我们可以从本地镜像仓库中将镜像保存下来打包发送,这里说明一下,假如你不知道某个命令如何使用,那么你就可以查看帮助文档,命令为docker xx --help,这里演示如何通过帮助文档查看docker save的介绍:
在这里插入图片描述

可以看到save命令的格式为docker save [OPTIONS] IMAGE [IMAGE…],下面执行这个命令
在这里插入图片描述
可以看到成功将nginx镜像下载到本地

那么如何将本地镜像加载到镜像仓库呢?首先我先将原来的镜像卸载(docker rmi image:tag)
在这里插入图片描述
可以看到成功将本地镜像仓库中的nginx镜像卸载了,接下来进行镜像加载
在这里插入图片描述

可以看到镜像成功加载

八:Docker容器常用命令

1.启动容器

docker run --name containerName -p 80:80 -d nginx

命令解读:

  • docker run:创建并运行一个容器
  • –name:给容器起一个名字,比如叫做ng
  • -p:将宿主机端口与容器端口进行映射,冒号左边是宿主机端口,冒号右边是容器端口
  • -d:后台运行容器
  • nginx:镜像名称

补充:

  为什么需要端口映射呢?因为假如你直接去访问容器时访问不了的,因为前面说过容器是被隔绝起来的,要想访问就必须通过端口进行映射,所谓端口映射通俗来说就是当我们想要访问容器的80端口时候你就可以通过访问宿主机的80端口然后宿主机再将该请求映射到容器的80端口达到让用户可以访问。

-d的意思就是当我们关闭窗口后容器的服务程序仍还在运行中的,相当于在后台运行。

执行docker run
在这里插入图片描述

返回的是容器的唯一id

2.查看容器状态及日志

在这里插入图片描述

可以看到有一个容器正在运行,下面尝试访问nginx
在这里插入图片描述
可以看到成功访问到nginx
输入命令docker logs -f ng
在这里插入图片描述
可以看到输出一堆日志信息,假如你要持续输出日志,你可以执行这个命令docker logs -f ng,当然后面那个参数是你的容器名字。

3.进入容器修改文件

  通过Docker的exec命令可以进入到容器里面对容器的文件进行修改,以我上面创建的ngnix为例,可执行docker exec -it ng bash进入该容器内部,命令解读:

  • docker exec:进入容器内部,执行一个命令
  • -it:给当前进入容器创建一个标准输入、输出终端,允许我们与容器进行交互
  • ng:要进入的容器的名称
  • bash:进入容器后执行的命令,bash是一个linux终端交互命令

  但是不建议通过这样去修改容器文件,因为这样做首先很麻烦,因为容器中只包含必要的函数库和文件,因此进入容器后不能通过vi或者vim命令对文件进行修改;而且通过这样的方式对容器文件进行修改是没有记录的。

4.数据卷操作

  前面提到不建议通过进入容器内部的形式对文件进行修改,那么是否还有更佳的方案呢?答案是肯定的,即通过数据卷来完成这一功能,数据卷可以理解为数据的双向绑定,即将你宿主机的文件和容器中的文件绑定起来,其中一个发生改变另一个都会跟着发生改变。数据卷能够将容器与数据分离,解耦合,方便操作容器内部数据,保证数据安全。

(1)基本语法

数据卷的基本语法如下:

docker volume [COMMAND],常用command命令有:

  • create:创建一个volume
  • inspect:显示一个或多个volume的信息
  • ls:列出所有的volume
  • prune:删除未使用的volume
  • rm:删除一个或多个指定volume

(2)挂载操作

我们在创建容器时候,可以通过-v参数来挂载一个数据卷到某个容器目录,举例如下:

docker run \ //创建容器并运行容器

–name ng \ //给容器起名为ng

-v html:/root/html \ //将html数据卷挂载到容器内部/root/html这个目录中

-p 8080:8080 \ //将宿主机的8080端口映射到容器内的8080端口

nginx //镜像名称

需要注意的是,假如我们没有提前创建好数据卷,那么执行docker run -v时候docker会自动帮我们创建。


网站公告

今日签到

点亮在社区的每一天
去签到