2022
我们一起努力

Docker,docker面试题

目录:

  • 1、什么是Docker
  • 2、Docker入门
  • 3、详解Docker——你需要知道的Docker进阶知识五
  • 4、什么是docker
  • 5、Docker是什么?
  • 6、Docker是什么?它比虚拟机强在哪里?

什么是Docker

Docker是一个开源的应用容器引擎,它基于Go语言开发,并遵从Apache2.0开源协议。使用Docker可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意Linux机器上,也可以实现虚拟化。Docker容器完全使用沙箱机制,相互之间不会有任何接口,这保证了容器之间的安全性。

Docker诞生于2013年初,目前有两个版本:Community Edition(CE,社区版)和Enterprise

Edition(EE,企业版)。

Docker有哪些特点?

1、更高效的利用系统资源

Docker对系统资源的利用率很高,无论是应用执行速度,内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,对比虚拟化技术,一个相同配置的主机往往可以运行更多数量的应用。

2、更快速的启动时间

传统的虚拟化技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级,甚至毫秒级的启动时间,大大节约了开发测试,部署的时间。

3、一致的运行环境

开发过程中常见的一个问题是环境一致问题,由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中发现。而Docker的镜像提供了除内核外完整的运行时环境,确保环境一致性,从而不会在出现这段代码在我机器上没问题这类问题。

4、持续支付和部署

对开发和运维人员来说,最希望就是一次创建和部署,可以在任意地方运行。而且使用Docker

file使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

5、更轻松的迁移

由于Docker确保了执行环境的一致性,使得应用的迁移更加容易。Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本、其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无**常运行的情况。

6、更轻松的维护和扩展

Docker使用的分层存储以及镜像技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得十分简单。此外,Docker团队同各个开源项目团队一起维护了一大批高质量的官网镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大降低了应用服务的镜像制作成本。

Docker入门

docker概念

docker意为码头工人(Dock Worker),即从船上装卸货物的人。这与它的性质非常贴切。

docker 官网是这样解释自己的,

目前阿里,京东,腾讯早已将docker应用到生产环境。

docker 历史

Docker 公司起初是一家名为 dotCloud 的平台即服务(Platform-as-a-Service, PaaS)提供商。

底层技术上,dotCloud 平台利用了 Linux 容器技术。为了方便创建和管理这些容器,dotCloud 开发了一套内部工具,之后被命名为“Docker”。Docker就是这样诞生的!

2013年,dotCloud 的 PaaS 业务并不景气,公司需要寻求新的突破。于是他们聘请了 Ben Golub 作为新的 CEO,将公司重命名为“Docker”,放弃dotCloud PaaS 平台,怀揣着“将 Docker 和容器技术推向全世界”的使命,开启了一段新的征程。

如今 Docker 公司被普遍认为是一家创新型科技公司,据说其市场价值约为 10 亿美元。Docker 公司已经通过多轮融资,吸纳了来自硅谷的几家风**司的累计超过 2.4 亿美元的投资。

docker 特征

docker 核心概念

docker镜像是一系列文件,它起源于linux联合文件系统,通过分层实现镜像文件的存储。

容器本质上是一个进程,你可以把它想象成虚拟机但是它跟虚拟机完全不同。

docker仓库在hub.docker.com

,当然国内有163,网易蜂巢镜像。如果是private的就需要自己搭建镜像中心了。

docker工作流程

如上图,docker的工作流程大致是,

docker的网络

docker的关键在于容器内部与宿主机的通信,我们知道的有三种类型,Bridge 独立网络,Host与宿主机使用同一网络,None无网络。

参照: Docker四种网络模式 - (jianshu.com)

Docker pull[OPTIONS] NAME{:TAG} 镜像名称:版本

Docker images[OPTIONS] [REPOSITORY[:TAG]]

Docker run [OPTIONS] IMAGE [:TAG] [COMMAND][ARG…]

Docker rm NAME

docler exec -it backend-tomcat bash

以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。

所以可以以 符号连接命令,这样执行后,只会创建 1 层镜像。

具体的指令参考: Docker Dockerfile | 菜鸟教程 (runoob.com)

详解Docker——你需要知道的Docker进阶知识五

Dockerfile 是一个文本文件,其中包含了构建 Docker 镜像需要执行的命令序列。使用 docker build 命令从 Dockerfile 中读取指令来构建镜像。

构建镜像时,该过程的第一件事是将 Dockerfile 文件所在目录下的所有内容发送给 Docker 守护进程。所以大多数情况下,最好创建一个新的目录,在其中保存 Dockerfile ,以及构建镜像所需的其它文件。Dockerfile 文件所在目录也被称为构建上下文(context)。

