【Docker】Dokcer学习① - 简介

【Docker】Docker学习① - 简介

  • 一、Docker简介
    • 1. Docker是什么
    • 2. Docker组成
    • 3. Docker对比虚拟机
    • 4. Linux Namespace技术
    • 5. Linux control groups
    • 6. 容器管理工具
  • 二、Docker安装及基础命令介绍
  • 三、Docker镜像管理
  • 四、Docker镜像与制作
  • 五、Docker数据管理
  • 六、网络部分
  • 七、Docker仓库之单机Dokcer Registry
  • 八、Docker仓库之分布式Harbor
  • 九、单机编排之Docker Compose

统称来说,容器是一种工具,指的是可以装下其他物品的工具。
容器技术是虚拟化、云计算、大数据之后的一门新兴的并且是炙手可热的新技术,容器技术提高了硬件资源利用率、方便了企业的业务快速横向扩容、实现了业务宕机自愈功能,因此未来数年会是一个容器愈发流行的时代,这是一个对于IT行业来说非常有影响和价值的技术。
容器技术最早出现在freebsd叫做jail。

一、Docker简介

1. Docker是什么

  • 首先Docker是一个在2013年开源的应用程序并且是一个基于go语言编写的一个开源的PASS服务(Platform as a service,平台即服务的缩写),go语言是由google开发,docker公司最早叫dotCloud,后由于Docker开源后大受欢迎就将公司改名为Docker Inc,总部位于美国加州的旧金山。
  • Docker是基于Linux内核实现,Docker最早采用LXC技术(LinuXContainer的简写,LXC是Linux原生支持的容器技术,可以提供轻量级的虚拟化,可以说docker就是基于LXC发展起来的,提供LXC的高级封装,发展标准的配置方法),而虚拟化技术KVM(Kernel-based Virtual Machine)基于模块实现,Docker后改为自己研发并开源的runc技术运行容器。
  • Docker相比虚拟机的交付速度更快,资源消耗更低,Docker采用客户端/服务端架构,使用远程API来管理和创建Docker容器,其可以轻松的创建一个轻量级的、可移植的、自给自足的容器,docker的三大理念是build(构建)、ship(运输)、run(运行),Docker遵循从apache2.0协议,并通过(namespace及cgroup等)来提供容器的资源隔离与安全保障等,所以Docker容器在运行时不需要类似虚拟机(空运行的虚拟机占用物理机6%-8%性能)的额外资源开销,因此可以大幅提高资源利用率,总而言之Docker是一种用来新颖方式实现的轻量级虚拟机。类似于VM但是在原理上和应用上和VM的差别还是很大的,并且docker的专业叫法是应用容器(Application Container)。

2. Docker组成

https://docs.docker.com/engine.docker-overview/

  • Docker主机(Host):一个物理机或虚拟机,用于运行Docker服务进程和容器。
  • Docker服务端(Server):Docker守护进程,运行docker容器。
  • Docker客户端(Client):客户端使用docker命令或其他工具调用docker API。
  • Docker仓库(Registry):保存镜像的仓库,类似于git或svn这样的版本控制系。
  • Docker镜像(Images):镜像可以理解为创建实例使用的模板。
  • Docker容器(Container):容器是从镜像生成对外提供服务的一个或一组服务。
  • 官方仓库:https://hub.docker.com/

3. Docker对比虚拟机

  • 资源利用率更高:一台物理机可以运行数百个容器,但是一般只能运行数十个虚拟机。
  • 开销更小:不需要启动单独的虚拟机占用硬件资源。
  • 启动速度更快:可以在数秒内完成启动。

    使用虚拟机是为了更好的实现服务运行环境隔离,每个虚拟机都有独立的内核,虚拟化可以实现不同操作系统的虚拟机,但是通常一个虚拟机只运行一个服务,很明显资源利用率比较低且造成不必要的性能损耗,我们创建虚拟机的目的是为了运行应用程序,比如Nginx、PHP、Tomcat等web程序,使用虚拟机无疑带来了一些不必要的开销,但是容器技术则基于减少中间运行环节带来较大的性能提升。

