网站首页 > 开源技术 正文
Docker
Docker 是什么?
Docker自从2013年诞生至今,早已成为了开发者耳熟能详的技术了,那到底什么是Docker?这篇文章就从头到尾八股一下Docker, 如果用一句话介绍介绍:Docker是一个工具,可以帮助开发者创建、运行、部署程序,可以把程序和环境一起打包并且移植到不同运行环境上,提升开发和运维效率。
在传统开发过程中,例如我使用的Java写一个web程序,此时我们要将程序打成war包然后部署到Tomcat上运行,但是我们的运行环境和开发环境不一致,我们要配置运行环境,这样一来二去就会出现各种问题。为了更好地将软件从一个环境移植到另一个环境上,必须从根源上解决问题,所以docker诞生了。
- Virtual Machine
- Linux Container
Docker友好的特性:模块化、层和镜像版本控制、回滚 、快速部署,这些特性就像git一样,开发者使用起来得心应手,这也是Docker能快速火爆的原因。
Virtual Machine
虚拟化相信很多人都听说过,相信大家也使用过VMware Workstation来安装一些Linux环境,这个就是通过软件技术把电脑硬件虚拟化成多个操作系统环境,虚拟机本质上也是一个软件,但是缺点很多,例如每虚拟一个环境就要配置一台虚拟机,并且每台虚拟机占用资源很大,运行速度也会受影响。
Docker是一种更轻量级的虚拟化程序,是基于LXC容器的一种封装,提供简单易用的容器使用接口,它也是目前最流行的Linux容器解决方案,可以将软件代码和其依赖,全打包在一个文件中。运行单个文件,就会生成虚拟容器,在这个虚拟容器中,不管本地的操作系统是如何的不同,此容器都能照常运行。
传统的Linux容器使用 init 系统来管理多种进程,这意味着,所有应用都作为一个整体运行,与此相反,Docker 技术力争让应用各自独立运行其进程,并提供相应工具,帮助实现这一功能。这种精细化运作模式自有其优势。
Linux Container
可能很多人认为虚拟机和容器关系就是,一个虚拟机是重量级的,而容器是轻量级的,事实并非如此,两者为互补关系,如下:
Virtual Machine vs LCX
- 虚拟化使得您的操作系统(Windows 或 Linux)可同时在单个硬件系统上运行。
- 容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开,例如ARM Linux 系统运行 ARM Linux 容器,x86 Linux 系统运行 x86 Linux 容器,x86 Windows 系统运行 x86 Windows 容器,Linux 容器具有极佳的可移植性,但前提是它们必须与底层系统兼容。
这意味着什么?虚拟化会使用虚拟机监控程序模拟硬件,从而使多个操作系统能够并行运行。但这不如容器轻便。事实上,在仅拥有容量有限的有限资源时,您需要能够进行密集部署的轻量级应用。Linux 容器在本机操作系统上运行,与所有容器共享该操作系统,因此应用和服务能够保持轻巧,并行化快速运行。
Linux 容器是我们开发、部署和管理应用方式的又一次飞跃。Linux 容器镜像提供了可移植性和版本控制,确保能够在开发人员的笔记本电脑上运行的应用,同样也能在生产环境中正常运行。相较于虚拟机,Linux 容器在运行时所占用的资源更少,使用的是标准接口(启动、停止、环境变量等),并会与应用隔离开;此外,作为(包含多个容器)大型应用的一部分时更加易于管理,而且这些多容器应用可以跨多个云环境进行编排。
- LXC架构
- Docker架构
Docker架构
熟悉操作系统应该知道Linux是基于宏内核架构,也就是分为用户空间和内核空间,虚拟机主要是由硬件虚拟化+内核虚拟化技术来实现,它在宿主机操作系统或硬件层的基础之上引入一层Hypervisor来虚拟出磁盘、CPU等资源,然后在虚拟出来的资源的基础之上运行Guest OS进而实现最终的虚拟机。
容器则直接在宿主机操作系统之上构建一个Docker Engine,共享宿主机操作系统内核,在此基础之上只引入了少量的Guest OS来实现。
下面图为Docker在宿主机上基础架构图:
容器架构图
Docker最主要3个组件就是镜像、容器、仓库如下:
- Docker Images
- Docker Container
- Docker Repository
这3者的关系有点像Java语言中class、object、pakcage,镜像是程序和运行环境打包的,而容器则是通过镜像创建出来的运行实例,而仓库而是存放镜像的地方。
我们每次通过Docker执行一次命令流程如下:
Docker请求流程图
Docker引擎架构是一个典型的C/S架构,后端是一个松耦合而多模块的架构,每层的职务划分如下图:
Docker API层次
最主要的是Docker Daemon进程,这个进程才是后端引擎主体程序,复制管理镜像和运行容器操作,Docker 守护进程 Daemon作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器),客户端和服务端既可以运行在一个机器上,也可通过 socket 或者 RESTful API 来进行通信。
容器的工作原理
Docker容器工作原理和隔离,应用安全是基于Linux中的Namespace和CGroups做的,容器本体就是一个独立的进程,和操作系统里面进程是一样的,进程与进程之间相互隔离造就了容器与容器互不影响的特性。我们在启动一个容器时Docker会使用Namespace实现资源隔离,并且使用CGroup对资源权限进行控制。
NameSpace是Linux内核一个强大的特性,每个容器都有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样,命名空间保证了容器之间彼此互不影响。
CGroups是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等,只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。
Docker启动时候会加载bootfs这个是Linux特有的文件系统,然后再加载的是rootfs这个要根据不同发行版本而定,这些就是Linux的内核,Docker就是根据联合文件系统进行复用一些模块的。
Docker网络
我们在使用的Docker做容器化部署或者编排的时候,当我们的应用节点达到一定数量的时候,往往单个宿主机资源是不够的,往往都多台宿主机部署,这时候多台Docker就需要通过网络进行通讯了,当您开始大规模使用 Docker 时,您突然需要了解很多有关网络的知识。作为 Docker 网络的介绍,将从小处着手,并展示您需要多快开始考虑如何管理容器之间的连接。
下图为单机模式:
单个主机情况下,主机和容器之间的关系是一台主机通常运行多个容器,这取决于机器的性能,平均每台主机运行大约 10 到 40 个容器。
「单主机部署的问题:」
- 对于大多数单机部署的容器来说通过数据卷做数据交换,但是如果是多台主机部署容器,共享数据卷就会有问题了。
- 在多主机部署中,需要考虑两个方面:容器如何在主机内进行通信,以及不同主机之间的通信路径变化,性能考虑和安全方面都可能会影响您的设计决策,当单个主机的容量不足时或者想要使用分布式系统(如 Apache Spark、HDFS 或 Cassandra)时,通常需要多主机部署,这时候就要依赖于网络通信了。
- 目前Docker网络有四种可用模式:桥接模式、主机模式、容器模式或无网络。
「1. 桥接模式」
桥接模式就是Docker Daemon进程会虚拟化一个docker0的以太网网桥,它会在连接到它的任何其他网络接口之间自动转发数据包,默认情况下,守护进程通过创建一对对等接口、分配其中一个对等成为容器eth0接口和主机命名空间中的另一个对等以及分配一个IP,从而达到一对一映射关系。
桥接模式对应bridge,这也是docker的默认网络模式,不写–net参数,就是bridge模式,使用docker run -p映射端口时,docker实际是在iptables做了DNAT规则,实现端口转发功能。
「2. 主机模式」
这个模式会直接去掉Docker虚拟化话出来的网卡,容器共享宿主机的网络命名空间,所以直接暴露于公网,因此也不需要启动容器的时候设置端口映射。
Host模式直接穿透了docker和宿主机共享IP,容器内部使用的端口和宿主机是对应的也就是你容器端口会占用宿主机的端口,最大的优势就是网络性能比较好,缺点就是网络可能存在安全隐患暴露在外部。
「3. 容器模式」
容器模式下网络情况是可以将一个容器的网络映射关联到另外一个容器上面,多个容器共享一个 Network Namespace,新创建的容器可以把创建自己的网络而是指定到有的容器上面,两个容器除了网络共享以外其他资源还是处于隔离的。
如上图示意图,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
「4. 无网络模式」
无网络模式就是让容器禁用网络,容器没有任何网络配置信息,只要本地i/o回环,如果在使用的时候需要网络则开通通过配置添加,容器与容器之间不能访问,并且相对于宿主机是独立隔离的。
「5. 自定义网络组」
前面几种模式IP随机分配局限性很大,每次启动容器的时候docker都会默认给你的容器分配一个随机ip,而这些ip分配是没有规则的,为此有时候我们要自定义网络配置,这就是自定义模式。
如上图我们可以将一些容器启动的时候放入指定的网络组里面,网络组里面都是已经配置好网络分配规则的,这样就能达到自定义网络配置效果。
Docker命令
其实没必要记住一些命令,大部分我们可以通过Docker -help就能得到相应的提示帮助。
作者:Leon Ding
原文链接:https://mp.weixin.qq.com/s/8mt_o6_4aeKHhH2G30ReeA
猜你喜欢
- 2024-11-20 docker 容器内怎么把文件拷贝到宿主机
- 2024-11-20 2024年了,你还在使用Docker做容器吗?
- 2024-11-20 Docker入门详解(下)
- 2024-11-20 Docker与虚拟机区别详解(图文全面总结)
- 2024-11-20 【系统架构】Kubernetes还是DC/OS?容器编排平台如何选?
- 2024-11-20 如何使用Docker部署MongoDB副本集
- 2024-11-20 Docker Swarm 让你事半功倍
- 2024-11-20 WIN7下安装Docker容器
- 2024-11-20 大白话 linux 教程-02-环境搭建
- 2024-11-20 如何模拟一次阿里双11秒杀场景的实现?程序员必看
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)