- ISO镜像文件了解嘛?⭐⭐
ISO 镜像文件是一种用于存储光盘或 DVD 的镜像文件格式。
它是将光盘或 DVD 中的所有内容以二进制格式复制到一个文件中,包括文件系统、引导记录、文件和目录等等。
ISO 镜像文件通常具有扩展名为 .iso。它可以用于创建一个完全相同的副本,这个副本可以用于安装操作系统、软件应用程序或其他类型的数据。比如我们创建虚机,通常需要一个 ISO 镜像文件来安装操作系统 - VMWare创建虚拟机三种网络模式⭐⭐
1.桥接模式(Bridged Mode):桥接模式允许虚拟机与物理网络上的其他设备连接到同一个网络中,虚拟机可以与局域网内的其他设备进行通信,就像它们连接到同一个物理交换机上一样。虚拟机可以获得网络上的 IP 地址,访问 Internet 和其他网络资源,同时其他设备也可以通过网络访问虚拟机。
2.主机模式(Host-Only Mode):主机模式允许虚拟机与宿主机之间建立连接,但不允许虚拟机直接访问 Internet 和其他网络资源。虚拟机可以与宿主机之间进行通信,但无法与局域网内的其他设备通信。此模式适合在虚拟机之间建立局域网,并对其进行测试和开发。
3.NAT 模式(Network Address Translation Mode):NAT 模式允许虚拟机与宿主机之间建立连接,并共享宿主机的网络连接。虚拟机可以通过 NAT 模式访问 Internet 和其他网络资源,但是局域网内的其他设备无法直接访问虚拟机。此模式适合在虚拟机中进行测试和开发,但需要访问 Internet 和其他网络资源。 - Docker 的基本组件有哪些?⭐⭐⭐
服务端 Docker 进程(Server Docker Daemon):负责管理 Docker 容器和镜像;处理客户端的请求,并执行相应的操作。
API 接口(REST API):为 Docker 客户端提供与服务端 Docker daemon 交互的接口。
Docker 客户端命令行(Client Docker CLI):允许用户与服务端 Docker daemon 交互,客户端发送的一系列请求,例如运行容器、构建镜像等操作,将最终由服务端 Docker daemon 来执行。
Docker 镜像(Images):是一个轻量级、可执行的软件包,其中包含了运行应用程序所需的所有代码、库、配置文件等。容器镜像可以通过运行容器来启动,容器会使用镜像创建一个独立的运行环境,包含容器镜像中的所有文件和依赖项。
Docker 容器(Containers):是 Docker 中的运行时实体,包含了应用程序及其依赖关系,可以被启动、停止、重启、删除等操作。
Docker 网络(Networks):允许容器之间进行通信,并提供网络隔离、端口映射等功能。
Docker 存储(Data Volumes):提供容器内部数据的持久化存储功能,包括数据卷、本地文件系统、网络存储等 - Docker 镜像是如何创建的?如何分享 Docker 镜像?⭐⭐⭐
Docker 镜像可以通过 Dockerfile 文件创建,Dockerfile 文件描述了如何构建 Docker 镜像,包括基础镜像、应用程序代码、运行环境等。在 Dockerfile 文件所在的目录下,使用 docker build 命令可以构建 Docker 镜像。
要分享 Docker 镜像,可以将其推送到 Docker Hub 或者其他 Docker 镜像仓库中。使用 docker tag 命令可以给镜像打上标签,然后使用 docker push 命令将镜像推送到仓库中。别人在使用时通过 docker pull 拉取镜像。 - Docker 镜像和容器的区别是什么?⭐⭐⭐⭐
镜像是一个只读的模板,用于创建 Docker 容器。镜像可以看作是一个容器的静态版本,包括应用程序代码、运行环境、依赖项等。镜像通常是由 Dockerfile 或者从其他镜像派生而来,可以通过 Docker Hub 或者本地仓库获取。
容器是由 Docker 镜像创建而来的可运行实例,包括应用程序的运行状态、环境变量等信息。容器可以看作是一个镜像的运行时实例,它可以被启动、停止、删除等。容器通常是基于镜像创建的,并且容器的变化不会影响镜像。 - Docker 中基础镜像的作用⭐⭐⭐⭐
Docker 中基础镜像是用来构建 Docker 镜像的基础,也是构建整个 Docker 镜像的起点。它是一个只读的文件系统,包含了一些基本的操作系统和软件组件,例如操作系统内核、文件系统、运行时环境、库文件、工具等。
使用基础镜像可以避免从头开始构建 Docker 镜像,从而节省时间和精力。基础镜像已经被优化过,并且得到了广泛的测试和验证,因此可以保证镜像的稳定性和可靠性。 - 容器层删除文件时,文件本体会被删除吗?⭐⭐⭐⭐
不会
当容器层中的文件被删除时,文件本体不会被删除,因为容器层是一个可写层,它是在只读的镜像层之上创建的一个可写层,容器层中的所有修改都将保存在这个可写层中,而镜像层则保持不变。因此,当容器中的文件被删除时,实际上是删除了容器层中的文件记录,而不是删除了镜像层中的文件本体。 - centos 镜像几个G,但是 docker centos 镜像才几百M,这是为什么?⭐⭐⭐⭐
这是因为 CentOS 镜像是完整的操作系统镜像,包含了所有的软件包和文件,而 Docker 镜像则是基于操作系统的一层层的增量更新,每一层都只包含一个或几个操作,可以共用基础镜像,因此其大小较小。 - 说说容器 Copy-on-Write(COW) 特性⭐⭐⭐⭐
容器 Copy-on-Write (COW) 特性是 Docker 中非常重要的一个特性。
它的作用是让容器创建时尽可能地复用镜像层,从而节省存储空间并提高容器的创建速度。
当一个容器启动时,Docker 会创建一个容器层作为容器的可写层,并将该容器层与镜像层进行联合挂载。在容器运行时,所有的写操作都会被记录到容器层中,而不会对镜像层进行任何修改。因此,如果多个容器都使用同一个镜像,它们会共享相同的镜像层,而容器层则会针对每个容器单独记录写入操作。这种方式可以避免重复复制相同的数据,从而提高存储效率,并且能够更快地启动新的容器。
当容器层中的文件被修改时,Docker 会使用 Copy-on-Write (COW) 技术来创建新的文件副本,而不是在原始镜像层上直接修改文件。这意味着对文件的修改不会影响其他容器或镜像的使用,同时也能够更好地支持多个容器同时使用同一个镜像的场景。 - Dockerfile 常用命令⭐⭐⭐
FROM:指定基础镜像,格式为 FROM image:tag。
RUN:在容器中执行命令,格式为 RUN command。
COPY:将本地文件或目录复制到容器中,格式为 COPY source destination。
ADD:将本地文件或目录复制到容器中,并支持从URL或tar归档文件中提取文件,格式为 ADD source destination。
WORKDIR:设置工作目录,格式为 WORKDIR path。
ENV:设置环境变量,格式为 ENV key=value。
EXPOSE:指定容器暴露的端口,格式为 EXPOSE port。
CMD:指定容器启动时的默认命令和参数,格式为 CMD command。
ENTRYPOINT:指定容器启动时要运行的可执行文件或脚本,格式为 ENTRYPOINT command。 - 说说 Docker Compose 的作用⭐⭐⭐
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许用户在一个 YAML 文件中定义多个容器以及它们之间的关系和依赖关系,以便一次性启动、停止和重建整个应用程序。Docker Compose 的作用如下:
1简化应用程序的部署:使用 Docker Compose 可以轻松地将多个容器打包在一起,构建出一个完整的应用程序,简化了部署和管理的工作。
2定义容器间的关系:在 Docker Compose 文件中,可以定义多个容器之间的关系,如依赖关系、网络连接、数据卷挂载等,使得应用程序的配置更加灵活。
3避免手动配置:使用 Docker Compose 可以避免手动配置各个容器之间的关系和依赖,减少出错的机会。
4快速构建和部署:使用 Docker Compose 可以快速构建和部署整个应用程序,从而缩短了开发和测试的周期。
5提高可移植性:使用 Docker Compose 可以在不同的环境中部署应用程序,提高了应用程序的可移植性,也方便了开发人员在不同的开发环境中工作。 - 简单描述一下 Dockerfile 的整个构建镜像过程⭐⭐⭐
Dockerfile 是一个文本文件,其中包含了一系列用于构建 Docker 镜像的指令,通过执行 docker build 命令,Docker 会按照 Dockerfile 中的指令逐层构建镜像。整个构建镜像的过程可以简单地分为以下几个步骤:
1 创建一个新的临时容器:Docker 会基于指定的基础镜像启动一个新的容器。
2 执行 Dockerfile 中的指令:Docker 会依次执行 Dockerfile 中的指令,每个指令都会在当前的容器中创建一个新的临时镜像层。
3 对比并提交镜像层:在每个指令执行完成后,Docker 会将当前容器与上一层镜像进行比较,将容器中的差异部分提交为一个新的镜像层。
4 重复执行步骤 2 和 3,直到所有指令都执行完成。
5 生成最终镜像:当 Dockerfile 中的所有指令都执行完成后,Docker 会将最终生成的镜像层打包为一个完整的镜像,并将其保存到本地的镜像仓库中。 - Docker——网络和存储
None网络:容器没有网络连接,适用于一些特殊的场景,如容器只需要本地访问或者与其他容器通过共享数据卷进行通信。
Container网络:与另一个运行中的容器共享Network Namespace。
Host网络:使用宿主机的网络栈直接暴露容器的端口,容器和宿主机共享同一个IP地址,容器的网络性能会比较好,但会受到宿主机网络性能的限制。
Bridge网络:这是Docker默认使用的网络类型,它会在Docker宿主机上创建一个虚拟的网络桥接器,用于连接所有容器。
Macvlan网络:用于将容器连接到物理网络,每个容器都有一个唯一的MAC地址,可以直接通过宿主机网络与物理网络进行通信。
Overlay Network 基于 VXLAN 技术实现,它将不同主机上的容器连接到一个虚拟网络中,使得这些容器可以相互通信和协同工作。
- 说说 Host 网络,优缺点是什么⭐⭐⭐
Host 网络是 Docker 支持的一种网络模式,它可以让容器直接使用宿主机的网络栈,从而避免了网络地址转换 (NAT) 的开销和性能损失。
Host 网络的优点包括:
1 性能更好:由于容器直接使用宿主机的网络栈,因此无需进行端口映射和数据包转发,网络性能更好,延迟更低。
2 网络隔离更弱:容器与宿主机共享网络栈,因此它们之间的网络隔离更弱,容器可以直接访问宿主机上的网络和端口。
Host 网络的缺点包括:
安全性较差:容器与宿主机共享网络栈,容器之间的网络隔离更弱,因此容器之间的网络攻击风险更高。
可扩展性较差:Host 网络模式不支持容器的自动扩展,因为每个容器都需要占用宿主机的端口资源,因此会对宿主机造成一定的负载压力
- 说说 Bridge 网络,优缺点是什么⭐⭐⭐
Bridge 网络是 Docker 中最常用的网络模式之一,它将 Docker 容器连接到一个 Docker 管理的虚拟网络中。每个容器可以分配一个 IP 地址,并且可以通过容器名称进行相互访问。Bridge 网络在 Docker 中是默认的网络模式。
Bridge 网络的优点包括:
1安全性好:Bridge 网络可以隔离容器之间的网络,保证容器之间的通信不会受到其他容器的干扰。每个容器可以分配一个独立的 IP 地址,从而保证容器之间的网络隔离。
2管理和扩展性好:Bridge 网络模式支持容器的自动扩展和负载均衡,可以将容器部署在不同的主机上,并通过 Docker Swarm 进行管理和控制。同时,Bridge 网络还支持自定义网络配置和插件,可以根据实际需求进行灵活的网络管理和扩展。
3易于使用:Bridge 网络是 Docker 的默认网络模式,可以直接使用 Docker 命令进行创建和管理。容器之间可以通过容器名称进行访问,无需进行端口映射和地址转换。
Bridge 网络的缺点包括:
性能略差:Bridge 网络需要进行端口映射和地址转换,会对网络性能产生一定的影响。在高并发、大流量的应用场景下,可能会影响应用程序的性能。
容器之间的网络隔离性相对 Host 网络较好。
Docker 网络类型中安全性最高的⭐⭐
None网络:容器没有网络连接,安全性最高。但是不实用Docker 如何保证容器数据持久化⭐⭐⭐
Docker 提供了以下几种方式:
1 数据卷(Volume):数据卷是 Docker 中最常用的数据持久化方式之一。数据卷是一个可独立于容器之外存在的目录(独立存储卷),可以将数据卷挂载到容器中,从而使容器能够访问该目录中的数据。数据卷通常存储在主机上的文件系统中,因此即使容器被删除或重新创建,数据卷中的数据仍然可以保留。
2 Docker 卷插件(Volume Plugin):Docker 卷插件是一种扩展 Docker 存储功能的方式,可以通过插件机制,将 Docker 卷连接到外部存储系统,如云存储、分布式文件系统等Docker——容器深入理解
说说你对容器实现原理的理解⭐⭐⭐
容器其实是一种特殊的进程,不过这个进程实现了隔离和资源限制。
而容器技术的实现原理在于通过限制和调整进程的动态表现,为其创建一个明确的“边界”。在 Docker 等大多数 Linux 容器中,Cgroups 技术是制造限制的主要手段,而 Namespace 技术则是调整进程视图的主要方式。
Linux 操作系统提供了 PID、Mount、UTS、IPC、Network 和 User 这些 Namespace,用来对各种不同的进程上下文进行隔离操作。
又提供了Linux Cgroups(Linux Control Group) 用来为进程设置资源限制。其主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
通过 Linux 的这两种技术,就实现了普通进程的隔离与资源限制,这就是容器的本质。说说 Linux Namespace技术⭐⭐⭐
Linux Namespace 是 Linux 内核提供的一种机制,用于将系统资源隔离到不同的命名空间中,每个命名空间都拥有独立的资源视图。这种隔离机制使得不同进程可以在相同的系统上独立运行,不会相互影响。
Linux 操作系统提供了 PID、Mount、UTS、IPC、Network 和 User 这些 Namespace,用来对各种不同的进程上下文进行隔离操作。
比如 Linux 使用 clone() 系统调用创建一个新进程时,就可以在参数中指定 CLONE_NEWPID 参数,这样创建的进程就处于一个新的 PID Namespace。说说 Linux Cgroups 技术⭐⭐⭐
Linux Cgroups(Control groups)是一种内核级别的机制,用于限制和管理进程、任务或者用户组的系统资源使用。Cgroups 可以在不同的层次结构中对系统资源进行分类,每个分类可以设置自己的资源限制、优先级和控制策略。其主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
在 /sys/fs/cgroup 目录下,有许多名为 cpuset、cpu 和 memory 的子目录,这些目录被称为子系统,表示可由 Cgroups 限制的资源种类。比如我们可以在这些子系统中创建新目录,目录下自动生成该子系统对应的资源限制文件,通过配置这些文件,我们就可以实现资源配置了。Docker——Containerd
说说容器运行时⭐⭐⭐
容器运行时是一种用于管理和运行容器的软件工具。它负责解析容器镜像、创建和管理容器的生命周期、以及与底层操作系统进行交互等任务。
容器运行时通常与容器编排工具(例如 Kubernetes)一起使用,以提供一种可伸缩、可靠和高效的容器化解决方案。容器运行时可以支持多种容器格式和操作系统,例如 Docker、rkt、CRI-O、Kata Containers 等。Containerd 常用命令⭐⭐⭐
ctr image pull <image>:拉取指定的镜像
ctr image ls:列出本地所有镜像
ctr image rm <image>:删除本地的指定镜像
ctr container create <container>:创建一个容器
ctr container start <container>:启动指定容器
ctr container ls:列出所有正在运行的容器
ctr container stop <container>:停止指定容器
ctr container rm <container>:删除指定容器
ctr tasks ls:列出所有正在运行的任务Containerd 和 Docker 的区别⭐⭐⭐
定位不同:Docker 早期被认为是一种容器技术,而现在已经发展成为一个生态系统,提供了包括构建、发布、部署、运行和管理容器的一系列工具和服务;而 Containerd 则更专注于容器运行时,它是一个轻量的容器运行时,为 Kubernetes 等容器编排工具提供了底层支持。
架构不同:Docker 是一个完整的容器解决方案,它包括 Docker 引擎、Docker Registry 和 Docker Compose 等多个组件;而 Containerd 则是一个容器运行时,它可以通过 gRPC API 与外部系统交互,并通过不同的插件(如 runc)提供容器运行时服务。
功能不同:Docker 提供了丰富的功能,如构建镜像、发布镜像、容器编排等等;而 Containerd 只提供了容器的运行时服务,例如容器的生命周期管理、容器文件系统挂载等