文章目录

  • 〇、引言
  • 一、docker是什么?
    • wiki介绍
    • 组成部分
  • 二、为什么会出现docker?
    • Docker与虚拟机的对比
    • 它的优点
    • 它的缺点
  • 三、实现原理是什么?
    • 综述
    • 各个模块
  • 四、docker 常用命令是什么?
    • docker安装
    • docker-compose安装
    • 国内镜像配置

〇、引言

近年来,很多高校都开设了大数据专业,教学中最大的问题是没有配套的基础实验环境,无法对大数据环境进行快速部署,配置难度较高。实际教学中,大数据的实验环境一般要求运行在Linux上,且需要多台机器构建集群,搭建过程涉及Linux系统、虚拟机软件、JDKHadoop,Spark ,HBase , Hive等多种开源软件的安装,安装过程繁琐.配置工作量极大。而且有时同样的操作方法,在某台计算机上可以成功,在另一台计算机上却会失败。因此,传统的PC机房无法满足实验环境的要求。
目前主要有三种解决方案:

  1. 学生通过个人电脑构建伪分布式的实验环境,模拟大数据集群。因受限于个人电脑的性能,数据处理能力有限,无法获得较好的学习效果。
  2. 通过OpenStack等虚拟化技术,在服务端构建大数据集群,安排专人负责维护管理。缺点在于资源消耗较大,维护管理成本高。
  3. 租用第三方云服务平台(如阿里云)部署实验环境。此方案系统稳定﹑性能高,但很难定制个性化的环境,且租用成本高。

为降低实验室建设成本,减少大数据的学习难度﹐利用轻量级的Docker容器化技术为用户提供虚拟化的操作环境,能够保证用户进行相同实验时的环境是一样的,确保每个用户的学习虚拟环境都是独立的,相互之间不会发生干扰。因为Docker采用的是操作系统层面的虚拟化技术,所以对内存、CPU等系统资源有更高的利用率,在相同的服务器集群条件下可以支持更多的用户同时在线使用。
今天就让我们来认识一下今天的主角吧~

一、docker是什么?

wiki介绍

Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。 Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。
Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 容器更多的用于表示 软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker也为容器提供更强的业界的隔离兼容。
Docker 利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(英语:Linux namespaces)(namespaces),来创建独立的容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括行程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。
——> https://zh.wikipedia.org/wiki/Docker

翻译翻译:

  • 开源项目
  • 它基于 Google 公司推出的 Go 语言实现
  • 加入了 Linux 基金会,遵从了 Apache 2.0 协议
  • 官网https://www.docker.com/

组成部分

  • 镜像(Image):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像是静态的,不包含任何动态数据,其内容在构建之后也不会被改变。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库(Repository)类似Git的远程仓库,集中存放镜像文件

二、为什么会出现docker?

Docker与虚拟机的对比

下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统, 而虚拟机传统方式则是在硬件层面实现。

传统的虚拟机首先通过Hypervisor层对物理硬件进行虚拟化,然后在虚拟的硬件资源上安装从操作系统(guest os),最后将相关应用运行在从操作系统上。其中APP+BINS/LIBS+Guest OS为虚拟机

docker不像虚拟机那样利用Hypervisorguest os实现资源与环境的隔离,其仅通过一个docker daemon/engine来实现资源限制与环境隔离( 终极目标是app的隔离 )(主要利用 linux内核 本身支持的容器方式来实现这一功能),其中APP+BINS/LIBS为容器(container)docker daemon/engine可以简单看成对Linux内核中的NameSpaceCgroup、镜像管理文件系统操作的封装。 简单的说,docker利用namespace实现系统环境的隔离;利用Cgroup实现资源限制;利用镜像实现根目录环境的隔离。

Cgroup

Linux CGroup全称Linux Control Group: 控制组; 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。

主要功能:

  • 限制资源使用,比如内存使用上限以及文件系统的缓存限制。
  • 优先级控制,CPU利用和磁盘IO吞吐。
  • 一些审计或一些统计,主要目的是为了计费。
  • 挂起进程,恢复执行进程。

