docker介绍

蹉跎莫遣韶光老,人生唯有读书好。这篇文章主要讲述docker介绍相关的知识,希望能为你提供帮助。
?1.容器?
生活中容器的理解:一种工具,可以装下其他物品的工具,方便人类归纳放置物品,存储和异地传输。比如:行李箱,背包。
容器技术:是继虚拟化,云计算,大数据之后的一门新兴的技术。
具有的优势:

1. 提高硬件资源的利用率
2. 方便企业业务快速的横向扩容
3. 业务宕机自愈功能

容器技术最早出现在freebsd叫做jail
2.?Docker?
Docker是一个在2013年开源的应用程序,基于go语言编写的一个开源pass服务(platform as a service平台即服务)。

1.docker是基于linux内核实现
2.docker 最早采用lxc(linux container)技术
lxc:linux原生支持的容器技术,可以提供轻量级的虚拟化
3.docker:基于lxc发展起来的,提供lxc的高级封装,发展标准的配置方法
4.虚拟化技术kvm:基于模块实现
5.docker:runc技术运行容器

?Docker相比虚拟机?
1. 资源利用率更高
2. 开销更小:不需要启动单独的虚拟机占用硬件资源
3. 启动速度更快
4. docker采用客户端/服务端架构,使用远程api来管理和创建docker容器


虚拟机是为了服务运行环境隔离,每个虚拟机都有独立的内核
虚拟化可实现不同操作系统的虚拟机,但通常一个虚拟机只运行一个服务,从而使得资源利用率低

?docker三大理念?
1.build(创建)
2.ship (运输)
3.run(运行)

docker遵从apache2.0协议,通过?namespace及cgroup?等,来提供容器的资源隔离与安全保障等
docker是一种用了新颖方式,实现的轻量级虚拟机
?docker的专业叫法是应用容器?
?Docker的组成?
??https://docs.docker.com/get-started/overview/??
1. 主机:一个物理机或虚拟机,用于运行docker服务进程和容器
2. 服务端:docker守护进程,运行docker容器
3. 客户端:客户端使用docker命令或其他工具调用docker api
4. 仓库:保存镜像的仓库
5. 镜像:可理解为创建实例使用的模板
6. 容器:从镜像生成对外提供服务的一个或一组服务

??官方仓库:https://hub.docker.com/??

?容器需要解决的问题?

?linux namespace   技术?
namespace是linux系统的底层概念,在内核层实现
各docker容器运行在同一个docker主进程并且共用宿主机系统内核
各docker容器运行在宿主机的用户空间
容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响

容器运行空间的相互隔离通过以下实现

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


#2.IPC Namespace
一个容器内的进程间通信,允许一个容器内的不同进程的(内存、缓存等)数据访问,但是不能跨容器访问其他容器的数据


#3.UTS Namespace
包含了运行内核的名称,版本,底层体系结构类型等信息;其中包含hostname和domainname
用于系统标识
容器有自己的hostname,这个主机名标识独立于宿主机系统和其上的其他容器


#4.PID Namespace
linux系统中,有一个Pid为1的进程(init/systemd)
多个容器的进程通过pid namespace进程隔离(比如:pid编号重复,器内的主进程生成与回收子进程等)

#了解宿主机与容器pid的关系
dockerd(5064)
--docker-proxy(5487)进程--负责容器访问,

containerd(5061)
--containerd-shim(5492) 某个容器的pid信息
--nginx(5510)[1]
--nginx[6]
--sh(27574)
容器里面有单独为pid为1的进程


#5.Net Namespace
每个容器都有自己的网卡,监听端口,tcp/ip协议栈等
docker 使用net namespace 启动一个vethX接口,容器将拥有自己的桥接ip,通常是docker0
docker0是linux的虚拟网桥
网桥是osi七层模型的数据链路层的网络设备,通过mac地址对网络进行划分,并且在不同网络直接传递数据。

brctl show #查看桥接设备
docker exec -it id sh
iptables -t nat -vnL
源地址转换,让容器通过宿主机地址访问外网
目标地址转换,以实现从外宿主机访问容器




#6.User Namespace
User Namespace 允许各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID

?linux control groups?
?在一个容器内,如果不对其做任何资源限制,则宿主机允许其占用无限大内存空间?
linux Cgroups 全称是linux control groups
主要作用是:限制一个进程组能够使用的资源上限,包括:cpu 内存,磁盘,网络带宽等
对进程优先级设置
将进程挂起和恢复等

cgroups 在内核层默认已经开启
#centos
cat /boot/config-3.10.0-957.el7.x86_64 |grep CGROUP
#ubuntu
cat /boot/config-4.15.0-20-generic |grep CGROUP


#cgroups 具体实现:
blkio块设备IO限制。
cpu使用调度程序为cgroup任务提供cpu的访问。
cpuacct产生cgroup任务的cpu资源报告。
cpuset如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。