思考:

  • 1.怎么样保证每个容器都有不同的文件系统并且能互不影响?
  • 2.一个docker主进程内的各个容器都是其子进程,怎么实现同一个主进程下不同类型的子进程?各个进程间通信能相互访问(内存数据)吗?
  • 3.每个容器怎么解决IP及端口分配的问题?
  • 4.多个容器的主机名能一样吗?
  • 5.每个容器都要不要有root用户?怎么解决账户重名的问题?

4. Linux Namespace技术

namespace 是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:

隔离类型功能系统调用参数内核版本
MNT Namespace(mount)提供磁盘挂载点和文件系统的隔离能力CLONE_NEWNSLinux 2.4.19
IPC Namespace(Inter-Process Communication)提供进程间通信的隔离能力CLONE_NEWIPCLinux 2.6.19
UTS Namespace(UNIX Timesharing System)提供主机名隔离能力CLONE_NEWUTSLinux 2.6.19
PID Namespace(Process Identification)提供进程隔离能力CLONE_NEWPIDLinux 2.6.24
Net Namespace(network)提供网络隔离能力CLONE_NEWNETLinux 2.6.29
User Namespace(user)提供用户隔离能力CLONE_NEWUSERLinux 3.8
  • 4.1 MNT Namespace
    每个容器都要有独立的根文件系统、独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境,即一个宿主机是ubuntu的服务器,可以在里面启动一个centos运行环境的容器并且在容器里面启动一个Nginx服务,此Nginx运行时使用的运行环境就是centos系统目录的运行环境,但是在容器里面是不能访问宿主机的资源,宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面。

    • 隔离类型:MNT Namespace(mount)
    • 功能:提供磁盘挂载点和文件系统的隔离能力
    • 系统调用参数: CLONE_NEWNS
    • 内核版本:Linux 2.4.19
  • 4.2 IPC Namespace
    一个容器内的进程间通信,允许一个容器内的不同进程的(内存、缓存等)数据访问,但是不能跨容器访问其他容器的数据。

    • 隔离类型:IPC Namespace(Inter-Process Communication)
    • 功能:提供进程间通信的隔离能力
    • 系统调用参数: CLONE_NEWIPC
    • 内核版本:Linux 2.4.19
  • 4.3 UTS Namespace
    UTS namespace (UNIX Timesharing System 包含了运行内核的名称、版本、底层体系机构类型等信息)用于系统标识,其中包含了hostname和域名domainname,它使一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的其他容器。

    • 隔离类型:UTS Namespace(UNIX Timesharing System)
    • 功能:提供主机名隔离能力
    • 系统调用参数: CLONE_NEWUTS
    • 内核版本:Linux 2.4.19
  • 4.4 PID Namespace
    Linux系统中,有一个PID为1的进程(init/systemd)是其他所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的子进程,那么多个容器的进程通过PID namespace进程隔离(比如PID编号重复、容器内主进程生成与回收子进程等)。

    • 隔离类型:PID Namespace(Process Identification)
    • 功能:提供进程隔离能力
    • 系统调用参数: CLONE_NEWPID
    • 内核版本:Linux 2.6.24
  • 4.5 Net Namespace
    查看宿主机的网卡信息
    通过brctl show命令查看桥接设备
    宿主机的iptables规则:iptables -t nat -vnl
    转发规则

    • 隔离类型:Net Namespace(network)
    • 功能:提供网络隔离能力
    • 系统调用参数: CLONE_NEWNET
    • 内核版本:Linux 2.6.29
  • 4.6 User Namespace
    各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,那么怎么隔离各个容器内的用户空间呢?
    User namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID各GID,只是会把用户的作用范围限制在每个容器内,即A容器和B容器可以有相同的用户名称和ID账户,但是此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统,即相互隔离、互不影响、永不相见。

    • 隔离类型:User Namespace(user)
    • 功能:提供用户隔离能力
    • 系统调用参数: CLONE_NEWUSER
    • 内核版本:Linux 3.8

5. Linux control groups

在一个容器,如果不对其作任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU、内存等,Linux Cgroups的全称是Linux Control Groups,它最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等。此外,还能够对进程进行优先级设置,以及将进程挂起和恢复等操作。

  • 5.1 验证系统cgroups:
    Cgroups在内核层默认已经开启,从centos和ubuntu对比结果来看,显然内核较新的ubuntu支持的功能更多。

centos 7.6 cgroups:
cat /etc/redhat-release
uname -r
cat /boot/config-xxx | grep CGROUP
ubuntu cgroups:
cat /etc/issue
uname -r
cat /boot/config-xxx | grep CGROUP

  • 5.2 cgroups具体实现
    blkio:块设备io限制
    cpu:使用调度程序为cgroups任务提供cpu的访问
    cpuacct:产生cgroup任务的cpu资源报告
    cpuset:如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存
    devices:允许或拒绝cgroup任务对设备的访问
    freezer:暂停和恢复cgroup任务
    memory:设置每个cgroup的内存限制以及产生内存资源报告
    net_cls:标记每个网络包以供cgroup方便使用
    ns:命名空间子系统
    perf_event:增加了对每个group的监测跟踪的能力,可以监测属于某个特定的group的所有线程以及允许在特定CPU上的线程

  • 5.3 查看系统cgroups
    ll /sys/fs/cgroup/
    有了以上的的chroot、namespace、cgroups就具备了基础的容器运行环境,但是还需要有相应的容器创建与删除的管理工具、以及怎么样把容器运行起来、容器数据怎么处理、怎么进行启动与关闭等问题需要解决,于是容器管理技术出现了。

6. 容器管理工具

目前主要是使用的docker,早期有使用lxc

  • 6.1 lxc
    LXC:LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,官方网站:https://linuxcontainers.org/
    Ubuntu安装lxc:
    apt install lxc lxd
    lxc启动容器依赖于模板,清华模板源:https://mirrors.runa.tsinghua.edu.cn/help/lxc-images/,但是做模板相对较难,需要手动一步步构建文件系统、准备基础目录及可执行程序等,而且在大规模使用容器的场景很难横向扩展,另外后期代码升级也需要重新从头构建模板,基于以上种种原因便有了docker。

  • 6.2 pouch
    https://www.infog.cn/article/alibaba-pouch
    https://github.com/alibaba/pouch

  • 6.3 docker
    Docker 启动一个容器也需要一个外部模板但是较多镜像,docker的镜像可以保存在一个公共的地方共享使用,只要把镜像下载下来就可以使用,最主要的是可以在镜像基础之上做自定义配置并可以再把其提交为一个镜像,一个镜像可以被启动为多个容器
    Docker的镜像是分层的,镜像底层为库文件且只读层既不能写入也不能删除数据,从镜像加载启动为一个容器后会生成一个可写层,其写入的数据会复制到容器目录,但是容器内的数据在删除容器后也会被随之删除。

    • 6.3.1 Docker的优势

      • 快速部署:短时间内可以部署成百上千个应用,更快速交付到线上
      • 高效虚拟化:不需要额外的hypervisor支持,直接基于linux实现应用虚拟化,相比虚拟机大幅提高性能和效率
      • 节省开支:提高服务器利用率,降低IT支出
      • 简化配置:将运行环境打包保存至容器,使用时直接启动即可
      • 快速迁移和扩展:可跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从A宿主机迁移到B宿主机,甚至是A平台迁移到B平台
    • 6.3.2 Docker的缺点
      隔离性:各应用之间的隔离不如虚拟机彻底

    • 6.3.3 Docker(容器)的核心技术

      • 容器规范:
        容器技术除了docker之外,还有coreOS的rkt,还有阿里的Pouch,为了保证容器生态的标准性和健康可持续发展,包括Linux基金会、Docker、微软、红帽谷歌、IBM等公司在2015年6月共同成立了一个叫open container(OCI)的组织,其目的就是制定开放的标准的容器规范,目前OCI一共发布了两个规范,分别是runtime spec和image format spec,有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可以执行和相互可操作性。
        容器runtime:
        runtime是真正运行容器的地方,因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互支持,以便为容器提供相应的运行环境。
        目前主流的三种runtime:
        Lxc:linux上早期的runtime,Docker早期就是采用lxc作为runtime。
        runc:目前docker默认的runtime,runc遵守OCI规范,因此可以兼容lxc。
        rkt:是Core开发的容器runtime,也符合OCI规范,所以使用rktruntime也可以运行Docker容器。
      • 容器管理工具:
        管理工具连接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开发的容器编排引擎。
        Kubernetes:google领导开发的容器编排引擎,内部项目为Borg,且其同时支持docker和CoreOS。
        Mesos+Marathon:通用的集群组员调度平台,mesos(资源分配)与marathon(容器编排平台)一起提供容器编排引擎功能。
    • 6.3.4 Docker(容器)的依赖技术:

      • 容器网络:
        docker自带的网络docker network仅支持管理单机上的容器网络,当多主机运行的时候需要使用第三方开源网络,例如calico、flannel等。
      • 服务发现:
        容器的动态扩容特性决定了容器IP也会随之变化,因此需要有一种机制开源自动识别并将用户请求动态转发到新创建的容器上,kubernetes自带服务发现功能,需要结合kube-dns服务解析内部域名。
      • 容器监控:
        可以通过原生命令docker ps/top/stats 查看容器运行状态,另外也可以使heapster、Prometheus等第三方监控工具监控容器的运行状态。
      • 数据管理:
        容器的动态迁移会导致其在不同的Host主机之间迁移,因此如何保证与容器相关的数据也能随之迁移或随时访问,可以使用逻辑卷、存储挂载等方式解决。
      • 日志收集:
        docker原生的日志查看工具docker logs,但是容器内部的日志需要通过ELK等专门的日志收集分析和展示工具进行处理。

