docker简介与特点

  • 1.docker简介与特点
  • 1.1什么是容器?
  • 1.2什么是docker?
  • 1.3 Docker 的组成
  • 1.4: Docker 对比虚拟机:
  • 1.5 Linux Namespace 技术:
  • 1.5.1: MNT Namespace:
  • 1.5.2: IPC Namespace:
  • 1.5.3: UTS Namespace:
  • 1.5.4: PID Namespace:
  • 1.5.5: Net Namespace:
  • 1.5.6: User Namespace:
  • 1.6: Linux control groups:资源限制
  • 1.7: 容器管理工具:
  • 1.7.1: docker:
  • 1.7.2: Docker 的优势:
  • 1.7.3:Docker 的缺点:
  • 1.8: docker(容器)的核心技术:
  • 1.9: docker(容器)的依赖技术:


1.docker简介与特点

1.1什么是容器?

统称来说,容器是一种工具, 指的是可以装下其它物品的工具, 以方便人类归
纳放置物品、存储和异地运输, 具体来说比如人类使用的衣柜、行李箱、 背包等
可以成为容器,但今天我们所说的容器是一种 IT 技术。

1.2什么是docker?

首先 Docker 是一个在 2013 年开源的应用程序并且是一个基于 go 语言编写是
一个开源的 PAAS 服务(Platform as a Service, 平台即服务的缩写), go 语言是由google 开发, docker 公司最早叫 dotCloud 后由于 Docker 开源后大受欢迎就将公司改名为 Docker Inc, 总部位于美国加州的旧金山, Docker 是基于 linux 内核实现, Docker 最早采用 LXC 技术(LinuX Container 的简写, LXC 是 Linux 原生支持的容器技术, 可以提供轻量级的虚拟化。

1.3 Docker 的组成

Docker 主机(Host): 一个物理机或虚拟机,用于运行 Docker 服务进程和容器。

Docker 服务端(Server): Docker 守护进程, 运行 docker 容器。

Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用 docker API。

Docker 仓库(Registry): 保存镜像的仓库,类似于 git 或 svn 这样的版本控制系统,官方仓库: https://hub.docker.com/

Docker 镜像(Images): 镜像可以理解为创建实例使用的模板。

Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务。

docker三剑客compose docker3.0 特性_docker三剑客compose

1.4: Docker 对比虚拟机:

资源利用率更高: 一台物理机可以运行数百个容器,但是一般只能运行数十个

虚拟机。

开销更小: 不需要启动单独的虚拟机占用硬件资源。

启动速度更快: 可以在数秒内完成启动。

docker三剑客compose docker3.0 特性_docker_02

docker三剑客compose docker3.0 特性_运行环境_03

但是,如上图一个宿主机运行了 N 个容器, 多个容器带来的以下问题怎么解决:

1.怎么样保证每个容器都有不同的文件系统并且能互不影响?

2.一个 docker 主进程内的各个容器都是其子进程,那么实现同一个主进程下不

同类型的子进程? 各个进程间通信能相互访问(内存数据)吗?

3.每个容器怎么解决 IP 及端口分配的问题?

4.多个容器的主机名能一样吗?

5.每个容器都要不要有 root 用户?怎么解决账户重名问题?

以上问题怎么解决?

1.5 Linux Namespace 技术:

namespace 是 Linux 系统的底层概念, 在内核层实现,即有一些不同类型的命名
空间被部署在核内, 各个 docker 容器运行在同一个 docker 主进程并且共用同一
个宿主机系统内核,各 docker 容器运行在宿主机的用户空间, 每个容器都要有
类似于虚拟机一样的相互隔离的运行空间, 但是容器技术是在一个进程内实现
运行指定服务的运行环境, 并且还可以保护宿主机内核不受其他进程的干扰和
影响, 如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现
容器运行空间的相互隔离:

隔离类型

功能

系统调用参数

内核版本

MNT Namespace(mount)

提供磁盘挂载点和文件系统的隔离能力

CLONE_NEWNS

Linux 2.4.19

IPC Namespace(Inter-Process Communication)

提供进程间通信的隔离能力

CLONE_NEWIPC

Linux 2.6.19

UTS Namespace(UNIX Timesharing System)

提供主机名隔离能力

CLONE_NEWUTS

Linux 2.6.19

PID Namespace(Process Identification)

提供进程隔离能力

CLONE_NEWPID

Linux 2.6.24

Net Namespace(network)

提供网络隔离能力

CLONE_NEWNET

Linux 2.6.29

User Namespace(user)

提供用户隔离能力

CLONE_NEWUSER

Linux 3.8

1.5.1: MNT Namespace:

每个容器都要有独立的根文件系统有独立的用户空间, 以实现在容器里面启动
服务并且使用容器的运行环境,即一个宿主机是 ubuntu 的服务器,可以在里面
启动一个 centos 运行环境的容器并且在容器里面启动一个 Nginx 服务,此 Nginx
运行时使用的运行环境就是 centos 系统目录的运行环境, 但是在容器里面是不
能访问宿主机的资源, 宿主机是使用了 chroot 技术把容器锁定到一个指定的运
行目录里面。
例如: /var/lib/containerd/io.containerd.runtime.v1.linux/moby/容器 ID

1.5.2: IPC Namespace:

一个容器内的进程间通信, 允许一个容器内的不同进程的(内存、 缓存等)数据访
问,但是不能夸容器访问其他容器的数据。

1.5.3: UTS Namespace:

UTS namespace(UNIX Timesharing System 包含了运行内核的名称、版本、底层体系结构类型等信息)用于系统标识, 其中包含了 hostname 和域名domainname , 它使得一个容器拥有属于自己 hostname 标识,这个主机名标识
独立于宿主机系统和其上的其他容器。

1.5.4: PID Namespace:

Linux 系统中,有一个 PID 为 1 的进程(init/systemd)是其他所有进程的父进程, 那么在每个容器内也要有一个父进程来管理其下属的子进程,那么多个容器的进程通 PID namespace 进程隔离(比如 PID 编号重复、 器内的主进程生成与回收子进程等)。

那么宿主机的 PID 究竟与容器内的 PID 是什么关系?

docker三剑客compose docker3.0 特性_运行环境_04

1.5.5: Net Namespace:

每一个容器都类似于虚拟机一样有自己的网卡、 监听端口、 TCP/IP 协议栈等,

Docker 使用 network namespace 启动一个 vethX 接口,这样你的容器将拥有它

自己的桥接 ip 地址,通常是 docker0,而 docker0 实质就是 Linux 的虚拟网桥,网

桥是在 OSI 七层模型的数据链路层的网络设备,通过 mac 地址对网络进行划

分,并且在不同网络直接传递数据。

实逻辑网络图:

docker三剑客compose docker3.0 特性_docker三剑客compose_05

宿主机 iptables 规则:

docker三剑客compose docker3.0 特性_docker三剑客compose_06

docker三剑客compose docker3.0 特性_docker_07

1.5.6: User Namespace:

各个容器内可能会出现重名的用户和用户组名称, 或重复的用户 UID 或者

GID, 那么怎么隔离各个容器内的用户空间呢?

User Namespace 允许在各个宿主机的各个容器空间内创建相同的用户名以及相

同的用户 UID 和 GID, 只是会把用户的作用范围限制在每个容器内,即 A 容器

和 B 容器可以有相同的用户名称和 ID 的账户,但是此用户的有效范围仅是当前

容器内, 不能访问另外一个容器内的文件系统,即相互隔离、互补影响、 永不

相见。

docker三剑客compose docker3.0 特性_运行环境_08

1.6: Linux control groups:资源限制

在一个容器,如果不对其做任何资源限制,则宿主机会允许其占用无限大的内
存空间, 有时候会因为代码 bug 程序会一直申请内存,直到把宿主机内存占
完, 为了避免此类的问题出现, 宿主机有必要对容器进行资源分配限制,比如
CPU、内存等, Linux Cgroups 的全称是 Linux Control Groups, 它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,以及将进程挂起和恢复等操作。

1.7: 容器管理工具:

目前主要是使用 docker, 早期有使用 lxc。

1.7.1: docker:

docker三剑客compose docker3.0 特性_运行环境_09


Docker 启动一个容器也需要一个外部模板但是较多镜像, docke 的镜像可以保

存在一个公共的地方共享使用, 只要把镜像下载下来就可以使用,最主要的是

可以在镜像基础之上做自定义配置并且可以再把其提交为一个镜像,一个镜像

可以被启动为多个容器。

Docker 的镜像是分层的, 镜像底层为库文件且只读层即不能写入也不能删除数

据,从镜像加载启动为一个容器后会生成一个可写层,其写入的数据会复制到

容器目录, 但是容器内的数据在删除容器后也会被随之删除。

docker三剑客compose docker3.0 特性_Docker_10

1.7.2: Docker 的优势:

快速部署: 短时间内可以部署成百上千个应用,更快速交付到线上。
高效虚拟化:不需要额外的 hypervisor 支持,直接基于 linux 实现应用虚拟化,
相比虚拟机大幅提高性能和效率。
节省开支: 提高服务器利用率,降低 IT 支出。
简化配置: 将运行环境打包保存至容器,使用时直接启动即可。
快速迁移和扩展: 可夸平台运行在物理机、虚拟机、公有云等环境, 良好的兼
容性可以方便将应用从 A 宿主机迁移到 B 宿主机, 甚至是 A 平台迁移到 B 平
台。

1.7.3:Docker 的缺点:

隔离性: 各应用之间的隔离不如虚拟机彻底。

1.8: docker(容器)的核心技术:

容器规范:
容器技术除了的 docker 之外,还有 coreOS 的 rkt, 还有阿里的 Pouch, 为了保
证容器生态的标准性和健康可持续发展, 包括 Linux 基金会、 Docker、微软、红
帽谷歌和、 IBM、 等公司在 2015 年 6 月共同成立了一个叫 open container(OCI)的组织,其目的就是制定开放的标准的容器规范,目前 OCI 一共发布了两个规范,分别是 runtime spec 和 image format spec,有了这两个规范, 不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性。
容器 runtime:
runtime 是真正运行容器的地方,因此为了运行不同的容器 runtime 需要和操
作系统内核紧密合作相互在支持,以便为容器提供相应的运行环境。
目前主流的三种 runtime:
Lxc: linux 上早期的 runtime, Docker 早期就是采用 lxc 作为 runtime。
runc:目前 Docker 默认的 runtime, runc 遵守 OCI 规范,因此可以兼容 lxc。
rkt: 是 CoreOS 开发的容器 runtime,也符合 OCI 规范,所以使用 rktruntime 也可以运行 Docker 容器。
容器管理工具:
管理工具连接 runtime 与用户,对用户提供图形或命令方式操作,然后管理工
具将用户操作传递给 runtime 执行。
lxc 是 lxd 的管理工具。
Runc 的管理工具是 docker engine, docker engine 包含后台 deamon 和 cli 两部
分,大家经常提到的 Docker 就是指的 docker engine。
Rkt 的管理工具是 rkt cli。
容器定义工具:
容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存、共享和重建。
Docker image:是 docker 容器的模板, runtime 依据 docker image 创建容器。
Dockerfile:包含 N 个命令的文本文件,通过 dockerfile 创建出 docker image。
ACI(App container image): 与 docker image 类似, 是 CoreOS 开发的 rkt 容器的镜像格式。
Registry:
统一保存镜像而且是多个不同镜像版本的地方, 叫做镜像仓库。
Image registry: docker 官方提供的私有仓库部署工具。
Docker hub: docker 官方的公共仓库, 已经保存了大量的常用镜像,可以方便大
家直接使用。
Harbor: vmware 提供的自带 web 界面自带认证功能的镜像仓库,目前有很多公司使用。

编排工具:
当多个容器在多个主机运行的时候, 单独管理容器是相当复杂而且很容易出错,
而且也无法实现某一台主机宕机后容器自动迁移到其他主机从而实现高可用的
目的, 也无法实现动态伸缩的功能,因此需要有一种工具可以实现统一管理、动
态伸缩、故障自愈、 批量执行等功能, 这就是容器编排引擎。
容器编排通常包括容器管理、调度、集群定义和服务发现等功能。
Docker swarm: docker 开发的容器编排引擎。
Kubernetes: google 领导开发的容器编排引擎,内部项目为 Borg, 且其同时支持docker 和 CoreOS。
Mesos+Marathon: 通用的集群组员调度平台, mesos(资源分配)与 marathon(容器编排平台)一起提供容器编排引擎功能。

1.9: docker(容器)的依赖技术:

容器网络:
docker 自带的网络 docker network 仅支持管理单机上的容器网络, 当多主机运
行的时候需要使用第三方开源网络,例如 calico、 flannel 等。
服务发现:
容器的动态扩容特性决定了容器 IP 也会随之变化, 因此需要有一种机制可以
自动识别并将用户请求动态转发到新创建的容器上, kubernetes 自带服务发现功
能,需要结合 kube-dns 服务解析内部域名。
容器监控:
可以通过原生命令 docker ps/top/stats 查看容器运行状态,另外也可以使
heapster/ Prometheus 等第三方监控工具监控容器的运行状态。
数据管理:
容器的动态迁移会导致其在不同的 Host 之间迁移,因此如何保证与容器相关
的数据也能随之迁移或随时访问,可以使用逻辑卷/存储挂载等方式解决。
日志收集:
docker 原生的日志查看工具 docker logs, 但是容器内部的日志需要通过 ELK 等
专门的日志收集分析和展示工具进行处理。