devices允许或拒绝cgroup任务对设备的访问。
freezer暂停和恢复cgroup任务。
memory设置每个cgroup的内存限制以及产生内存资源报告。
net_cls标记每个网络包以供cgroup方便使用。
ns命名空间子系统。
perf_event 增加了对每group的监测跟踪的能力,可以监测属于某个特定的group的所有线程以及运行在特定CPU上的线程。

#查看系统cgroups
ll /sys/fs/cgroup/

?3.?容器管理工具??
?目前主要是使用docker,早期有使用lxc?
?lxc?
官方网站:??https://linuxcontainers.org/??
lxc(linux container):可以提供轻量级的虚拟化,以便隔离进程和资源

#ubuntu安装lxc
apt install lxc lxd

#检查内核对lcx的支持,必须全为lcx
lxc-checkconfig

lxc-create -t 模板文件 -n lcx-test
lxc-create -t download --name alpine12 -- --dist alpine --release 3.9 --arch amd64

lxc-start alpine12#启动lxc容器
lxc-attach alpine12#进入容器

#命令备注
-t 模板-t 选项后面跟的是模板,模板可以认为是一个原型,用来说明我们需要一个什么样的容器(比如容器里面需不需要有vim, apache等软件)
模板实际上就是一个脚本文件(位于/usr/share/lxc/templates目录),我们这里指定download模板
(lxc-create会调用lxc-download脚本,该脚本位于刚说的模板目录中) 是说明我们目前没有自己模板,
需要下载官方的模板
--name容器名称:为创建的容器命名
----用来说明后面的参数是传递给download脚本的,告诉脚本需要下载什么样的模板
--dist操作系统名称:指定操作系统
--release操作系统:指定操作系统,可以是各种Linux的变种
--arch架构:指定架构,是x86还是arm,是32位还是64位

#lxc启动容器依赖于模板
清华模板源:https://mirrors.tuna.tsinghua.edu.cn/help/lxc-images/

做模板:需要手动一步步构建文件系统,准备基础目录及可执行程序,做模板相对较难,
而且大规模使用容器的场景很难横向扩展,另外后期代码升级也需要重新从头构建模板--所以后期选用docker

?docker?
docker,可以在镜像基础之上做自定义配置,并且可以再把其提交为一个镜像
一个镜像可以被启动为多个容器

docker镜像是分层的
底层:库文件(只读)--不能写也不能删除
镜像--启动为容器会生成一个可写层,写入数据复制到容器目录;容器内的数据在删除容器后也会被删除

#docker优势
快速部署:短时间内可以部署成百上千个应用,更快速交付到线上
高效虚拟化:不需要额外的hypervisor支持,直接基于linux实现应用虚拟化,相比虚拟机大幅提高性能和效率
节省开支
简化配置
快速迁移和扩展:可跨平台运行在物理机,虚拟机,公有云等环境,良好的兼容性可以方便的将应用从A宿主机迁移到
B宿主机,甚至是A平台迁移到B平台

#docker缺点
隔离不如虚拟机彻底


pouch
【docker介绍】??https://www.infoq.cn/article/alibaba-pouch??
??https://github.com/alibaba/pouch??
?容器规范?
docker的docker
coreos的rkt
ali的pouch
open container(OCI) :目的是制订开放的标准的容器规范
目前oci,一共发布了两个规范,分别是:runtime spec 和image format spec
只要兼容规范,就可以保证容器的可移植性和相互可操作性

?runtime?
#runtime 是真正运行容器的地方,runtime需要和操作系统内核紧密合作,相互支持,以便为容器提供相应的运行环境
目前主流runtime
lxc: linux 上早期的runtime,docker早期就是采用lxc作为runtime
runc:目前docker默认runtime
rkt: coreos开发的runtime

?管理工具?
管理工具连接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开发的容器编排引擎
kubernets#google领导开发的容器编排引擎,内部项目为borg,且其同时支持docker和coreos
mesos(资源分配)+marathon(容器编排平台) ---#通用的集群组员调度平台


?docker的依赖技术?
#容器网络
docker自带的网络 docker network仅支持管理单机上的容器网络, 当多主机运行的时候需要使用第三方开源网络,
例如 calico、flannel等

#服务发现
容器的动态扩容特性决定了容器ip也会随之变化,因此需要有一种机制开源自动识别并将用户请求动态转发到新创建的容器上
kubernetes自带服务发现功能,需要结合kube-dns服务解析内部域名

#容器监控
docker ps/stop/stats #查看容器运行状态
heapster/Prometheus#第三方监控工具监控容器的运行状态

#数据管理
容器的动态迁移会导致其在不同的host之间迁移
逻辑卷/存储挂载等方式解决容器迁移,数据也随之迁移

#日志收集
日志查看工具:docker logs
容器内部的日志需要通过ELK等专门的日志收集分析和展示工具进行处理


    推荐阅读