cgroups子系统
cpu 子系统,主要限制进程的 cpu 使用率。
cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
memory 子系统,可以限制进程的 memory 使用量。
blkio 子系统,可以限制进程的块设备 io。
devices 子系统,可以控制进程能够访问某些设备。
net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
net_prio — 这个子系统用来设计网络流量的优先级
freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace
hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。


这个有点像线程与进程的区别其中又有点java虚拟机的有点,一次配置到处运行

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,
而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,
所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

1. 一个程序至少有一个进程,一个进程至少有一个线程。
2. 线程的划分尺度小于进程,使得多线程程序的并发性高。
3. 进程在执行过程中拥有独立的内存单元,而多个线程是共享内存,从而极大地提高了程序的运行效率。
4. 线程在执行过程中与进程还是有区别的。 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。 但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5. 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。 但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。 这就是进程和线程的重要区别。

它的优点

至于为什么会出现就是它的优点可以满足当前一些需求

  1. 轻量级:Docker 容器主要利用并共享主机内核,它并不是完整的操作系统,因此它更加轻量化。
  2. 灵活:它可以将复杂的应用程序容器化,因此它非常灵活和方便。 可移植:可以在本地构建 Docker
  3. 容器,并把它部署到云服务器或任何地方进行使用。
  4. 相互隔离,方便升级:容器是高度自给自足并相互隔离的容器,这样就可以在不影响其他容器的情况下更换或升级你的 Docker 容器了。
  5. 可扩展:可以在数据中心内增加并自动分发容器副本。 安全:Docker 容器可以很好地约束和隔离应用程序,并且无须用户做任何配置。

它的缺点

当然也有一些缺点
1.内核漏洞

Docker内核攻击对于容器化环境来说可能是致命性的,因为容器与主机共享相同的系统内核,因此单独信任容器内置保护机制是不够的。
容器的隔离性使得某个应用程序的漏洞不会直接影响到其他容器的应用程序,但是漏洞可能会破坏与其他容器所共享的单一的操作系统,进而影响机器上的其他容器。如果漏洞允许代码执行,那么它将在主机操作系统上执行,而不是在容器内执行;如果此漏洞允许任意内存访问,则攻击者可以更改或读取任何其他容器的任何数据。

2.数据分离
在docker容器上,有一些非命名空间的资源:

SELinux
Cgroups
file systems under /sys, /proc/sys,
/proc/sysrq-trigger, /proc/irq, /proc/bus
/dev/mem, /dev/sd* file system
Kernel Modules

如果攻击者可以利用当中的任意一个元素,都将拥有主机系统的操作权限。

3.资源开销

Docker由于宿主机上的所有容器是共享相同的内核和相同的资源,如果对某些资源(CPU、内存、磁盘等)的访问不受限制,那么异常的容器将占用整个宿主机的资源,从而影响其他容器的运行,影响应用程序。

4.套接字问题

容器在默认情况下都安装了docker Unix套接字(/var/run/docker.sock),此套接字,可以关闭、启动或者创建新的镜像。
当你的容器启动并共享套接字的时候,你就给了容器操控宿主机的权限,它将可以启动或终止其它容器,在宿主机拖入或创建镜像,甚至写入到宿主机的文件系统。正确配置和保护,可以使用docker容器实现高级别的安全性,但它的安全性还是低于正确配置的VM。
虽然,Docker容器还不算完美,但是瑕不掩瑜,它使得业务的上云部署更快,资源利用更高。并且云服务商也在不断完善Docker容器技术在云服务平台的应用。

三、实现原理是什么?

综述

Docker 对用户而言是一个简单的 C/S架构,主要也就是 Docker Client是与 Docker Daemon建立通信。

用户通过 Docker Client发起容器的管理请求,请求最终发往Docker Daemon,Docker Daemon 作为 Docker架构中的主体部分,首先具备服务端的功能,有能力接收 Docker Client发起的请求 ( 这里就有一个server 用于接收);其次具备Docker Client 请求的处理能力(这里需要有个Hander 用户处理请求)。