使用 FROM 指令指定一个基础镜像,后续指令将在此镜像基础上运行:

在 Dockerfile 中可以指定一个用户,后续的 RUN , CMD 以及 ENTRYPOINT 指令都会使用该用户身份去执行,该用户必须已存在。

除了指定用户之外,还可以使用 WORKDIR 指定当前工作目录(CWD), RUN , CMD , COPY , ADD 指令将在指定的工作目录中执行。

RUN 指令用于执行命令,该指令有两种形式:

例如我们执行更新命令:

CMD 的使用方式跟 RUN 类似,不过在一个 Dockerfile 文件中只能有一个 CMD 指令,如果有多个,则只有最后一个会生效。该指令指定了启动容器时要执行的命令,例如:

可以在 docker run 时指定命令来覆盖默认的 CMD 命令,比如 docker run image echo"hello shiyanlou" 。

CMD 指令还有一种特殊用法。在 Dockerfile 中,如果使用 ENTRYPOINT 指令指定了入口命令,则 CMD 指令的内容会作为 ENTRYPOINT 指令的参数:

ENTRYPOINT 指令会覆盖 CMD 指令作为容器运行时的默认指令,并且该指令不会被 docker run 时指定的指令覆盖,如下示例:

上述文件构建出来的镜像,使用 docker run image 等同于 docker run image ls-a-l 。使用 docker run image-i-s 等同于 docker run image ls-a-i-s 。即 CMD 指令的值会被当作 ENTRYPOINT 指令的参数附加到 ENTRYPOINT 指令的后面,只有 CMD 指令可以被覆盖。

COPY 和 ADD 都用于将构建上下文中的文件,目录等**到镜像中。使用方式如下:

`` 可以指定多个,但是其路径不能超出构建上下文范围,即必须在 Dockerfile 同级或子目录中。

不需要预先存在,不存在时会自动创建,如果使用相对路径,则 为相对于工作目录的路径。

COPY 和 ADD 的不同之处在于,ADD 可以添加远程文件,并且 `` 可以是 gzip 或 tar 等格式的压缩文件,添加时会自动进行解压。

ENV 指令用于设置环境变量:

VOLUME 指令指定要创建的挂载路径,在容器运行时,将为每个挂载路径创建一个匿名卷并挂载上去:

上述指令将会在容器运行时,创建两个匿名卷,并分别挂载到容器中的 /data1 和 /data2 路径。

学习了上面这些常见的 Dockerfile 指令之后,可以使用这些指令来构建一个镜像。如下所示,构建一个提供 ssh 服务的镜像:

构建镜像

查看镜像

启动容器

查看已经启动的容器

测试远程登录

Compose 是运行由多个容器组成的 Docker 应用的工具,使用 Compose 可以一次启动一组有关联的服务,每个服务由来自同一镜像的单个或多个容器组成。

在复杂应用中,应用一般由多个服务(service)组成,例如一个网站后台通常包含 Web 服务、数据库服务、缓存服务、消息队列服务等。

使用 Compose 的步骤如下:

目前有三种版本的 Compose 文件格式:

下载 docker-compose-Linux-x86_64

下载成功后,为了方便使用,可以将其添加到 PATH 路径下

执行完成后,就能够在终端下直接使用 docker-compose 命令了:

接下来我们将创建一个 Web 应用,该应用包含两个容器:

项目目录结构如下:

首先编辑 app/web/web.py 文件,写入下面的内容:

上述代码创建了一个简单的 Web 应用。该应用会连接 redis 服务,在访问 / 页面时,自动将变量 number 加 1。

编辑 app/web/requirements.txt 文件,输入如下内容:

requirements.txt 文件存放了 Web 应用依赖的第三方库包的名称和版本信息。

编辑 app/web/Dockerfile 文件,添加如下内容

上述 Dockerfile 定义了 Web 应用镜像,该镜像基于 python:2.7 基础镜像,在其基础上安装了应用依赖的库包,并通过 CMD 指令指定了应用的启动命令。

编辑 app/docker-compose.yml 文件:

该 docker-compose.yml 文件定义了两个服务,分别为 web 和 redis 服务,并且配置了 web 服务的端口映射和挂载目录。 depends_on 定义了依赖关系,被依赖的服会先启动。

进入 app 目录,执行 docker-compose up 命令来启动应用:

