什么是Docker?

虽然你单身,但是你胖若两人。

 

什么是Docker?

Docker 是一个流行的用 Go 语言开发的开源项目,由 Dotcloud 公司开发。

Docker 基本上就是一个容器引擎,它使用 Linux 内核功能(如命名空间和控制组)在操作系统之上创建容器。

这就意味着,Docker 可以十分轻易地完成我们在 LXC 部分中所学到的所有有关容器的概念和功能 。只需执行一些 Docker 命令,我们就可以启动和运行一个容器。

 

Docker 与 Linux 容器 (LXC) 又有什么不同呢?毕竟两者的概念和实现看起来是那么的相似

Docker 最初是构建在 Linux 容器 (LXC) 之上的,但后来 Docker 用自己的容器运行时 libcontainer(现在是runc 的一部分)替换了 LXC。

此外,除了作为一种容器技术之外,Docker 还具有定义明确的包装器组件,这使打包应用程序变得十分容易。要知道,在 Docker 出现之前,运行容器并不是一件容易的事。所有的这一切意味着,Docker 通过将所有应用程序系统的需求打包到容器中,完成了将应用程序与基础设施分离的所有工作。

 

Docker与容器的区别

Docker 是一种为高效管理容器而开发的一种技术或工具。

我可以在没有 Docker 的情况下运行容器吗?

  当然可以。我们可以使用 LXC 技术在 Linux 服务器上运行容器。

 

关于Docker,我们应该了解一些知识

  • Docker 不是 LXC
  • Docker 不是虚拟机解决方案。
  • Docker 不是配置管理系统,也不是chef, puppet, Ansible 等工具的替代品。
  • Docker 不是一种平台即服务的技术。

 

Docker 为什么如此优秀?

  Docker 有一个高效的工作流程,可以将应用程序从开发环境转移到测试环境、再转移到生产环境。当我们在实际完成将应用程序打包到 Docker 映像的一个操作时,会对它有更深的了解。

  启动 docker 容器非常快速,只需不到一秒钟,而且 Docker 可以在任何具有兼容 Linux 内核的主机上运行。(也支持 Windows)

  Docker 使用写时复制联合文件系统( Copy-on-write union file system )来存储图像。每当对容器进行更改时,只会使用写时复制模型将更改写入磁盘。使用写时复制,我们优化了所有容器的共享存储层。

 

Docker核心架构

Docker 架构自诞生以来已经发生了几次变化,以下是 Docker 的一些显著的架构变化:

  • Docker 于 2014 年从 LXC 迁移到了 libcontainer。
  • runc – 用于启动遵循所有 OCI 规范的容器的 CLI。
  • containerd – Docker 在 2016 年将其容器管理组件分离到 containerd。

注:OCI:Open Container Initiative是容器运行时和规范的开放行业标准。

 

组成部分

  • Docker 引擎 (dockerd) - Docker 引擎由 docker daemon、API 接口和 Docker CLI 组成,现在让我们分来别看看每个 Docker 组件。
  • docker-containerd (containerd)
  • docker-runc (runc)

示意图

Docker引擎

Docker daemon (dockerd) 作为 dockerd systemd 服务持续运行,它负责构建 docker 镜像。
dockerd 调用 docker-containerd 接口,来管理图像和运行容器。

 

docker-containerd (containerd)

containerd 是另一个系统 daemon 程序服务,它负责下载 docker 镜像并将它们作为容器运行。
containerd 通过公开 API 来接收来自 dockerd 服务的指令。

 

docker-runc

runc 是容器运行时,负责创建容器所需的命名空间和 cgroup,然后在这些命名空间内运行容器命令。
runc 运行时是按照 OCI 规范实现的。

 

Docker是如何工作的

我们已经了解到了 Docker 的核心组件,但是如果要构建、发送、共享和运行 docker 容器,就还需要其他的组件。
接下来,让我们看看 Docker 生态系统中的一些关键的 Docker 组件。

Docker组件

  • Docker 守护进程 (dockerd)
  • Docker 客户端
  • Docker 镜像
  • Docker 注册表
  • Docker 容器

 

Docker守护进程