Docker Daemon内部所 有的任务均由 Engine来完成,且每一项工作都以一个 Job 的形式存在(job可以看作一个执行单位)。

Docker Daemon 需要完成的任务很多,因此 Job的种类也很多。若用户需要下载容器镜 像, Docker Daemon则会创建一个名为"pull" 的Job ,运行时从 Docker Registry 中下载镜 像,并通过镜像管理驱动 graphdriver 将下载的镜像存储在 graph 中;若用户需要为 Docker 容器创建网络环境,Docker Daemon则会创建一个名 “allocate interface” 的Job ,通过网络驱动 networkdriver 分配网络接口的资源……

libcontainer 是一套独立的容器管理解决方案,这套解决方案涉及了大量 Linux 内核方面 的特性,如: namespaces cgroups 以及 capabilities等。 libcontainer很好地抽象了 Linux的内 核特性,并提供完整、明确的接口给 Docker Daemon当用户执行运行容器这个命令之后,一个 Docker 容器就处于运行状态,该容器拥有隔 离的运行环境、独立的网络椅资源以及受限的资源等。

各个模块

Docker Server Docker 架构中专门服务于 Docker Client,它的功能是接收并调度分发 Docker Client发送的请求。

Engine, Docker架构中的运行引擎,同时也是Docker运行的核心模块。 Engine 存储着大量的容器信息,同时管理着 Docker大部分 Job的执行。

Job 可以认为是Docker架构中 Engine内部最基本的工作执行单元。

Graph Docker 架构中扮演的角色是容器镜像的保管者。

Driver Docker架构中的驱动模块。通过 Driver驱动,Docker可以实现对 Docker 器运行环境的定制,定制的维度主要有网络环境、存储方式以及容器执行方式。

libcontainer,Docker 架构中一个使用 Go语言设计实现的库,目的是为了该库可以 不依靠任何依赖,直接访问内核中与容器相关的系统调用。 正是由于 libcontainer 的存在, Docker可以直接调用libcontainer ,而最终操作容器的namespaces cgroups apparmor 、网络设备以及防火墙规则等。

Docker Container (Docker 容器)是 Docker架构中服务交付的最终体现形式。 Docker,DockerDaemon 的管理, libcontainer的执行,最终创建 Docker 容器。

四、docker 常用命令是什么?

docker安装

wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.cloud.tencent.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
sudo yum makecache fast
sudo yum install -y docker-ce

docker-compose安装

curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

国内镜像配置

vi /etc/docker/daemon.json

添加以下内容:

