Docker是一个容器化平台,它以容器的形式将你的应用程序及所有的依赖项打包在一起,以确保你的应用程序在任何环境中无缝运行。
Docker利用Linux核心中的资源分离机制(例如cgroups)及Linux核心名字空间(namespaces),来创建独立的容器(containers)。
这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。
什么是容器
容器是一种基础工具;泛指可以容纳其他物品的工具。可以部分或者完全封闭,被用于容纳、存储、运输物品;物体可以被放置在容器中,容器可以保护内容物。
人类使用容器的历史,至少有数十万乃至百万年。例如:瓶,罐,箱,篮,桶,杯。
容器技术出现的主要目的是为了"资源隔离"。
容器技术最早出现 FreeBASE jail -----> Linux vserver
chroot -----> 完整的根文件系统(FHS)标准的
namespaces -----> UTS Mount IPC PID user network
cgroup -----> 资源的分配和监控
通过比较复杂的代码开发的过程,调用以上三项技术实现容器的创建 ----> 管理 ---->销毁
容器和虚拟机
开机启动流程:
bios(basic input output system)开机自检
根据bios启动项,读取硬盘第一个扇区
操作系统的引导程序:grub,uefi
选择启动的操作系统:centos7
加载内核,硬件驱动,完成系统的初始化
启动系统第一个进程:/sbin/init(centos6),systemd(centos7)
对比项 | Docker | 对比结果 | 虚拟化 |
---|---|---|---|
快速创建、删除 | 启动应用 | >> | 启动Guest OS + 启动应用 |
交付、部署 | 容器镜像 | == | 虚拟机镜像 |
密度 | 单Node 100~1000 | >> | 单Node 10~100 |
更新管理 | 迭代式更新,修改Dockerfile,对增量内容进行分发,存储、传输、节点启动和恢复迅速 | >> | 向虚拟机推送安装、升级应用软件补丁包 |
稳定性 | 每月更新一个版本 | << | KVM,XEN,VMware都已经很稳定 |
安全性 | Docker具有宿主机root权限 | << | 硬件隔离:Guest OS运行在非根模式 |
监控成熟度 | 还在发展过程中 | << | Host,Hypervisor,VM的监控工具在生产环境已使用多年 |
高可用性 | 通过业务本身的高可用性来保证 | << | 武器库丰富:快照,克隆,HA,动态迁移,异地容灾,异地双活 |
管理平台成熟度 | 以K8S为代表,还在快速发展过程中 | << | 以OpenStack,vCenter,汉柏OPV-Suite为代表,已经在生产环境使用多年 |
什么是docker
Docker是通过内核虚拟化技术(namespaces及cgroups、cpu、内存、磁盘io等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。
docker是一个C/S架构的软件打包器,属于一个进程,封装成一个镜像。
Docker优缺点
Docker优势:启动快,性能高,损耗少,轻量级
快速部署:可以在数秒内完成启动,短时间内可以部署成百上千个应用 ,更快速交付到线上 。
高效虚拟化:不需要额外的hypervisor支持,直接基于linux实现应用虚拟化,相比虚拟机大幅提高性能和效率。开销更小:不需要启动单独的虚拟机占用硬件资源。
节省开支:提高服务器利用率,降低IT支出 。资源利用率更高:一台物理机可以运行数百个容器,但是一般只能运行数十个虚拟机 。
简化配置:将运行环境打包保存至容器,使用时直接启动即可。
快速迁移和扩展:可跨平台运行在物理机、虚拟机、公有云等环境, 良好的兼容性可以方便将应用从A 宿主机迁移到B宿主机甚至是A平台迁移到B平台 。
Docker缺点:
隔离性:各应用之间的隔离不如虚拟机彻底 。
Docker底层技术
namespaces:名称空间(内核3.8版本之后才有,centos6 内核2.6版本)
用来隔离各个容器,可解决容器之间的冲突。
cgroups (Control Group):控制组
控制程序对资源的占用,资源统计,优先级分配,进程控制。
Linux Namespace
Linux Namespace提供了一种内核级别隔离系统资源的方法,通过将系统的全局资源放在不同的Namespace中,来实现资源隔离的目的。不同Namespace的程序,可以享有一份独立的系统资源。目前Linux中提供了六类系统资源的隔离机制,分别是:
Mount: 隔离文件系统挂载点
每个容器都要有独立的根文件系统,有独立的用户空间, 以实现在容器里启动服务,并且使用容器的运行环境。但是在容器里面不能访问宿主机的资源, 宿主机使用 chroot 技术把容器锁定到一个指定的运行目录里面 。例如:/var/lib/containerd/io.containerd.runtime.v1.linux/容器ID
UTS: 隔离主机名和域名信息
UNIX Timesharing System包含了运行内核的名称、版本、底层体系结构类型等信息。用于系统标识,其中包含了hostname和域名domainname,它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的其他容器 。
IPC: 隔离进程间通信
一个容器内的进程间通信允许一个容器内的不同进程的内存、缓存等数据访问,但是不能跨容器访问其他容器的数据 。
PID: 隔离进程的ID
Linux系统中,有一个PID为1的进程 init/systemd是其他所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的子进程,那么多个容器的进程通PID namespace进程隔离(比如PID编号重复、器内的主进程生成与回收子进程等 )。
Network: 隔离网络资源
每一个容器都类似于虚拟机一样有自己的网卡、 监听 端口、TCP /IP 协议栈等。Docker使用network namespace 启动一个vethX接口,这样容器将拥有它自己的桥接ip地址,通常是docker0。而docker0实质就是Linux的虚拟网桥,网桥是在OSI七层模型的数据链路层的网络设备,通过mac地址对网络进行划分,并且在不同网络直接传递数据。
User: 隔离用户和用户组的ID(内核3.8版本)
namespace 系统调用参数 隔离内容 内核版本
UTS CLONE_NEWUTS 主机名和域名 2.6.19
IPC CLONE_NEWIPC 信号量、消息队列和共享内存 2.6.19
PID CLONE_NEWPID 进程编号 2.6.24
Network CLONE_NEWNET 网络设备、网络栈、端口等 2.6.29
Mount CLONE_NEWNS 挂载点(文件系统) 2.4.19
User CLONE_NEWUSER 用户和用户组 3.8
Docker组成
Docker 主机 (Host):一个物理机或虚拟机,用于运行Docker服务进程和容器。
Docker 服务端 (Server): Docker 守护进程, 运行Docker容器。
Docker 客户端 (Client):客户端使用Docker命令或其他工具调用Docker API 。
Docker 仓库 (Registry):保存镜像的仓库,类似于git或svn这样的版本控制系统。
Docker 镜像 (Images):镜像可以理解为创建实例使用的模板。
Docker 容器 (Container ): 容器是从镜像生成对外提供服务的一个或一组服务 。
docker-ce
docker版本发展:
docker-ce 社区版
docker-ee 企业版
docker system
docker system df # 统计docker-ce使用磁盘空间
docker system prune # 清理停止的容器,未使用的网卡,无名的镜像和构建缓存
docker system info # 查看docker-ce信息
docker system even # 查看docker-ce事件
docker container 容器
创建并启动容器
docker run -d -p 80:80 --name="nginx" nginx:latest
run # 创建并启动一个容器
-d # 放后台运行
-p # 端口映射,将容器内服务的端口映射在宿主机的指定端口
nginx:latest # docker镜像名称
--name # 指定容器名
--network # 指定网络类型
--dns # 指定DNS
--rm # 容器停止,自动删除
--dns 223.5.5.5 # 指定容器dns
-i # 交互式访问
-t # 分配一个交换式的终端,和-d同用放后台
-e # 设置环境变量
--privileged=true # 授予此容器扩展权限,可以修改内核参数
--restart always # docker服务启动时启动容器
--link # 单向链接正在运行的容器,hosts文件中添加主机名/别名解析
-h # 指定容器的主机名
--memory 50M # 限制内存