技术栈传送门
JAVA 基础手撸架构,Java基础面试100问_vincent-CSDN博客
JAVA 集合手撸架构,JAVA集合面试60问_vincent-CSDN博客
JVM 虚拟机手撸架构,JVM面试30问_vincent-CSDN博客
并发编程手撸架构,并发编程面试123问_vincent-CSDN博客
Spring 手撸架构,Spring面试63问_vincent-CSDN博客
Spring cloud 手撸架构,Spring cloud面试45问_vincent-CSDN博客
SpringBoot手撸面试,Spring Boot面试41问_vincent-CSDN博客
Netty 与 RPC手撸架构,Netty 与 RPC面试48问_vincent-CSDN博客
Doubo 手撸架构,Dubbo面试49问_vincent-CSDN博客
Redis手撸架构,Redis面试41问_vincent-CSDN博客
Zookeeper手撸架构,Zookeeper面试27问_vincent-CSDN博客
Mysql 手撸架构,Mysql 面试126问_vincent-CSDN博客
MyBatis手撸架构,MyBatis面试42问_vincent-CSDN博客
MongoDB 手撸架构,MongDB 面试50问_vincent-CSDN博客
Elasticsearch手撸架构,Elasticsearch 面试25问_vincent-CSDN博客
RabbitMQ 手撸架构,RabbitMQ 面试49问_vincent-CSDN博客
Kafka 手撸架构,Kafka 面试42问_vincent-CSDN博客
Docker手撸架构,Docker 面试25问_vincent-CSDN博客
Nginx手撸架构,Nginx 面试40问_vincent-CSDN博客
算法常用排序算法总结(1)-- 比较排序_vincent-CSDN博客_比较排序
常用排序算法总结(2)-- 非比较排序算法_vincent-CSDN博客_非比较排序的算法有
分布式事务分布式事务解决方案(总览)_vincent-CSDN博客
HTTP太厉害了,终于有人能把TCP/IP 协议讲的明明白白了_vincent-CSDN博客_tcp和ip

 什么 Docker?

终于有人把 Docker 讲清楚了_vincent-CSDN博客

Docker 是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行。

docker改变了什么

  • 面向产品:产品交付
  • 面向开发:简化环境配置
  • 面向测试:多版本测试
  • 面向运维:环境一致性
  • 面向架构:自动化扩容(微服务)

docker架构

终于有人把 Docker 讲清楚了

  • distribution 负责与docker registry交互,上传洗澡镜像以及v2 registry 有关的源数据
  • registry负责docker registry有关的身份认证、镜像查找、镜像验证以及管理registry mirror等交互操作
  • image 负责与镜像源数据有关的存储、查找,镜像层的索引、查找以及镜像tar包有关的导入、导出操作
  • reference负责存储本地所有镜像的repository和tag名,并维护与镜像id之间的映射关系
  • layer模块负责与镜像层和容器层源数据有关的增删改查,并负责将镜像层的增删改查映射到实际存储镜像层文件的graphdriver模块
  • graghdriver是所有与容器镜像相关操作的执行者

docker是怎么工作的?

实际上docker使用了常见的CS架构,也就是client-server模式,docker client负责处理用户输入的各种命令,比如docker build、docker run,真正工作的其实是server,也就是docker demon,值得注意的是,docker client和docker demon可以运行在同一台机器上。

Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。守护进程和客户端可以运行在同一台机器上。

解释基本的Docker使用流程

  1. 一切都从Dockerfile开始。Dockerfile是镜像的源代码。
  2. 创建Dockerfile后,您可以构建它以创建容器的镜像。镜像只是“源代码”的“编译版本”,即Dockerfile。
  3. 获得容器的镜像后,应使用注册表重新分发容器。注册表就像一个git存储库 - 你可以推送和拉取镜像。
  4. 接下来,您可以使用该镜像来运行容器。在许多方面,正在运行的容器与虚拟机(但没有管理程序)非常相似。

Docker 安全么?

Docker 利用了 Linux 内核中很多安全特性来保证不同容器之间的隔离,并且通
过签名机制来对镜像进行验证。大量生产环境的部署证明,Docker 虽然隔离性无法与
虚拟机相比,但仍然具有极高的安全性。

Docker 与 虚拟机 有何不同?