守护进程通过 CLI 或 REST API 从 Docker 客户端接收命令。Docker 客户端可以与守护进程位于同一主机上,也可以位于任何其他主机上。

在默认情况下,docker 守护进程监听 docker.sock UNIX 套接字。如果有任何远程访问 docker API 的用例,则需要通过主机端口公开它。一个这样的用例我们将 Docker 作为 Jenkins 代理运行。(如果我们想在 docker 中运行 docker,可以使用主机中的 docker.sock )

 

Docker镜像

镜像是 Docker 的基本组成部分,我们需要镜像来运行 Docker 容器。镜像包含操作系统库、依赖项和运行应用程序的工具。

为了创建容器,我们可以用应用程序依赖项,来预先构建镜像。例如,如果要将 Nginx Web 服务器作为一个 Ubuntu 容器来运行,则需要使用 Nginx 二进制文件和运行 Nginx 所需的所有操作系统库,来创建 Docker 镜像。(每个镜像都是从一个基础镜像创建起的)

Docker 有一个用于构建镜像的概念—— Dockerfile 。Dockerfile 基本上就是一个文本文件,每一行包含一个命令(指令)。

Docker 镜像是用分层的方式来组织的。Dockerfile 上的每条指令都会在镜像中添加一个图层。镜像最顶层的可写层是容器。

 

Docker注册表

Docker 注册表是 Docker 镜像的存储库。使用 Docker 注册表,我们可以共享镜像。Docker 注册表充当了 Docker 镜像的中央存储库。

注册中心可以是公共的,也可以是私有的。Docker Inc 提供了一项称为 Docker Hub 的托管注册表服务。它允许用户从一个中心位置上传和下载镜像。

注释:默认情况下,当安装 docker 时,除非在 Docker 设置中指定自定义注册表,否则它会从公共的 Docker Hub 中查找镜像。

Docker hub 的作用类似于 git,我们可以在本地构建镜像,然后镜像提交推送到 Docker Docker hub 上。

注释:在企业网络/项目中使用 docker 时,请设置自己的 docker 注册表,而不是使用公共的 docker hub。所有云提供商都有自己的容器注册服务。

 

Docker容器

Docker 容器是 Docker 的执行环境。容器是从镜像创建的,它属于镜像的可写层。

容器可以启动、停止、提交和终止。如果我们在未提交的情况下终止容器,所有的容器更改都将丢失。

 

容器相比较虚拟机的优势

1、资源利用和成本

  • 我们可以使用虚拟机独立运行应用程序,这里所谓的独立运行是指一台虚拟器运行一个服务。但是虚拟机仍然可能未被充分利用。此外,为应用程序调整虚拟机的大小并不是一件容易的事。
  • 另一方面,容器可以在非常小的 CPU 和内存上运行。此外,您甚至可以在 VM 内运行多个容器以进行应用程序隔离。另外,调整容器大小需要几秒钟。

2、配置和部署

  • 取决于所涉及的工作流,配置虚拟机并在其上部署应用程序可能需要几分钟到几小时的时间,即使回滚也需要时间。
  • 但是我们却可以在几秒钟内部署一个容器,并在几秒钟内将其回滚。

3、漂移管理

  • 虚拟机中的漂移管理并不容易。我们需要拥有成熟的自动化和流程,以确保所有环境都相似。遵循不可变的部署模型可避免虚拟机环境中的漂移。
  • 对于容器,一旦镜像生成,那么它在所有环境中都是一样的。要进行任何更改时,我们需要开始在 dev env 中进行更改并重新生成容器映像。

 

containerd 和 runc 有什么区别?

  containerd 负责管理容器,runc 负责使用来自 containerd 的输入,来运行容器(在容器内创建命名空间、cgroup 和运行命令)

 

Docker 引擎和 Docker 守护进程有什么区别?

  Docker 引擎由 docker 守护进程、rest 接口和 docker CLI 组成。Docker 守护进程是 systemd dockerd 服务,负责构建 docker 镜像,并将 docker 指令发送到 containerd 运行时。

 

posted @ 2022-03-29 08:59  方达达  阅读(11)  评论(0编辑  收藏  举报