启动成功后,就可以打开网址 127.0.0.1:8001 来访问 Web 应用了。

另外一些命令:

什么是docker?

一、什么是Docker:

Docker容器本质上是宿主机上进程,三个特点:

1.通过namespace实现了资源隔离;完成一个容器需要6项目隔离:

  namespace        系统调用参数              隔离内容

  UTS              CLONE_NEWUTS              主机名与域名

  IPC              CLONE_NEWIPC              信号量,消息队列和共享内容

  PID              CLONE_NEWPID              进程编号

  Network          CLONE_NEWNET              网络设备/网络栈/端口等

  Mount            CLONE_NEWNS              挂载点(文件系统)

  User              CLONE_NEWUSER            用户和用户组

  Linux实现namespace的目的就是线下轻量化虚拟化服务。

2.通过cgroups实现资源限制;

  cgroups是Linux内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合或者分隔到按资源划分登记的不同组内,从而为系统资源管理提供一个统一的框架。

  通俗的地讲,cgroups可以限制,记录任务组所使用的物理资源(包括CPU,Memory,IO等)为容器实现虚拟化提供基本保证,是构建Docker等一系列虚拟化管理工具的基石。

  本质上来说,cgroups是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源调度触发相应的钩子以达到资源追踪和限制的目的。

3.通过写时**机制(copy-on-write)实现了高效的文件操作。

二、Docker架构:

Docker Daemon作用:

Docker Daemon是Docker最核心的后台进程,它负责响应来自Docker Client的请求,然后将这个请求翻译成系统调度完成容器的管理操作。该经常会在后台启动一个API Server,负责接收由Docker client发送的请求;接收到的请求将通过Docker daemon分发调度,再有具体的函数来执行请求。

Docker client:

Docker client是一个泛称,用来向Docker daemon发送请求,,执行相应的容器管理操作。它既可以是命令行工具docker,也可以是任何遵循了Docker API的客户端。

libcontainer分为三大块内容:

(1)容器的创建以及初始化;

(2)容器生命周期管理;

(3)进展管理,调用方为Docker的execdriver。

Docker是什么?

Docker是世界领先的软件容器平台。Docker使用Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器,但docker本身并不是容器,它是创建容器的工具,是应用容器引擎。

Docke最初实现是基于LXC。LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。

docker并不是LXC替代品,docker底层使用了LXC来实现,LXC将linux进程沙盒化,使得进程之间相互隔离,并且能够课哦内阁制各进程的资源分配。在LXC的基础之上,docker提供了一系列更强大的功能。

Docker能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。

用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、**、分享、修改,就像管理普通的代码一样。

docker的三个概念:

镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。

容器(Container):类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。

仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。

docker的用途:

官方给的是bulid ship run,就是编译、装载、运行。就是实现了应用的封装、部署、运行的生命周期管理只要在glibc的环境下,都可以运行。

谐云自主研发的容器云平台,是基于Docker和Kubernetes技术构建的一套完整IT标准化和自动化框架,以“面向终态、优化IT资源”为目标的新一代PaaS平台,能够提高企业的IT管理能力,在降低运营成本和风险的同时,获得更高的运维效率,保障业务稳定运行和高效迭代。

Docker是什么?它比虚拟机强在哪里?

Docker是一个开源的应用容器引擎,可以让开发者将自身的应用或者软件移植到镜像中,然后发布到任何一个Windows机器或者Linux机器上,当然Docker也可以实现虚拟化。而一个完整的Docker是由:Docker Client客户端,Docker Daemon 守护进程,Docker Image 镜像和Docker Container 容器来组成的。容器是完全采用沙箱机制,相互之间不会有任何接口。

而Docker比虚拟机强大的地方在于:

第一:启动时间:Docker容器是秒级启动的,而虚拟机时分钟级启动,在启动速度方面,Docker就能够完美地碾压了虚拟机。

第二:占用空间和性能:在占用空间和性能方面,Docker容器镜像比虚拟机要小得多且性能要比虚拟机更强。

第三:使用要求:虚拟机是基于硬件的虚拟化,其CPU也要有支持虚拟化的支持,Docker共享宿主机内核,可运行在主流的Linux,不用考虑CPU是否支持虚拟化技术。

赞(0)
文章名称:《Docker,docker面试题》
文章链接:https://www.fzvps.com/234857.html
本站文章来源于互联网,如有侵权,请联系管理删除,本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
图片版权归属各自创作者所有,图片水印出于防止被无耻之徒盗取劳动成果的目的。

评论 抢沙发

评论前必须登录!