【面试题-015】DockerFile中CMD和ENTRYPOINT指令有什么区别

作者 : admin 本文共3559个字,预计阅读时间需要9分钟 发布时间: 2024-06-9 共4人阅读

文章目录

  • DockerFile中CMD和ENTRYPOINT指令有什么区别
  • docker容器是怎么实现的
  • docker的联合文件系统是什么 简单说下
  • docker如何实现网络通信

DockerFile中CMD和ENTRYPOINT指令有什么区别

在Docker中,CMDENTRYPOINT指令都是用来指定容器启动时运行的命令。它们之间的主要区别在于它们的使用方式和覆盖行为。
CMD指令

  • CMD指令用于提供默认的运行命令和参数,这些命令和参数可以在容器启动时被覆盖。
  • 一个Dockerfile中只能有一个CMD指令,如果有多个,则最后一个CMD会生效。
  • CMD的两种形式:
    • CMD ["executable", "param1", "param2"] (执行形式,推荐方式)
    • CMD command param1 param2 (shell形式)
      ENTRYPOINT指令
  • ENTRYPOINT指令用于配置容器启动后执行的命令,这个命令通常不会被覆盖,而是作为容器启动时的“入口点”。
  • 一个Dockerfile中只能有一个ENTRYPOINT指令,如果有多个,则最后一个ENTRYPOINT会生效。
  • ENTRYPOINT的两种形式:
    • ENTRYPOINT ["executable", "param1", "param2"] (执行形式,推荐方式)
    • ENTRYPOINT command param1 param2 (shell形式)
      组合使用
      CMDENTRYPOINT可以组合使用,这样可以将ENTRYPOINT设置为固定的启动命令,而将CMD设置为可变的默认参数。当容器启动时,最后指定的CMD参数会作为ENTRYPOINT命令的参数。
      例如,一个Dockerfile可能包含以下内容:
FROM ubuntu
ENTRYPOINT ["/bin/ping"]
CMD ["localhost"]

在这个例子中,容器启动时默认会执行/bin/ping localhost。但是,如果运行容器时指定了其他参数,比如:

docker run myimage google.com

那么容器将执行/bin/ping google.com,覆盖了默认的CMD参数。
总结来说,CMD提供了容器启动时的默认命令和参数,而ENTRYPOINT定义了容器的启动入口点。在实际使用中,可以根据需要选择单独使用CMDENTRYPOINT或者将它们组合使用。

docker容器是怎么实现的

Docker容器是通过以下几个核心技术实现的:

  1. 命名空间(Namespaces)
    • Docker使用Linux内核的命名空间特性来隔离容器中的进程、网络、文件系统、用户ID等资源。每个容器都在自己的命名空间中运行,这样就可以保证容器之间的资源互不干扰。
  2. 控制组(Control Groups, cgroups)
    • 控制组用于限制和隔离容器使用的资源,如CPU、内存、磁盘I/O等。通过cgroups,可以确保每个容器只能使用分配给它的资源,从而防止某个容器消耗掉所有的系统资源。
  3. 联合文件系统(Union File Systems)
    • Docker使用联合文件系统(UnionFS)来构建容器的文件系统。最常用的UnionFS是OverlayFS和AUFS。联合文件系统允许将多个目录层叠在一起,形成单个文件系统,这样就可以实现容器的轻量级和快速部署。
  4. 容器镜像(Container Images)
    • Docker容器是通过容器镜像来创建的。容器镜像是静态的文件系统视图,包含了运行应用所需的所有文件和库。Docker镜像是由多层文件系统叠加而成的,每一层对应一个Dockerfile中的指令。
  5. 运行时(Runtime)
    • Docker的运行时负责容器的生命周期管理,包括创建、运行、暂停、重启和销毁容器等操作。Docker最初使用LXC作为默认运行时,后来开发了libcontainer,现在默认使用的是runC,它是一个轻量级的容器运行时。
  6. 网络隔离
    • Docker通过虚拟网络设备(如veth pairs)和网络命名空间来为容器提供隔离的网络环境。Docker还提供了网络驱动,如bridge、host、overlay等,以支持不同的网络模式。
  7. 存储卷(Volumes)
    • Docker允许将宿主机的文件系统中的目录或文件挂载到容器中,这种挂载点称为存储卷。存储卷可以用于持久化数据,即使容器被删除,存储卷中的数据仍然保留。
      通过这些技术的结合使用,Docker为开发者提供了一种轻量级、可移植和隔离的容器化应用部署方案。Docker容器可以在任何支持Docker的操作系统上运行,极大地简化了应用部署和运维工作。

