type
status
date
slug
summary
tags
category
icon
password
1、Docker是什么
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无须任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
Docker 则是一种容器化技术。Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。
Docker 运用集装箱的思想(仔细观察 Docker 的图标也是集装箱的图标),标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计哲学中,唯一不同的是:集装箱运输货物,而 Docker 运输软件。每个容器都有一个软件镜像,相当于集装箱中的货物。容器可以被创建、启动、关闭和销毁。和集装箱一样,Docker 在执行这些操作时,并不关心容器里到底装的什么,它不管里面是 Web Server,还是 Database。
使用 Docker 的优势是:
- 对于开发人员:Build Once、Run Anywhere。容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。
- 对于运维人员:Configure Once、Run Anything。只需要配置好标准的 runtime 环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效、一致和可重复。容器消除了开发、测试、生产环境的不一致性。
Docker 和虚拟机的区别
谈到容器,就不得不将它与虚拟机进行对比,因为两者都是为应用提供封装和隔离。
- 容器由两部分组成:
- 应用程序本身;
- 依赖:比如应用程序需要的库或其他软件容器在 Host 操作系统的用户空间中运行,与操作系统的其他进程隔离。这一点显著区别于的虚拟机。
- 传统的虚拟化技术,比如VMWare、KVM、Xen,目标是创建完整的虚拟机。为了运行应用,除了部署应用本身及其依赖(通常几十MB),还得安装整个操作系统(几十GB)。
如图所示,由于所有的容器共享同一个 Host OS,这使得容器在体积上要比虚拟机小很多。另外,启动容器不需要启动整个操作系统,所以容器部署和启动速度更快、开销更小,也更容易迁移。
2、Docker架构
Docker的核心组件包括:
- Docker客户端:Client
- Docker服务器:Docker daemon
- Docker镜像:Image
- Registry
- Docker容器:Container
他们的交互关系如下图所示:
Docker采用的是Client/Server架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个Host上,客户端也可以通过socket或REST API与远程的服务器通信。如下图所示:
2.1 Docker客户端
Docker命令行(docker CLI) 是与Docker守护进程进行交互的主要工具。通过 docker 命令行我们可以方便地在 Host 上构建和运行容器。
除了 Docker 命令行之外,Docker 守护进程还提供了 REST API 作为客户端。许多工具(Docker命令行,Docker Compose等)都可以通过 REST API 与 Docker 守护进程进行交互,例如创建容器,构建镜像等。
2.2 Docker服务器
Docker daemon是服务器组件,以Linux后台服务的方式运行。目前,它只能运行在 Linux 上,因为它依赖于一些 Linux 内核特性(比如 Cgroup 与 Namespace)。 如果想在 MacOS 与 Windows 上运行 Docker,则只能运行在 Linux 虚拟机中。
Docker daemon 运行在 Docker host 上,负责创建、运行、监控容器,构建、存储镜像。默认配置下,Docker daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听。
2.3 Docker镜像
可将 Docker 镜像看成只读模板,通过它可以创建Docker容器。例如某个镜像可能包含一个 Ubuntu 操作系统、一个 Apache HTTP Server 以及用户开发的 Web 应用。
镜像有多种生成方法:
- 从无到有开始创建镜像;
- 下载并使用别人创建好的现成的镜像;
- 在现有镜像上创建新的镜像。
可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile,通过执行
docker build <docker-file>
命令可以构建出 Docker 镜像。2.4 Docker容器
Docker 容器就是 Docker 镜像的运行实例。
用户可以通过CLI(Docker)或是API启动、停止、移动或删除容器。可以这么认为,对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段。
2.5 Registry
Registry 是存放 Docker 镜像的仓库,Registry 分私有和公有两种。
- Docker Hub(https://hub.docker.com/):是默认的 Registry,由Docker公司维护,上面有数以万计的镜像,用户可以自由下载和使用。Docker Hub 中有两种类型的仓库:
- 顶层仓库(top-leveled repository),由docker公司内部创建,命名只有
repo
,例如redis
。 - 用户仓库(user repository),由docker用户创建,命名为
username/repo
,例如fedora/redis
。
- 出于对速度或安全的考虑,用户也可以创建自己的私有Registry。
Docker Registry 的使用规范:
- 一个 Docker Registry 中可以包含多个仓库(Repository)。
- 一个仓库可以包含多个 Image。
- Image 用 GUID 表示,有一个或多个 Tag 与之关联。
Docker Registry 中镜像的完整命名为:
- DOCKER_REGISTRY:公司统一的 Docker Registry 地址。
- repo:镜像仓库,用来管理一类镜像。
- name:镜像名称。
- tag:镜像标签。
- Author:mcbilla
- URL:http://mcbilla.com/article/a7ace5b2-37c5-415b-86cb-f03a1b94dd0d
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts