Docker之Docker概念,网络,数据卷

分享
手机游戏开发者 2024-10-6 13:22:44 80 0 来自 中国
1 Docker

1.1 简介

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源,重要项目代码在 GitHub 上进行维护。Docker 利用 Google 公司推出的 Go 语言 进行开发实现。docker是linux容器的一种封装,提供简单易用的容器利用接口。它是最流行的Linux容器办理方案。
docker的接口相当简单,用户可以方便的创建、烧毁容器。docker将应用步调与步调的依靠,打包在一个文件内里。运行这个文件就会天生一个捏造容器。步调运行在捏造容器里,如同在真实物理机上运行一样,有了docker,就不消担心情况题目了
1.2 Docker架构

Docker包罗三个根本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件体系。好比官方镜像 ubuntu:16.04 就包罗了完备的一套 Ubuntu16.04 最小体系的 root 文件体系。

    • 通过镜像启动一个容器,一个镜像是一个可实行的包,此中包罗运行应用步调所需要的全部内容包罗代码,运行时间,库、情况变量、和设置文件。
    • Docker镜像也是一个压缩包,只是这个压缩包不但是可实行文件,情况摆设脚本,它还包罗了完备的利用体系。因为大部门的镜像都是基于某个利用体系来构建,以是很轻松的就可以构建当地和远端一样的情况,这也是Docker镜像的英华。

  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象步调计划中的类和实例一样,镜像是静态的界说,容器是镜像运行时的实体。容器可以被创建、启动、克制、删除、停息等。
    所创建的每一个容器都是相互隔离、互不可见,以包管平台的安全性。可以把容器看做是一个浅易版的linux情况(包罗root用户权限、镜像空间、用户空间和网络空间等)和运行在此中的应用步调
  • 堆栈(Repository):堆栈可看成一个代码控制中心,用来生存镜像。

    • 堆栈注册服务器上通常存放着多个堆栈,每个堆栈中包罗了多个镜像,每个镜像有差异标签(tag)
    • 堆栈分为公开堆栈(Public)和私有堆栈(Private)两种情势。
    • 最大的公开堆栈是 Docker Hub:https://hub.docker.com,存放了数目巨大的镜像供用户下载。
      国内的公开堆栈包罗阿里云 、网易云等

Docker 利用客户端-服务器 (C/S) 架构模式,利用远程API来管理和创建Docker容器,Docker 容器通过 Docker 镜像来创建


概念阐明Docker 镜像(Images)Docker 镜像是用于创建 Docker 容器的模板,好比 Ubuntu 体系。Docker 容器(Container)容器是独立运行的一个或一组应用,是镜像运行时的实体Docker 客户端(Client)Docker 客户端通过下令行大概其他工具利用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守卫进程通讯。Docker 主机(Host)一个物理大概捏造的呆板用于实行 Docker 守卫进程和容器。Docker RegistryDocker 堆栈用来生存镜像,可以明白为代码控制中的代码堆栈。Docker Hub(https://hub.docker.com) 提供了巨大的镜像聚集供利用。一个 Docker Registry 中可以包罗多个堆栈(Repository);每个堆栈可以包罗多个标签(Tag);每个标签对应一个镜像。通常,一个堆栈会包罗同一个软件差异版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <堆栈名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。假如不给出标签,将以 latest 作为默认标签Docker MachineDocker Machine是一个简化Docker安装的下令行工具,通过一个简单的下令行即可在相应的平台上安装Docker,好比VirtualBox、 Digital Ocean、Microsoft Azure1.3 Docker与捏造机的区别

捏造机通过添加Hypervisor层(捏造化中心层),捏造出网卡、内存、CPU等捏造硬件,再在其上创建捏造机,每个捏造机都有自己的体系内核。而Docker容器则是通过隔离(namesapce)的方式,将文件体系、进程、装备、网络等资源进行隔离,再对权限、CPU资源等进行控制(cgroup),终极让容器之间互不影响,容器无法影响宿主机。
与捏造机相比,容器资源斲丧要少。同样的宿主机下,能够创建容器的数目要比捏造机多
但是,捏造机的安全性要比容器稍好,而docker容器与宿主机共享内核、文件体系等资源,更有大概对其他容器、宿主机产生影响
特性容器捏造机启动秒级分钟级硬盘利用一样平常为MB一样平常为GB性能靠近原生弱于体系支持量单机支持上千个容器一样平常是几十个1.4 Docker 怎样工作

Docker技能利用 Linux 内核和内核功能(比方 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采取容器的目的所在;它可以独立运行多种进程、多个应用步调,更加充实地发挥底子办法的作用,同时保持各个独立体系的安全性。
容器工具(包罗 Docker)可提供基于镜像的摆设模式。这使得它能够轻松跨多种情况,与其依靠步调共享应用或服务组。Docker 还可在这一容器情况中主动摆设应用步调(大概归并多种流程,以构建单个应用步调)。
此外,由于这些工具基于 Linux 容器构建,使得 Docker 既易于利用,又别开生面 —— 它可为用户提供前所未有的高度应用程访问权限、快速摆设以及版本控制和分发本事。
1.5 Docker技能是否与传统的Linux容器雷同

答案:否
Docker 技能最初是基于 LXC 技能构建(大多数人都会将这一技能与传统的 Linux 容器接洽在一起),但厥后它渐渐摆脱了对这种技能的依靠。
就轻量级捏造化这一功能来看,LXC 非常有效,但它无法提供精彩的开发职员或用户体验。除了运行容器之外,Docker 技能还具备其他多项功能,包罗简化用于构建容器、传输镜像以及控制镜像版本的流程。
传统的 Linux 容器利用 init 体系来管理多种进程。这意味着,全部应用步调都作为一个团体运行。与此相反,Docker 技能鼓励应用步调各自独立运行其进程,并提供相应工具以实现这一功能。这种精致化运作模式自有其上风。
1.5.1 什么是 Linux 容器

Linux容器是与体系其他部门隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包罗了应用的全部依靠项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和同等性。


更加具体地来说,假定在开发一个应用。利用的是一台条记本电脑,而开发情况具有特定的设置。其他开发职员身处的情况设置大概稍有差异。正在开发的应用依靠于当前的设置,还要依靠于某些特定文件。与此同时,企业还拥有标准化的测试和生产情况,且具有自身的设置和一系列支持文件。你渴望尽大概多在当地模仿这些情况,而不产生重新创建服务器情况的开销。
因此,你要怎样确保应用能够在这些情况中运行和通过质量检测,而且在摆设过程中不出现令人头疼的题目,也无需重新编写代码和进行故障修复?
答案就是利用容器。
容器可以确保你的应用拥有必须的设置和文件,使得这些应用能够在从开发到测试、再到生产的整个流程中顺遂运行,而不出现任何不良题目。
虽然这只是简化的示例,但在需要很高的可移植性、可设置性和隔离的情况下,我们可以利用 Linux 容器通过很多方式办理困难。无论底子架构是在企业内部还是在云端,大概混淆利用两者,容器都能满足你的需求。
1.5.2 容器是捏造化吗

是,但也不竟然。我们用一种简单方式来思索一下:
捏造化使得很多利用体系可同时在单个体系上运行。容器则可共享同一个利用体系内核,将应用进程与体系其他部门隔离开。

3.png
这意味着什么?起首,让多个利用体系在单个捏造机监控步调上运行以实现捏造化,并不能告竣和利用容器划一的轻量级效果。事实上,在仅拥有容量有限的有限资源时,需要能够可以进行麋集摆设的轻量级应用。Linux 容器可从单个利用体系运行,在全部容器中共享该利用体系,因此应用和服务能够保持轻量级,并行快速运行
1.6 Docker中的镜像分层

参考文档:http://www.maiziedu.com/wiki/cloud/dockerimage
Docker支持通过扩显现有镜像,创建新的镜像。实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和设置需要的软件构建出来的。

4.png
从上图可以看到,新镜像是从 base 镜像一层一层叠加天生的。每安装一个软件,就在现有镜像的底子上增长一层。
1.6.1 Docker镜像为什么分层

镜像分层最大的一个长处就是共享资源
好比说有多个镜像都从雷同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上生存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为全部容器服务了。而且镜像的每一层都可以被共享。
假如多个容器共享一份底子镜像,当某个容器修改了底子镜像的内容,好比 /etc 下的文件,这时其他容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器 Copy-on-Write 特性。
1.5.2 可写的容器层

当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作容器层,容器层之下的都叫镜像层。


全部对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的全部镜像层都是只读的。
1.6.3 容器层的细节阐明

镜像层数目大概会很多,全部镜像层会团结在一起构成一个同一的文件体系。假如差异层中有一个雷同路径的文件,好比 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件体系。
文件利用阐明
文件利用阐明添加文件在容器中创建文件时,新文件被添加到容器层中读取文件在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后打开并读入内存修改文件在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之删除文件在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中 记载下此删除利用。(只是记载删除利用)只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层生存的是镜像变革的部门,不会对镜像自己进行任何修改。
如许就表明了我们前面提出的题目:容器层记载对镜像的修改,全部镜像层都是只读的,不会被容器修改,以是镜像可以被多个容器共享。
1.7 Docker网络范例

1.7.1 docker的网络范例

范例阐明None不为容器设置任何网络功能,没有网络 --net=noneContainer与另一个运行中的容器共享Network Namespace,--net=container:containerIDHost与主机共享Network Namespace,--net=hostBridgeDocker计划的NAT网络模子(默认范例)Bridge默认docker网络隔离基于网络定名空间,在物理机上创建docker容器时会为每一个docker容器分配网络定名空间,而且把容器IP桥接到物理机的捏造网桥上。
1.7.1.1 host模式

host模式 :利用 --net=host 指定
相当于VMware 中的桥接模式,与宿主机在同一个网络中,但是没有独立IP所在
Docker 利用了Linux 的Namespace 技能来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件体系,Network Namespace 隔离网络等。
一个Network Namespace 提供了一份独立的网络情况,包罗网卡,路由,iptable 规则等都与其他Network Namespace 隔离。
一个Docker 容器一样平常会分配一个独立的Network Namespace
但是假如启动容器的时间利用host 模式,那么这个容器将不会得到一个独立的Network Namespace ,而是和宿主机共用一个Network Namespace 。容器将不会捏造出自己的网卡,设置自己的IP等,而是利用宿主机的IP和端口。此时容器不再拥有隔离的、独立的网络栈。不拥有全部端口资源

7.png
1.7.1.2 container模式

container模式:利用--net=container:contatiner:NAME_or_ID指定
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,设置自己的IP,而是和一个指定的容器共享IP,端口范围等。 可以在肯定水平上节流网络资源,容器内部依然不会拥有全部端口。
同样,两个容器除了网络方面,其他的如文件体系,进程列表等还是隔离的。
两个容器的进程可以通过lo网卡装备通讯

1.7.1.3 none 模式

none模式:利用 --net=none指定
利用none 模式,docker容器有自己的network Namespace ,但是并不为Docker 容器进行任何网络设置。也就是说,这个Docker 容器没有网卡,ip, 路由等信息。
这种网络模式下,容器只有lo 回环网络,没有其他网卡。
这种范例没有办法联网,但是封闭的网络能很好的包管容器的安全性
该容器将完全独立于网络,用户可以根据需要为容器添加网卡。此模式拥有全部端口。(none网络模式设置网络)特别情况下才会用到,一样平常不消
1.7.1.4 bridge模式

相当于Vmware中的 nat 模式,容器利用独立network Namespace,并毗连到docker0捏造网卡。通过docker0网桥以及iptables nat表设置与宿主机通讯,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的 Docker 容器毗连到一个捏造网桥上。
当Docker进程启动时,会在主机上创建一个名为docker0的捏造网桥,此主机上启动的Docker容器会毗连到这个捏造网桥上。捏造网桥的工作方式和物理互换机雷同,如许主机上的全部容器就通过互换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器利用,并设置docker0的IP所在为容器的默认网关。在主机上创建一对捏造网卡veth pair装备。veth装备总是成对出现的,它们构成了一个数据的通道,数据从一个装备进入,就会从另一个装备出来。因此,veth装备常用来毗连两个网络装备。
Docker将veth pair 装备的一端放在新创建的容器中,并定名为eth0(容器的网卡),另一端放在主机中, 以veth*如许雷同的名字定名,并将这个网络装备参加到docker0网桥中。可以通过 brctl show 下令检察。
容器之间通过veth pair进行访问
利用docker run -p 时,docker实际是在iptables做了DNAT规则,实现端口转发功能。
可以利用iptables -t nat -vnL 检察

9.png
转载于:https://mp.weixin.qq.com/s/VkRQyvXfo-dLem5Bv0094w
1.7.2 不为容器设置网络功能

此模式下创建容器是不会为容器设置任何网络参数的,如:容器网卡、IP、通讯路由等,全部需要自己去设置。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 17:27, Processed in 0.179734 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表