二、Docker安装及基础命令介绍

  • 参考:【Docker】Docker学习② - Docker安装及基础命令介绍

三、Docker镜像管理

  • 参考:【Docker】Docker学习③ - Docker镜像管理

四、Docker镜像与制作

  • 参考:【Docker】Docker学习④ - Docker镜像与制作

五、Docker数据管理

  • 参考:【Docker】Docker学习⑤ - Docker数据管理

六、网络部分

  • 参考:【Docker】Docker学习⑥ - 网络部分

七、Docker仓库之单机Dokcer Registry

  • 参考:【Docker】Docker学习⑦ - Docker仓库之单机Dokcer Registry

八、Docker仓库之分布式Harbor

  • 参考:【Docker】Docker学习⑧ - Docker仓库之分布式Harbor

九、单机编排之Docker Compose

  • 参考:【Docker】Docker学习⑨ - 单机编排之Docker Compose

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别

分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类…

NumPy必知必会50例 | 2. 数组索引和切片:探索 NumPy 数组的秘密

文章目录 2. 数组索引和切片:探索 NumPy 数组的秘密数组索引:抓住您所需的元素一维数组索引多维数组索引 数组切片:选择您想要的一部分一维数组切片多维数组切片 切片的高级用法下一步 2. 数组索引和切片:探索 NumPy 数组的秘密 …

鸿蒙开发案例002