Docker 不是虚拟化方法。它依赖于实际实现基于容器的虚拟化或操作系统级虚拟化的其他工具。为此,Docker 最初使用 LXC 驱动程序,然后移动到libcontainer 现在重命名为 runc。Docker 主要专注于在应用程序容器内自动部署应用程序。应用程序容器旨在打包和运行单个服务,而系统容器则设计为运行多个进程,如虚拟机。因此,Docker 被视为容器化系统上的容器管理或应用程序部署工具。

  • 容器不需要引导操作系统内核,因此可以在不到一秒的时间内创建容器。此功能使基于容器的虚拟化比其他虚拟化方法更加独特和可取。
  • 由于基于容器的虚拟化为主机增加了很少或没有开销,因此基于容器的虚拟化具有接近本机的性能。
  • 对于基于容器的虚拟化,与其他虚拟化不同,不需要其他软件。
  • 主机上的所有容器共享主机的调度程序,从而节省了额外资源的需求。
  • 与虚拟机映像相比,容器状态(Docker 或 LXC 映像)的大小很小,因此容器映像很容易分发。
  • 容器中的资源管理是通过 cgroup 实现的。Cgroups 不允许容器消耗比分配给它们更多的资源。虽然主机的所有资源都在虚拟机中可见,但无法使用。这可以通过在容器和主机上同时运行 top 或 htop 来实现。所有环境的输出看起来都很相似。

特性Docker虚拟机
启动速度秒级分钟级
交付/部署开发、测试、生产环境一致无成熟体系
性能近似物理机性能损耗大
体量极小(MB)较大(GB)
迁移/扩展跨平台,可复制较为复杂

Docker与LXC ( Linux Container)有何不同?

LXC利用Linux上相关技术实现了容器支持; Docker早期版本中使用了LXC技术,后期演化为新的 libcontainer, 在如下的几个方面进行了改进:

  • 移植性: 通过抽象容器配置, 容器可以实现从一个平台移植到另一个平台;
  • 镜像系统: 基于AUFS的镜像系统为容器的分发带来了很多的便利, 同时共同的镜像层只需要存储一份,实现高效率的存储;
  • 版本管理: 类似于Git的版本管理理念, 用户可以更方便地创建、 管理镜像文件;
  • 仓库系统: 仓库系统大大降低了镜像的分发和管理的成本;
  • 周边工具: 各种现有工具(配置管理、 云平台)对Docker的支持, 以及基于Docker 的PaaS、CI等系统, 让Docker的应用更加方便和多样化。

什么是 Docker 镜像?

Docker 镜像是 Docker 容器的源代码,Docker 镜像用于创建容器。使用build 命令创建镜像。

什么是 Docker 容器?

Docker 容器包括应用程序及其所有依赖项,作为操作系统的独立进程运行。

 Docker 容器有几种状态?

四种状态:运行、已暂停、重新启动、已退出。

Dockerfile 中最常见的指令是什么?

  • FROM:指定基础镜像
  • LABEL:功能是为镜像指定标签
  • RUN:运行指定的命令
  • CMD:容器启动时要运行的命令

Dockerfile 中的命令 COPY 和 ADD 命令有什么区别?

COPY 与 ADD 的区别 COPY 的 SRC 只能是本地文件,其他用法一致。 8. 解释一下 Dockerfile 的 ONBUILD 指令? 当镜像用作另一个镜像构建的基础时,ONBUILD 指令向镜像添加将在稍后执行的触发指令。如果要构建将用作构建其他镜像的基础的镜像(例如,可以使用特定于用户的配置自定义的应用程序构建环境或守护程序),这将非常有用。

docker常用命令?

  • docker pull    拉取或者更新指定镜像
  • docker push     将镜像推送至远程仓库
  • docker rm    删除容器
  • docker rmi    删除镜像
  • docker images    列出所有镜像
  • docker ps    列出所有容器

1、如何列出可运行的容器?
docker ps

2、启动nginx容器(随机端口映射),并挂载本地文件目录到容器html的命令是?
docker run -d -P --name nginx2 -v /home/nginx:/usr/share/nginx/html nginx

3、进入容器的方法有哪些?
1、使用 docker attach 命令
2、使用 exec 命令,例如docker exec -i -t 784fd3b294d7 /bin/bash

4、容器与主机之间的数据拷贝命令是?
docker cp 命令用于容器与主机之间的数据拷贝
主机到容器:
docker cp /www 96f7f14e99ab:/www/
容器到主机:
docker cp 96f7f14e99ab:/www /tmp/

5、当启动容器的时候提示:exec format error?如何解决问题
检查启动命令是否有可执行权限,进入容器手工运行脚本进行排查。

6、本地的镜像文件都存放在哪里?
与 Docker 相关的本地资源都存放在/var/lib/docker/目录下,其中 container 目录存放容器信息,graph 目录存放镜像信息,aufs 目录下存放具体的内容文件。

7、如何退出一个镜像的 bash,而不终止它?
按 Ctrl-p Ctrl-q。

8、退出容器时候自动删除?
使用 –rm 选项,例如 sudo docker run –rm -it ubuntu

9、如何批量清理临时镜像文件?
可以使用 sudo docker rmi $(sudo docker images -q -f danging=true)命令

10、如何查看镜像支持的环境变量?
使用 sudo docker run IMAGE env

11、本地的镜像文件都存放在哪里
于 Docker 相关的本地资源存放在/var/lib/docker/目录下,其中 container 目录
存放容器信息,graph 目录存放镜像信息,aufs 目录下存放具体的镜像底层文件。

