Docker基础入门:什么是容器?什么是镜像?

Docker基础入门

Linux虚拟化产品(早期虚拟化)

从VMware说起

在Windows上装个VMware,下个镜像,然后可以装各种Linux虚拟机

KVM介绍

KVM就是安装在Linux上的虚拟机。以前没有Docker K8S的时候虚拟化就用的这个。当然VMware也有Linux版本的,但一般企业用的KVM,只不过KVM是拿命令实现VMvare那一堆东西。

以前云厂商的底层用的都是这个,KVM。只不过阿里现在变了,自己研发的飞天系统。

比如:你在阿里云买服务器,1核1G、4核8G啥的,不可能你买一台服务器,它就卖你个服务器,成本太高了。你买的一般都是虚拟机,说白了,就是跑在阿里服务器上的虚拟机。所以你可以选配置。你点点点,底层就是调用KVM创建虚拟机。

KVM相关概念:

VNC:远程连接工具,可以在你没有IP地址的情况下,服务器上只要起了VNC端口,就可以远程连接。

Openstack:图形化的编排KVM工具,可以将KVM做成集群,然后使用图形化创建,删除,克隆,快照…等等

一个Openstack能部署三个多月,各种组件、节点。

在这里插入图片描述

看到没有,跟阿里云很像。可以创建云主机、挂起云主机等等。很早以前云厂商底层都是在OpenStack的基础上改的。最底层就KVM做的虚拟机,这么一控制。

**但是这些现在被淘汰了。因为Docker出来了。**但没办法,现在很多云厂商底层还是这个,跑很多年了。

只不过阿里改成自己研发的,飞天系统

什么是Docker

https://docker-practice.github.io/zh-cn/

Docker也是虚拟化的衍生产品。只不过它效率比上面这些(KVM、VMware)高很多。比如你有个iso镜像,就可以用VMware起一台虚拟机,docker也类似。只不过它起的不管他叫虚拟机,我们叫容器

Docker 是 PaaS 提供商dotCloud开源的一个基于LXC技术的高级容器引擎,源代码托管在 Github 上,基于go语言并遵从Apache2.0协议开源。

**Docker是通过内核虚拟化技术(主要是namespace及cgroup)**来提供容器的资源隔离与资源限制等。由于Docker通过最底层操作系统层实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高了资源利用率。

Docker的编排工具:

类似KVM起的机器就是一台一台的没有关联,那就需要编排工具。Docker也一样。Docker的编排工具有Docker swarm、K8s、Mesos等。

小故事:

那时候Mesos(官方的) 和k8s都出来了,结果官方那个没人用,被干稀碎。现在更惨,现在大家都习惯用K8S了,我们要弃用Docker换其他容器(Docker替代品:containerd)。结果k8s最早出来是为docker研发的,要给docker弃用了。

不过现在用Docker和K8S的公司还很多。k8s最新版就不支持docker了。我们要装最后那个支持Docker的版本。

docker和k8s底层都是Go语言写的。Go这个语言也是Google的。

虚拟机与容器对比

架构对比

在这里插入图片描述

在这里插入图片描述

宿主机系统:Windows或者Linux都行。

其实,Windows上不用VMware用Docker上课也行。甚至,你在Windows上用Docker跑20个虚机跑项目都行。

特性对比

特性DockerVMware
启动速度秒级分钟级
硬盘使用一般为MB一般为GB
性能接近底层系统(原生)弱于原生
系统支持量单机支持上千个容器一般几十个
隔离性安全隔离,直接调用内核资源完全隔离

16G内存电脑拿docker起500个1核1g的都行。牛逼太多,叫容器了

什么是容器

很简单,容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止。

Docker起一个容器,就是拿命令运行了个进程。所以很轻量级。

我们都知道什么是程序和进程:

程序:开发写的代码。命令、脚本、软件等你磁盘上放着这些都是

进程:运行的程序,并不是永久存在。比如你关机,代码还在,进程不运行了

容器的隔离环境:拥有自己的ip地址、系统文件、主机名、进程管理等等。容器相当于新起了一台虚拟机。那么它们是怎么隔离开的?

怎么隔离?

namespace和cgroup介绍

一个做隔离,一个做限制

namespace:做资源隔离

什么是资源隔离:比如我要起一个1核1G的,你要起一个2核4G的,起俩容器

那他们的内存是不是要给它隔离开?不可能你内存不够去用另一个容器的。就是俩系统。但物理机上内存条只有一根

那起俩容器是不是起了两个进程?他们是不是都要占用内存?以前是不是一个占满系统会OOM杀进程?

