Docker组成:
Docker主机(Host): 一个物理机或虚拟机, 用于运行Docker服务进程和容器, 也成为宿主机, node节点。
Docker服务器端(Server): Docker守护进程, 运行Docker容器。
Docker客户端(Client): 客户端使用docker命令或其他工具调用docker API。
Docker仓库(Registry):保存镜像的仓库, 官方仓库:hub.docker.com, 可以搭建私有仓库harbor。
Docker镜像(Images):镜像可以理解为创建实例使用的模本, 相当于RPM或者DEB包。
Docker容器(Container):容器是从镜像生成对外提供服务的一个或一组服务, 相当于RPM包中的程序运行起来。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker是一个基于轻量级虚拟化技术的容器,整个项目基于Go语言开发,并采用了Apache 2.0协议。Docker可以将我们的应用程序打包封装到一个容器中,该容器包含了应用程序的代码、运行环境、依赖库、配置文件等必需的资源,通过容器就可以实现方便快速并且与平台解耦的自动化部署方式,无论你部署时的环境如何,容器中的应用程序都会运行在同一种环境下。
那么镜像又是什么呢?镜像是Docker中的一个重要概念:
Image(镜像):它类似于虚拟机中使用到的镜像,由于任何应用程序都需要有它自己的运行环境,Image就是用来提供所需运行环境的一个模板。
Container(容器):Container是Docker提供的一个抽象层,它就像一个轻量级的沙盒,其中包含了一个极简的Linux系统环境与运行在其中的应用程序。Container是Image的运行实例(Image本身是只读的,Container启动时,Docker会在Image的上层创建一个可写层,任何在Container中的修改都不会影响到Image,如果想要在Image保存Container中的修改,Docker采用了基于Container生成新的Image层的策略),Docker引擎利用Container来操作并隔离每个应用(也就是说,每个容器中的应用都是互相独立的)。
其实从Docker与Container的英文单词原意中就可以体会出Docker的思想。Container可以释义为集装箱,集装箱是一个可以便于机械设备装卸的封装货物的通用标准规格,它的发明简化了物流运输的机械化过程,使其建立起了一套标准化的物流运输体系。而Docker的意思为码头工人,可以认为,Docker就像是在码头上辛勤工作的工人,把应用打包成一个个具有某种标准化规格的"集装箱"(其实这里指出的集装箱对应的是Image,在Docker中Container更像是一个运行中的沙盒),当货物运输到目的地后,码头工人们(Docker)就可以把集装箱拆开取出其中的货物(基于Image来创建Container并运行)。这种标准化与隔离性可以很方便地组合使用多个Image来构建你的应用环境(Docker也提倡每个Image都遵循单一职责原则,也就是只做好一件事),或者与其他人共享你的Image。
Docker 可以运行在多种类型的操作系统上,包括但不限于以下系统:
1、Linux
Docker 基于 Linux 内核的虚拟化技术,因此 Linux 是其主要的支持系统。
Docker 官方提供了对大多数主流 Linux 发行版的支持,包括 Ubuntu、Debian、CentOS、Fedora 等。
2、Windows
从 Windows 10 版本 1607 开始,Docker 可以运行在 Windows 10、Windows 11 的桌面版上。
3、macOS
Docker 可以运行在 macOS 10.15 及更高版本上,通过 Docker Desktop for Mac 提供支持。
4、ARM架构的操作系统
Docker 也支持在 ARM 架构的设备上运行,例如树莓派等。
Docker官方文档明确写了支持那些操作系统和硬件架构:
在这些系统上的具体安装方式可以参考:
Install Docker Engine | Docker Docs
Docker不能直接运行在Windows或MacOS上。虽然在这类系统上也能安装Docker Desktop,但实际Docker是运行在虚拟机里。比如Windows的Docker就是泡在WSL2或Hyper-V虚拟机上,具体可以参考:
Install Docker Desktop on Windows | Docker Docs
早期的容器基于Linux的LXC工作. 可以提供轻量级的虚拟化, 以便隔离进程和资源, 而不需要提供指令解释机制以及全虚拟化的其他复杂性. 容器有效地将由单个操作系统管理的资源划分到孤立的组中, 以便更好地在孤立的组之间平衡有冲突的资源使用需求。
Linux Container提供了在单一可控主机节点上支持多个相互隔离的Server Container同时执行的机制. Linux Container有点像chroot, 提供了一个拥有自己进程和网络空间的虚拟环境, 但又有区别去虚拟机, 因为lxc是一种操作系统层次上的资源的虚拟化。
如果容器已经普遍基于Docker管理, 而Docker是一个可以将应用程序及其依赖打包到几乎可以在任何服务器上运行的容器的工具。
Docker是基于Linux内核实现的, Docker最早采用了LXC技术, LXC是Linux原生支持的容器技术, 可以提供轻量级的虚拟化. Docker基于LXC发展, 提供了LXC的高级封装, 标准的配置方法, 在LXC的基础上, Docker提供了一系列更强大的功能. 而虚拟化技术, 比如KVM, 是基于模块实现, 后来Docker改为自己研发并开源的runc技术运行容器
Docker相比虚拟机的交付速度更快, 资源消耗更低, Docker采用客户端/服务器端架构, 使用远程API来管理和创建容器, 其可以轻松的创建一个轻量级的, 可移植的, 自给自足的容器. Docker的三大理念就是build, ship, run. Docker通过namespace和cgroup来提供容器的资源隔离与安全保障等, 所以Docker容器在运行时, 不需要类似虚拟机的额外资源开销, 因此可以大幅度提供资源利用率
容器和虚拟机技术比较
传统虚拟机是虚拟出一个主机硬件, 并且运行一个完整的操作系统, 然后在这个系统上安装和运行软件。
容器内的应用直接运行在宿主机的内核之上, 容器并没有自己的内核, 也不需要虚拟硬件, 相当轻量化。
每个容器间是相互隔离, 每个容器内都要一个属于自己的独立文件系统, 独立的进程空间, 网络空间, 用户空间等, 所以在同一个宿主机上的多个容器之间彼此不会相互影响容器和虚拟机表现比较。
资源利用率更高:开销更小, 不需要启动单独的虚拟机OS内核占用硬件资源, 可以将服务器性能压榨至极致. 虚拟机一般会有5-20%的损耗, 容器运行基本无损耗, 所以生产中一台物理机只能运行数十个虚拟机, 但是一般可以运行数百个容器。
启动速度更快:可以在数秒内完成启动。
占用空间更小:容器一般占用的磁盘空间以MB为单位, 而虚拟机即使是最小化安装也要占1个G多的空间。
集成性更好:和CI/CD相关技术结合性更好, 实现打包镜像发布测试可以一键运行, 做到自动化并快速的部署管理, 实现高效的开发生命周期。