面试题-Docker

什么是docker

  • Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在开发,测试或生产的任何环境中无缝运行。
  • Docker容器,将一个软件包装在一个完整的文件系统中,该文件系统包含运行所需的一切:代码,运行时,系统工具,系统库等可以安装在服务器上的任何东西。
  • 这可以保证软件始终运行相同,无论其环境如何。

如何使用Docker构建与环境无关的系统?

有三个主要功能有助于实现这一目标:

  • Volumes
  • 环境变量注入
  • 只读文件系统

什么是Docker镜像?

Docker镜像是Docker容器的源代码。换句话说,Docker镜像用于创建容器。使用build命令创建映像,并且在使用run启动时它们将生成容器。镜像存储在Docker注册表http://registry.hub.docker.com中,因为它们可能变得非常大,镜像被设计为由其他镜像层组成,允许在通过网络传输镜像时发送最少量的数据。

什么是Docker容器?

Docker容器包括应用程序及其所有依赖项,但与其他容器共享内核,作为主机操作系统上用户空间中的独立进程运行。Docker容器不依赖于任何特定的基础架构:它们可以在任何计算机,任何基础架构和任何云中运行。

什么是Docker Hub?

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

Docker容器可以有四种状态:

运行
已暂停
重新启动
已退出

解释基本的Docker使用流程

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

Dockerfile中的一些常用指令如下:

  • FROM:我们使用FROM为后续指令设置基本镜像。在每个有效的Dockerfile中,FROM是第一条指令。
  • LABEL:我们使用LABEL按照项目,模块,许可等组织我们的镜像。我们也可以使用LABEL来帮助实现自动化。在LABEL中,我们指定一个键值对,以后可用于以编程方式处理Dockerfile。
  • RUN:我们使用RUN命令在当前镜像之上的新图层中执行任何指令。使用每个RUN命令,我们在镜像顶部添加一些内容,并在Dockerfile的后续步骤中使用它。
  • CMD:我们使用CMD命令提供执行容器的默认值。在Dockerfile中,如果我们包含多个CMD命令,则只使用最后一条指令。

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

一般而言,虽然ADD并且COPY在功能上类似,但是COPY是优选的。

那是因为它比ADD更透明。COPY仅支持将本地文件基本复制到容器中,而ADD具有一些功能(如仅限本地的tar提取和远程URL支持),这些功能并不是很明显。因此,ADD的最佳用途是将本地tar文件自动提取到镜像中,如ADD rootfs.tar.xz /中所示。

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

可以进行以下更改:

  • 删除应用程序代码的任何卷绑定,以便代码保留在容器内,不能从外部更改
  • 绑定到主机上的不同端口
  • 以不同方式设置环境变量(例如,减少日志记录的详细程度,或启用电子邮件发送)
  • 指定重启策略(例如,重启:始终)以避免停​​机
  • 添加额外服务(例如,日志聚合器)
    因此,您可能希望定义一个额外的Compose文件,例如production.yml,它指定适合生产的配置。此配置文件只需要包含您要从原始Compose文件中进行的更改。

为什么Docker Compose不会等待容器准备就绪,然后继续以依赖顺序启动下一个服务?

Compose按照依赖顺服启动和停止容器,决定依赖关系语句有 depends_on, links, volumes_from, 和network_mode: "service:...".

但是,对于启动,Compose不会等到容器“准备好它运行“。这里有一个很好的理由:

  • 等待数据库(例如)准备就绪的问题实际上只是分布式系统更大问题的一个子集。在生产中,您的数据库可能随时变得不可用或移动主机。您的应用程序需要能够适应这些类型的故障。
  • 要处理此问题,请将应用程序设计为在发生故障后尝试重新建立与数据库的连接。如果应用程序重试连接,它最终可以连接到数据库。
  • 最佳解决方案是在启动时以及出于任何原因丢失连接时,在应用程序代码中执行此检查。
全部评论

相关推荐

点赞 5 评论
分享
牛客网
牛客企业服务