但是Docker里就给你完全隔离开了。我起的虚拟机占不了你的,你的也占不了我的。

怎么隔离的,就是靠namespace。他们开发改内核参数(见下)。起一个容器就会调用参数


了解:

docker内核提供了namespace的机制用来隔离相关资源,namespace设计之初就是为了实现轻量级的系统资源隔离,可以让容器中的进程仿佛置身于一个独立的系统环境中。

Namespace系统调用参数隔离内容
UTCCLONE_NEWUTC主机名和域名
IPCCLONE_NEWIPC信号量,消息队列,共享内存
PIDCLONE_NEWPID进程号
NetworkCLONE_NEWNET网络设备,网络栈,端口
MountCLONE_NEWNS文件系统
UserCLONE_NEWUSER用户和用户组

cgroup

cgroups:限制一个进程能够使用的资源。cpu,内存,硬盘io

比如我一个2核4G的容器,我只允许你最多使用系统4G内存。给它做一个限制。

比如mysql多实例。我一个机器起4个MySQL,MySQL很占内存,那一旦某一个内存占满的话,会把其他MySQL杀掉,起不来

再比如,公司以前拿tomcat起多实例解耦,跑网站里的多个功能,10个tomcat,1个跑一个功能。1个内存占满的话,呵呵,其他用不了。比如,你只能看商品了,其他加购物车啥的都用不了了。

所以,后来我们的解决方案:起10个tomcat容器。满了也只是那个容器的内存打满了,不会把物理内存打满,不会影响其他tomcat。这就是Docker的好处。

cgroup的四大作用:

资源限制:例如设定任务指定内存   
优先级分配:比如起了10个容器,先给哪个分CPU?
资源统计:统计CPU,内存,IO等资源使用时长,该功能比较适合用于计费
任务控制:cgroup可以对任务进行运行,挂起,恢复等操作(容器启停)

Docker的三个重要概念

在这里插入图片描述

1、Images(镜像) 类似iso文件

说白了,就是用来装系统的。比如我镜像可以搞个Mac、也可以自己构建镜像,比如后面会构建Wordpress,一条命令起

Docker镜像可以看做是一个特殊的文件系统,除了提供容器运行时所需要的程序、库、资源、配置文件以外,还包含了一些为运行时,准备的配置参数(匿名卷,环境变量,用户等),**镜像是不可更改的。就像你装虚拟机时的iso文件,无论你安装了多少虚拟机,你没有更改过它。**后面装东西也只是装虚机上而不是镜像上。

所以如果我要构建镜像,就要先起个基础镜像,把它启动之后再在上面装应用。比如我搞个nginx+php镜像在搭wp、wecenter时都可以用,这个就是基础镜像。

2、Container(容器)

容器的定义和镜像,几乎是一模一样,唯一区别在于,我是在镜像基础上起的容器。说白了就是,我拿iso文件(镜像)起来个虚拟机(容器)。只不过容器是可读可写可更改,可以装应用的,装完也可以重新封装成镜像。

3、Repository(镜像仓库)

镜像仓库是Docker专门存放镜像的地方,类似于我们之前常用的代码仓库。通常一个仓库会包含,同一个软件,不同版本的镜像。我们可以通过<仓库名>:<标签>格式来指定具体使用哪个版本的镜像,如果不给标签,那么默认会以Latest作为默认标签。

docker镜像仓库有:

1、公有仓库,包含大部分官方镜像:https://hub.docker.com;

2、registry私有仓库;

3、harbor企业私有仓库,它是Docker Registry的更高级封装;

4、阿里云个人私有仓库。

yum仓库也是有公有的、官方的、私有的。Git:本地仓库;Github、Gitee:公有远程仓库、Gitlab:私有的

代码,一个公司的核心啊!!你卡卡上传到Github???哪怕你设为私有,Github这个公司的服务器也能看。所以一般不用Github、Gitee,而是Gitlab

Docker的组成

类似MySQL等应用,Docker也是传统的C/S架构,分为 docker client 和 docker server。只不过Docker不像MySQL客户端连服务端还要输用户名密码。Docker客户端是Docker用户与Docker交互的主要方式。当你使用Docker命令行运行命令时(比如docker run、docker ps等等),其实就是Docker客户端将这些命令发送给服务端,服务端执行这些命令。你不起服务端(daemon)时,大部分命令都没用,看版本也只是能看客户端版本。(见下节)

四种操作对象:镜像、容器、网络、存储

Docker命令使用Docker API
Docker客户端可以与多个服务端进行通讯

思考:我没有镜像这个概念行不行?只要容器行不行?为何不行?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值