Docker 是 PaaS(Platform as a Service平台即服务) 提供商 dotCloud 开源的高级容器引擎,作为软件部署解决方案、可以将任何应用包装在Linux container容器中运行的工具。源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。它作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。主要有镜像(Image),容器(Container),仓库(Repository)三大重要概念。
【1】什么是docker
Docker通过客户端client来执行命令到守护进程Daemon从而操作docker的容器,而容器是通过镜像创建的,镜像是存储在仓库中的registry。
-Client 客户端 通过客户端执行命令,传给服务的守护进程,然后命令执行的结果传递给client。
-Daemon 守护进程 linux中对docker的支持控制作用,一个守护进程可以为多个进程进行守护。
-Image镜像,层叠只读文件系统,容器的基础。构建打包状态引导文件bootfs,
然后rootfs系统基础镜像系统也是只读状态,联合加载一次加载多个文件系统,叠加在一起。一个镜像可以放在另一个镜像里面。
-Container容器,通过镜像来进行启动,可以运行一个或者多个进程。是镜像执行基本单元。
在最顶部镜像系统,加载一个可写层。写时复制。
-Registry仓库,用来保存用户构造的镜像,分为公有和私有。Docker Hub共有类似github用来存放镜像
相关资料:
手册:https://docs.docker.com/get-started/
菜鸟教程:https://www.runoob.com/docker/docker-tutorial.html
【2】什么是容器Container
-为什么有容器
虚拟机virtual machine,之前比如我们利用VMware或者是virtualbox自己创建一个linux虚拟机,
可以在里面肆意玩耍,在window下看起来我们好像真的有一个linux系统,虚拟出来的感觉和真实差不多,
但是会占用我们资源cpu,你可以想一想,你的电脑运行可以同时运行几个虚拟机,会不会卡到爆。
另外是启动的比较慢,就是类似你开机一样,打开虚拟机也需要一定时间,相当于再开启一个系统。
那么既然这么笨拙,随着时代的发展,有一种新的技术Linux Containers容器也就是LXC。
所以说到容器也就是针对linux的。它可不是来模拟一个操作系统,
而且利用隔离特性,让不同容器进程互相感知不到,它接触的资源都是虚拟机,
从而实现更棒的虚拟化,LXC是进程级别的虚拟化。
-它是一种虚拟化方案
-依托于Linux操作系统级别虚拟化
-只能运行相同相似的内核操作系统
-依赖于Linux内核:Namespace和Cgroups(Control Groups)
-Namespace在代码中表现的-代码隔离。在操作系统中利用其系统资源的隔离,比如进程,网络,文件等。
-为了实现这种轻量级的虚拟化技术,隔离空间Namespace
-docker让容器中的进程误以为是一个独立的空间。
-Pid(Process ID) 进程隔离
-Net(Network) 网络接口
-Ipc(InterProcess Communication) 进程通信
-Mnt(Mount) 挂载点
-Uts(Unix TimeSharing System) 隔离内核版本标识
-另外需要隔离进程分配资源,Control Group控制组
-资源限定 master控制
-优先级设定
-资源计量
-资源控制
【容器的能力】
文件系统隔离:每个容器都是有自己root文件系统。
进程隔离:每个容器都运行在自己的进程环境中。
网络隔离:每个容器的虚拟网络接口和IP地址都是分开的。
资源隔离和分组:使用cgroups将cpu和内存之类的资源独立分给每个docker容器。
【优点】
启动快:容器里面的应用,直接就是底层系统的一个进程,类似你打开QQ
资源少: 容器不必占用不需要的资源,依赖宿主机的操作系统,多个容器可以共享资源。
体积小:容器文件比虚拟机文件要小很多,只要包含用到的组件即可。
【原理】
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。
docker管理容器的引擎,基于Linux系统,可以开启多个容器,用了个障眼法,
各个容器之间是相互隔离开来,进程,文件,网络等,但是实际上你在宿主机当中是可以看到他们的。
但是他们共用一个内核系统。所以对于mac或者win都必须启动一个虚拟机来提供Linux的内核
【3】什么是镜像Image
镜像(Image)就是一堆只读层(read-only layer)的统一视角。作为容器的基石。
它具有层叠的只读文件系统和联合加载(union mount)的技术。
统一文件系统Union FS(union file system)技术能够将不同的层整合成一个文件系统,
为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
除了最下面的一层镜像,其他的层的镜像都会有一个指针指向下一层。
所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,
其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像的存储位置:/var/lib/docker/
为什么强调只读?
对于docker的镜像和容器,特点就是,镜像作为基石,不能进行修改。
用户的操作层在镜像之上的容器,容器是一个可读可写的。
因此可以有这样一个结论:镜像+读写层=>容器
镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,
在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为 容器存储层。
镜像和容器的关系就像是面向对象程序设计中的 类 和 实例 一样,
镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。
因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。
【4】什么是仓库Registry
仓库就是集中存放镜像的地方,分为公共仓库和私有仓库。
每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。
我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。
如果不给出标签,将以 latest 作为默认标签。
例如:Ubuntu:16.04那么前面Ubuntu就是镜像名,后面16.04就是tag标签,
如果不加标签,默认会用最新的ubuntu:latest
仓库名经常以 两段式路径 形式出现,
比如 tacks/web,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。
【5】client与daemon
【C/s模式】
命令行交互
Docker的守护进程运行在宿主机上服务端server,
通过Docker的客户端命令行接口向Docker服务器发送命令,经过处理后将结果返回给客户端。
Remote API交互
docker客户端也可以由用户编写的程序来与守护进程通信
【通信】
Docker使用socket进行客户端和服务端的连接。
-c/s的连接方式
unix sock通信 /var/run/docker.socker(默认通信方式)
tcp host:port通信
fd sockefd通信
Docker的客户端与服务端可以在同一宿主机,可以在不同主机上
命令行交互
Remote API交互
客户端与服务端通信
【小结】
Docker 把应用程序及其依赖,打包在 image 文件里面,通过镜像才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。而镜像被存储在仓库Registry中,我们可以提交到自己私有的,也可以提交到公共仓库供大家使用。总是,如果你会用docker,那么构建你的服务将会很方便。