2021-Java后端工程师必会知识点-(Docker)(下)

简介: 前言文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…种一棵树最好的时间是十年前,其次是现在


Docker镜像


我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件系统。

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也


分层存储

因为镜像包含操作系统完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。


分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

网络异常,图片无法展示
|


Docker命令


帮助命令

  • docker version
  • docker info
  • docker --help


镜像命令

  • docker images(列出本地主机上的镜像)
  • docker search 某个XXX镜像名字 (查找镜像)
  • docker pull 某个XXX镜像名字(下载镜像)
  • docker rmi 某个XXX镜像名字ID(删除某个镜像)


容器命令

  • docker run [OPTIONS] IMAGE [COMMAND] (新建并启动容器)
  • docker ps [OPTIONS] (列出当前所有正在运行的容器)
  • docker start 容器ID或者容器名(启动容器)
  • docker restart 容器ID或者容器名(重启容器)
  • docker stop 容器ID或者容器名(停止容器)
  • docker kill 容器ID或者容器名(强制停止容器)
  • docker rm 容器ID(删除已停止的容器)
  • docker run -d 容器名(启动守护式容器)
  • docker logs -f -t --tail 容器ID(查看容器日志)
  • docker exec -it 容器ID bashShell (进入正在运行的容器并以命令行交互)
  • docker cp 容器ID:容器内路径 目的主机路径(从容器内拷贝文件到主机上)


docker pull 拉取镜像

网络异常,图片无法展示
|


  • Docker Client接受docker pull命令,解析完请求以及收集完请求参数之后,发送一个HTTP请求给Docker Server,HTTP请求方法为POST,请求URL为”/images/create? “+”xxx”;
  • Docker Server接受以上HTTP请求,并交给mux.Router,mux.Router通过URL以及请求方法来确定执行该请求的具体handler;
  • mux.Router将请求路由分发至相应的handler,具体为PostImagesCreate;
  • 在PostImageCreate这个handler之中,一个名为”pull”的job被创建,并开始执行;
  • 名为”pull”的job在执行过程中,执行pullRepository操作,即从Docker Registry中下载相应的一个或者多个image;
  • 名为”pull”的job将下载的image交给graphdriver;
  • graphdriver负责将image进行存储,一方创建graph对象,另一方面在GraphDB中记录image之间的关系。


docker run hello-world运行原理

网络异常,图片无法展示
|


Docker数据卷


是什么

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了,为了能保存数据在docker中我们使用卷。

一句话:有点类似我们Redis里面的rdb和aof文件,也就是我们所说的持久化用的



数据卷的特点

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷

特点:

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止


容器内添加

  • 直接命令添加

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

  • DockerFile添加

可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷


Dockerfile


是什么

Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

构建三步骤

  • 编写Dockerfile文件
  • docker build
  • docker run


DockerFile构建过程解析


Dockerfile内容基础知识

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交


Docker执行Dockerfile的大致流程

  • docker从基础镜像运行一个容器
  • 执行一条指令并对容器作出修改
  • 执行类似docker commit的操作提交一个新的镜像层
  • docker再基于刚提交的镜像运行一个新容器
  • 执行dockerfile中的下一条指令直到所有指令都执行完成


DockerFile体系结构

  • FROM(基础镜像,当前新镜像是基于哪个镜像的)
  • MAINTAINER(镜像维护者的姓名和邮箱地址)
  • RUN(容器构建时需要运行的命令)
  • EXPOSE(当前容器对外暴露出的端口)
  • WORKDIR(指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点)
  • ENV(用来在构建镜像过程中设置环境变量)
  • ADD(将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包)
  • COPY(类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置)
  • VOLUME(容器数据卷,用于数据保存和持久化工作)
  • CMD(指定一个容器启动时要运行的命令)
  • ENTRYPOINT(ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数)
  • ONBUILD(当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发)


本地镜像发布到阿里云


镜像的生成方法

  • 前面的DockerFile
  • 从容器创建一个新的镜像 docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]]


将本地镜像推送到阿里云

阿里云开发者平台cr.console.aliyun.com/cn-shanghai…

将镜像推送到registry

  • docker login --username=danielyoungchina registry.cn-shanghai.aliyuncs.com
  • docker tag [ImageId] registry.cn-shanghai.aliyuncs.com/daniel-hub/nginx-docker:[镜像版本号]
  • docker push registry.cn-shanghai.aliyuncs.com/daniel-hub/nginx-docker:[镜像版本号]

从Registry中拉取镜像

  • docker pull registry.cn-shanghai.aliyuncs.com/daniel-hub/nginx-docker:[镜像版本号]


结束


小六六这边给大家整理了下Docker的基础知识,因为为啥面试要准备这个呢?我们知道,现在基本上是k8s的服务治理,服务的发布基本上是基于容器了,可能在公司用的时候我们很简单,点一下升级按钮就好了,例如下面

网络异常,图片无法展示
|

但是呢?我们还是需要自己去了解这块东西,这样遇到问题解决起来就会快很多看。

目录
打赏
0
0
0
0
9
分享
相关文章
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
69 11
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
构建高效Java后端与前端交互的定时任务调度系统
通过以上步骤,我们构建了一个高效的Java后端与前端交互的定时任务调度系统。该系统使用Spring Boot作为后端框架,Quartz作为任务调度器,并通过前端界面实现用户交互。此系统可以应用于各种需要定时任务调度的业务场景,如数据同步、报告生成和系统监控等。
19 2
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
239 12
Java工程师如何理解张量?
刚接触AI和PyTorch,理解“张量(Tensor)”是入门关键。张量可类比为Java中的多维数组,但更强大,尤其在AI领域支持GPU加速、自动求导等特性。它不仅能高效存储数据,还能进行复杂运算,是深度学习的核心数据结构。掌握张量的维度、数据类型及GPU加速特性,对学习PyTorch至关重要。
42 3
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
73 2
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
本文介绍了如何配置和启动基于Java的若依(RuoYi)项目,涵盖后端和前端的详细步骤。首先,准备Redis、MySQL以及IDE(如Idea和VS)。接着,通过GitHub获取代码并导入到IDE中,执行必要的SQL文件和配置数据库密码。然后,启动Redis并进行相关配置。最后,按照前端配置步骤克隆前端代码库,打开终端执行命令完成前端配置。整个过程详细记录了每一步的操作,帮助开发者顺利部署若依项目。 如果你觉得有帮助,请点赞、关注和收藏,这将是我持续分享的动力!
480 1
《docker基础篇:7.Docker容器数据卷》包括坑、回顾下上一讲的知识点,参数V、是什么、更干嘛、数据卷案例
《docker基础篇:7.Docker容器数据卷》包括坑、回顾下上一讲的知识点,参数V、是什么、更干嘛、数据卷案例
61 13
Java网络编程知识点
Java网络编程知识点
78 13
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
128 3

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等