{"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
当然可以从下面的替换
Docker中国官方镜像加速
--registry-mirror=https://registry.docker-cn.com网易163镜像加速
--registry-mirror=http://hub-mirror.c.163.com中科大镜像加速
--registry-mirror=https://docker.mirrors.ustc.edu.cn阿里云镜像加速
--registry-mirror=https://{your_id}.mirror.aliyuncs.comdaocloud镜像加速
--registry-mirror=http://{your_id}.m.daocloud.io

补充

  • 进入容器
    通常使用第二种方式,docker exec后面跟的常见参数如下:

- d, --detach在容器中后台执行命令; - i, --interactive=true I false:打开标准输入接受用户输入命令

  • 查看日志

    导出的容器快照文件可以再导入为镜像
    docker logs [容器ID]

这个命令有以下常用参数 -f : 跟踪日志输出

--since :显示某个开始时间的所有日志 -t: 显示时间戳 --tail :仅列出最新N条容器日志

  • 复制文件

从主机复制到容器
sudo docker cp host_path containerID:container_path
从容器复制到主机
sudo docker cp containerID:container_path host_path


可以在控制台输入完整的命令进行查看帮助说明

[root@localhost ~]# docker --helpUsage:  docker [OPTIONS] COMMANDA self-sufficient runtime for containersOptions:--config string      Location of client config files(default "/root/.docker")-c, --context string     Name of the context to use to connectto the daemon (overrides DOCKER_HOSTenv var and default context set with"docker context use")-D, --debug              Enable debug mode-H, --host list          Daemon socket(s) to connect to-l, --log-level string   Set the logging level("debug"|"info"|"warn"|"error"|"fatal") (default "info")--tls                Use TLS; implied by --tlsverify--tlscacert string   Trust certs signed only by this CA(default "/root/.docker/ca.pem")--tlscert string     Path to TLS certificate file (default"/root/.docker/cert.pem")--tlskey string      Path to TLS key file (default"/root/.docker/key.pem")--tlsverify          Use TLS and verify the remote-v, --version            Print version information and quitManagement Commands:app*        Docker App (Docker Inc., v0.9.1-beta3)builder     Manage buildsbuildx*     Build with BuildKit (Docker Inc., v0.6.3-docker)config      Manage Docker configscontainer   Manage containerscontext     Manage contextsimage       Manage imagesmanifest    Manage Docker image manifests and manifest listsnetwork     Manage networksnode        Manage Swarm nodesplugin      Manage pluginsscan*       Docker Scan (Docker Inc., v0.9.0)secret      Manage Docker secretsservice     Manage servicesstack       Manage Docker stacksswarm       Manage Swarmsystem      Manage Dockertrust       Manage trust on Docker imagesvolume      Manage volumesCommands:attach      Attach local standard input, output, and error streams to a running containerbuild       Build an image from a Dockerfilecommit      Create a new image from a container's changescp          Copy files/folders between a container and the local filesystemcreate      Create a new containerdiff        Inspect changes to files or directories on a container's filesystemevents      Get real time events from the serverexec        Run a command in a running containerexport      Export a container's filesystem as a tar archivehistory     Show the history of an imageimages      List imagesimport      Import the contents from a tarball to create a filesystem imageinfo        Display system-wide informationinspect     Return low-level information on Docker objectskill        Kill one or more running containersload        Load an image from a tar archive or STDINlogin       Log in to a Docker registrylogout      Log out from a Docker registrylogs        Fetch the logs of a containerpause       Pause all processes within one or more containersport        List port mappings or a specific mapping for the containerps          List containerspull        Pull an image or a repository from a registrypush        Push an image or a repository to a registryrename      Rename a containerrestart     Restart one or more containersrm          Remove one or more containersrmi         Remove one or more imagesrun         Run a command in a new containersave        Save one or more images to a tar archive (streamed to STDOUT by default)search      Search the Docker Hub for imagesstart       Start one or more stopped containersstats       Display a live stream of container(s) resource usage statisticsstop        Stop one or more running containerstag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGEtop         Display the running processes of a containerunpause     Unpause all processes within one or more containersupdate      Update configuration of one or more containersversion     Show the Docker version informationwait        Block until one or more containers stop, then print their exit codesRun 'docker COMMAND --help' for more information on a command.To get more help with docker, check out our guides at https://docs.docker.com/go/guides/

参考

《Docker源码分析》公众号@孙中明,回复3001,获取电子版
https://segmentfault.com/a/1190000038921337
https://tomones.github.io/2020/08/27/Docker%20%E6%9C%89%E4%BB%80%E4%B9%88%E4%BC%98%E7%82%B9%EF%BC%9F%E4%BD%BF%E7%94%A8%E6%97%B6%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98%EF%BC%9F/
https://yifdu.github.io/2019/06/10/%E8%8F%9C%E9%B8%9F%E5%AD%A6docker%EF%BC%88%E4%B8%80%EF%BC%89/
https://jaminzhang.github.io/docker/Docker-Introduction/#top5
https://carlos9310.github.io/2018/03/01/docker-and-vm/
https://www.cnblogs.com/michael9/p/13039700.html

十分钟看懂docker相关推荐

  1. 10分钟看懂Docker和K8S,docker k8s 区别(生动形象,清晰易懂)

    本文来源:鲜枣课堂 原创时间:2018年12月25日 查看docker和k8s的资料看到这篇文章,感觉讲的很好容易理解,整理到自己这里,当作记录,方便查阅 2010年,几个搞IT的年轻人,在美国旧金山 ...

  2. 十分钟看懂图像语义分割技术

    转载于:十分钟看懂图像语义分割技术 大多数人接触"语义"都是在和文字相关的领域,或语音识别,期望机器能够识别你发出去的消息或简短的语音,然后给予你适当的反馈和回复.嗯,看到这里你应 ...

  3. 苹果发展到计算机,从天堂到地狱 十分钟看懂AIO兴衰存亡

    一体电脑真正被大众所熟知的时间虽然并不长,但短短几年之间,一体电脑行业却经历了从快速发展,到鼎盛,再到衰落的全过程.OEM厂商曾经看好这片土地,也为此付出了诸多努力,但对于消费者而言,一体电脑倒在了性 ...

  4. 干货满满!10分钟看懂Docker和K8S(转)

    转载地址:https://my.oschina.net/jamesview/blog/2994112 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud" ...

  5. 10分钟看懂Docker和K8S

    戳蓝字"CSDN云计算"关注我们哦! 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司. 这家公司主要提供基于PaaS的云计 ...

  6. 十分钟看懂什么是VoLTE

    你是不是遇到过下面这个情景: 正在用手机玩游戏--玩得正嗨,胜利在望-- 突然,来电话了-- 我勒个去!-#^%$^@ 完蛋--断网-- 这个时候的你,是不是很抓狂,是不是很想死? 其实,不止是游戏, ...

  7. 十分钟看懂语义分割技术【转载】

    大多数人接触 "语义" 都是在和文字相关的领域,或语音识别,期望机器能够识别你发出去的消息或简短的语音,然后给予你适当的反馈和回复.嗯,看到这里你应该已经猜到了,图像领域也是存在 ...

  8. 十分钟看懂图像语义分割技术(转载)

    https://www.leiphone.com/news/201705/YbRHBVIjhqVBP0X5.html 大多数人接触 "语义" 都是在和文字相关的领域,或语音识别,期 ...

  9. 十分钟看懂数据库——数据库入门级语言总结

    从sql入门经典,到sql视频,再到自考的数据库系统原理,不知不觉中我们已经走进了数据库的世界,那么什么叫数据库,他又是干什么用的呢? 咱们先看一下百度给的解释啊. 数据库(Database)是按照数 ...

最新文章

  1. Google 顶级论文:机器学习系统,隐藏多少技术债?
  2. 互联网人的《三十而已》:裸辞,催婚,职业瓶颈,逃离北上广深......
  3. const 内联 枚举 宏
  4. 每天一道LeetCode-----实现LFU置换算法
  5. 数列求和 java_[代码展示]数列求和
  6. Hadoop 系列 HDFS:分布式文件系统(HDFS文件读写)
  7. 《HTML5移动Web开发实战》—— 1.6 在移动网站中使用HTML5
  8. layUI table 按条件搜索 结果整个页面刷新
  9. qt及qt quick开发实战精解_Qt5实战001:Qt 5.15下载安装详解
  10. jquery 插件解决IE6 PNG不透明
  11. 酒店消防安全知识培训PPT模板
  12. 市场调研策划书_市场调研计划书模板
  13. 分享几点在UG中常用的快捷键!
  14. 2022-2028年中国通信大数据行业深度调研及投资前景预测报告
  15. 重磅推荐 | 我精选的15个电子书下载网站!
  16. 杜兰大学计算机专业,杜兰大学计算机科学专业详解.docx
  17. java 异常恢复_Java学习之异常处理
  18. 苹果5港行和大陆行货的区别
  19. 【沃顿商学院学习笔记】商业基础——Operation Management:02运营管理活动中的详细流程分析
  20. 预估市场过万亿,“即时零售”到底是什么来头?

热门文章

  1. python 回文联问题
  2. Meet The Greeks
  3. .NET 跨平台界面框架和为什么你首先要考虑再三
  4. python编译make_编译安装python3时make install出错
  5. 教你如何将视频去除水印
  6. 【课程总结】数据网络协议基础-第二章 信息网络建模理论
  7. 面试时计算机工程自我介绍范文,计算机专业大学生面试自我介绍范文
  8. ArcGIS安装的关键步骤
  9. Yolov7训练自己的数据-水果检测
  10. S32K144功耗管理与系统模式控制