docker的联合文件系统是什么 简单说下

联合文件系统(Union File Systems)是一种分层、轻量级并且高性能的文件系统,它允许将多个目录(称为“层”)透明地叠加在一起,形成一个单一的文件系统。在Docker中,联合文件系统用于构建容器镜像和容器的文件系统。
联合文件系统的主要特点和用途如下:

  1. 分层结构
    • 联合文件系统将文件系统分为多个层,每层都是只读的。当需要修改文件系统时,会在最顶层添加一个可写的层。这种分层结构使得文件系统的修改非常高效,因为只需要修改最顶层的可写层,不需要修改下层的只读层。
  2. 写时复制(Copy-on-Write)
    • 当需要修改一个文件时,联合文件系统会使用写时复制机制。这意味着如果下层有一个只读的文件需要修改,系统会在可写层创建一个新文件的副本,修改发生在可写层的副本上,而不是原始的只读文件。这样,原始的只读层保持不变,可以用于其他容器共享。
  3. 高效存储和传输
    • 由于联合文件系统的分层和写时复制特性,容器镜像的存储和传输非常高效。多个容器可以共享相同的底层镜像层,只有在最顶层的可写层才包含容器特定的数据。这样可以减少磁盘空间的占用,并且加快镜像的下载和分发速度。
  4. 快速部署和回滚
    • 联合文件系统使得容器的创建和销毁非常快速,因为只需要创建或删除最顶层的可写层。同样,如果需要回滚到之前的文件系统状态,只需要删除最顶层的可写层即可。
  5. 构建和定制
    • 在Docker中,联合文件系统允许开发者通过Dockerfile中的指令来构建和定制容器镜像。每个Dockerfile指令都会在镜像中添加一个新的层,这样就可以构建出包含应用程序所需所有依赖和配置的镜像。
      Docker最初使用AUFS(Another Union File System)作为其联合文件系统,但随着Docker的发展,它支持了多种联合文件系统 backend,包括OverlayFS、Device Mapper、Btrfs、VFS和ZFS。这些联合文件系统 backend 都提供了类似的分层和写时复制特性,但是性能和稳定性可能因系统而异。

docker如何实现网络通信

Docker 实现网络通信主要通过以下几个组件和机制:

  1. 网络命名空间
    • Docker 使用 Linux 内核的网络命名空间功能来为每个容器提供隔离的网络环境。每个容器都有自己的网络命名空间,其中包括自己的网络设备、IP 地址、端口号等。
  2. 虚拟网络设备
    • Docker 使用虚拟网络设备(如 veth pairs)来连接容器的网络命名空间和宿主机的网络命名空间。veth pairs 的两端分别连接到宿主机的网络命名空间和容器的网络命名空间,从而实现容器与宿主机之间的网络通信。
  3. Docker 网络
    • Docker 提供了多种网络模式,包括 bridge、host、container、none 和自定义网络。默认情况下,容器会连接到 Docker 创建的 bridge 网络,该网络是一个虚拟网络桥接设备,允许容器之间以及容器与宿主机之间进行通信。
  4. IP 地址分配
    • 当容器加入 Docker 网络(如 bridge 网络)时,Docker 会为容器分配一个 IP 地址。Docker 使用 IP 地址管理(IPAM)来管理 IP 地址的分配。
  5. 端口映射
    • Docker 允许将容器的端口映射到宿主机的端口。这样,外部网络可以通过宿主机的端口来访问容器内部的服务。
  6. 容器互联
    • Docker 允许容器通过容器名或者 Docker networks 来相互连接和通信。当容器加入同一个 Docker 网络时,它们可以通过对方的容器名来直接通信,无需通过端口映射。
  7. DNS 解析
    • Docker 为容器提供了内置的 DNS 服务器,用于解析容器名到对应的 IP 地址。这样,容器可以通过名字来相互通信,而不需要知道对方的 IP 地址。
  8. 网络驱动
    • Docker 支持多种网络驱动,如 bridge、overlay、macvlan 等。这些网络驱动允许 Docker 在不同的网络环境下运行,支持跨主机通信和复杂的网络拓扑。
      通过这些组件和机制,Docker 能够为容器提供灵活、可配置和隔离的网络环境,使得容器化应用能够方便地进行网络通信,同时保持容器之间的网络隔离。
本站无任何商业行为
个人在线分享 » 【面试题-015】DockerFile中CMD和ENTRYPOINT指令有什么区别
E-->