1、目标需求 界面有增大字体按钮,每次点击增大字体按钮,“Hello ArkTS”都会变大 2、源代码 Entry Component struct Page {textValue: string Hello ArkTSState textSize: number 50myClick():void{this.textSize 4}build() {Row() {Column() {//…

stm32 FOC 电机介绍

今年开始学习foc控制无刷电机,这几天把所学整理一下,记录一下知识内容。 前言: 为什么要学习FOC? 1.电机控制是自动化控制领域重要一环。 2.目前直流无刷电机应用越来越广泛,如无人机、机械臂、云台、仿生机器人等等。 需要什么基础&…

记录 | 修改.gitignore文件,如何重新生效

git rm -r --cached . # 清除缓存 git add . # 追踪文件 git commit -m "更新.gitignore" # 注释提交 git push origin master # 推送远程 git rm -r --cached解决已提交…

Protues使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…

基于Springboot的大学生心理健康管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的大学生心理健康管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体…

springboot项目启动时如何排除一个bean?

使用springboot开发项目,我们有时候会排除一些项目里面用不到的bean,不然的话项目启动会报错,这种情况通常是发生在什么场景里呢,以及如何解决呢?今天咱们就聊一聊。 springboot默认封装了很多的组件,并且…

MySQL安装及可视化工具SQLyog下载

编程如画,我是panda! 最近学习Web开发的时候要用到数据库,一开始下载的ZIP版本的,还得修改配置文件,挺麻烦的,后来发现可以直接使用msi版的安装包疯狂next,所以就出一期教程。 前言 MySQL 是一…

Database__进阶

文章目录 😊 作者:Lion J 💖 主页: https://blog.csdn.net/weixin_69252724?spm1000.2115.3001.5343 🎉 主题: 数据库mysql(高级部分) ⏱️ 创作时间:2024年01月24…

C# Static与拓展方法

我们可以使用 static 关键字把类和类成员定义为静态的。 作用 静态成员让类的所有实例化对象之间实现数据共享。实现成员变量的唯一性,这在单例模式中常用到。静态类可以作为工具类提供方法 特点 使类成员作为类的成员存在,而不依赖于类的实例化对象。…

TortoiseSVN源码安装与迁移全攻略

一、前言 随着版本控制系统的普及,越来越多的开发者和团队开始使用SVN(Subversion)来管理代码。本文将详细介绍TortoiseSVN的源码安装及迁移过程,帮助您轻松掌握这一版本控制工具。 二、TortoiseSVN源码安装 依赖环境安装&…

thymeleaf常用语法大全

有时候需要借鉴别人的代码,发现一个相似的功能点,但是自己的是html页面别人的是jsp页面,那如果不了解thymeleaf的话还是要费点功夫的。 什么是thymeleaf,通俗点,jsp中的${},以及jstl中的if标签什么的都不能用&#xf…

使用 LlamaIndex 部署本地 Mistral-7b 大模型实现 RAG

原理 LlamaIndex的文档链接:Using LLMs - LlamaIndex 🦙 0.9.33 LlamaIndex 的一般使用模式如下: 加载文档(手动或通过数据加载器)将文档解析为节点构建索引(来自节点或文档)(可选,高级&…

GO 的 Web 开发系列(二)—— Web 项目的技术框架选择和项目搭建

Web 系统搭建第一步,选择技术框架,完成 Hello World。 小玖用的 Go 版本是 1.21.6 介绍项目的技术选型个结构,不包括代码。 全文链接:https://blog.nineya.com/archives/149.html 一、技术框架选择 Web 框架: githu…

2024年 IT 行业就业情况能否回春?很多人说道…

我只能说可以,以前我是看不到的。但是鸿蒙全栈自研让我重新看到希望! 2024年1月18日,华为鸿蒙千帆启航发布会。讲到HarmonyOS NEXT作为原生鸿蒙,其系统底座全栈自研,去掉了传统的AOSP 代码(“Android 开放…

【latex】在Overleaf的IEEE会议模板中,快速插入参考文献

【LaTeX】在Overleaf的IEEE会议模板中,快速插入参考文献 写在最前面第一步:在文献检索网站导出引用文献的bib文件第二步:编辑overleaf模版方法二:EduBirdie生成参考文献(补充)使用LaTeX在Overleaf的IEEE会议…

杰卡德距离(Jaccard Distance)

杰卡德距离(Jaccard Distance),是用于衡量两个集合差异性的一种指标,它是杰卡德相似系数的补集,可以用来区分集合(如知识图谱)。 杰卡德相似系数 杰卡德相似系数(Jaccard similari…

012vuerouter

VUEROUTER3–vue2 vuerouter4–vue3 一个html可以切换多个组件&#xff0c;用户体验好很多 使用&#xff1a;导入-全局注册&#xff08;use import vuerouter from vuerouter Vue.use(vuerouter) vue-router有 < router-link > 并且使用< router-view>来声明路由…

80.网游逆向分析与插件开发-背包的获取-自动化助手显示物品数据

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;升级Notice类获得背包基址-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;3be017de38c50653b1…