12、容器退出后,通过 docker ps 命令查看不到,数据会丢失么?
容器退出后会处于终止(exited)状态,此时可以通过 docker ps -a 查看,其中数据不会丢失,还可以通过 docker start 来启动,只有删除容器才会清除数据。

13、如何停止所有正在运行的容器?
使用 docker kill $(sudo docker ps -q)

14、如何清理批量后台停止的容器?
答:使用 docker rm $(sudo docker ps -a -q)

15、如何临时退出一个正在交互的容器的终端,而不终止它?
按 Ctrl+p,后按 Ctrl+q,如果按 Ctrl+c 会使容器内的应用进程终止,进而会使容器终止。

什么是 Docker Swarm?

Docker Swarm 是 Docker 的本机群集。它将 Docker 主机池转变为单个虚拟Docker 主机。Docker Swarm 提供标准的 Docker API,任何已经与 Docker守护进程通信的工具都可以使用 Swarm 透明地扩展到多个主机。

容器内部机制?

每个容器都在自己的命名空间中运行,但使用与所有其他容器完全相同的内核。发生隔离是因为内核知道分配给进程的命名空间,并且在API调用期间确保进程只能访问其自己的命名空间中的资源。

什么是Docker Hub?

Docker hub是一个基于云的注册表服务,允许您链接到代码存储库,构建镜像并测试它们,存储手动推送的镜像以及指向Docker云的链接,以便您可以将镜像部署到主机。它为整个开发流程中的容器镜像发现,分发和变更管理,用户和团队协作以及工作流自动化提供了集中资源。

镜像与 UnionFS

Linux 的命名空间和控制组分别解决了不同资源隔离的问题,前者解决了进程、网络以及文件系统的隔离,后者实现了 CPU、内存等资源的隔离,但是在 Docker 中还有另一个非常重要的问题需要解决 - 也就是镜像。

Docker 镜像其实本质就是一个压缩包,我们可以使用命令将一个 Docker 镜像中的文件导出,你可以看到这个镜像中的目录结构与 Linux 操作系统的根目录中的内容并没有太多的区别,可以说 Docker 镜像就是一个文件。

 存储驱动

Docker 使用了一系列不同的存储驱动管理镜像内的文件系统并运行容器,这些存储驱动与

Docker 卷(volume)有些不同,存储引擎管理着能够在多个容器之间共享的存储。

docker容器之间怎么隔离?

Linux中的PID、IPC、网络等资源是全局的,而NameSpace机制是一种资源隔离方案,在该机制下这些资源就不再是全局的了,而是属于某个特定的NameSpace,各个NameSpace下的资源互不干扰。

虽然有了NameSpace技术可以实现资源隔离,但进程还是可以不受控的访问系统资源,比如CPU、内存、磁盘、网络等,为了控制容器中进程对资源的访问,Docker采用control groups技术(也就是cgroup),有了cgroup就可以控制容器中进程对系统资源的消耗了,比如你可以限制某个容器使用内存的上限、可以在哪些CPU上运行等等。

有了这两项技术,容器看起来就真的像是独立的操作系统了。

仓库( Repository)、 注册服务器( Registry)、 注册索引( Index)有何关系?

仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像。注册服务器是存放实际的镜像文件的地方。注册索引则负责维护用户的账号、权限、搜索、标签等的管理。因此,注册服务器利用注册索引来实现认证等管理。

如何在生产中监控 Docker?

Docker 提供 docker stats 和 docker 事件等工具来监控生产中的 Docker。我们可以使用这些命令获取重要统计数据的报告。

Docker 统计数据:当我们使用容器 ID 调用 docker stats 时,我们获得容器的CPU,内存使用情况等。它类似于 Linux 中的 top 命令。

Docker 事件:Docker 事件是一个命令,用于查看 Docker 守护程序中正在进行的活动流。 一些常见的 Docker 事件:attach,commit,die,detach,rename,destroy 等。我们还可以使用各种选项来限制或过滤我们感兴趣的事件。

如何在多个环境中使用Docker?

可以进行以下更改:

  • 删除应用程序代码的任何卷绑定,以便代码保留在容器内,不能从外部更改
  • 绑定到主机上的不同端口
  • 以不同方式设置环境变量(例如,减少日志记录的详细程度,或启用电子邮件发送)
  • 指定重启策略(例如,重启:始终)以避免停​​机
  • 添加额外服务(例如,日志聚合器)

因此,您可能希望定义一个额外的Compose文件,例如production.yml,它指定适合生产的配置。此配置文件只需要包含您要从原始Compose文件中进行的更改。

 Docker能在非Linux平台(比如 macOS或 Windows)上运行么?

可以。 macOS目前需要使用  docker for mac等软件创建一个轻量级的Linux虚拟机层。 由于成熟度不高,暂时不推荐在Windows环境中使用Docker。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