容器与镜像
容器通过运行镜像来启动,镜像是可执行的软件包,其中包含运行应用程序时所需的一切资源—代码、运行时、库、环境变量和配置文件。
容器是镜像可运行的实例,运行中的容器是位于内存中的且有状态的镜像,本质上是一个用户进程。docker的应用程序以容器的形式来部署和运行,一个镜像可以用来创建多个容器。
使用容器来部署应用程序被称为容器化(containerization),默认情况下,容器使用沙箱机制,容器与主机和其他容器之间不会有任何接口,能够相互隔离。
镜像是用于创建docker容器的只读模板,容器是从镜像创建的运行时实例,容器和镜像之间的关系类似于面向对象编程中的对象和类的关系。从应用程序的角度来看,镜像是应用程序生命周期的构建和打包阶段,容器则是启动和运行阶段。
容器和虚拟机

容器与其他容器共享主机的操作系统内核,容器引擎将容器当作进程在操作系统上运行, 依赖于主机操作系统的内核版本。容器在主机操作系统的用户空间内运行,与其他操作系统进程相互隔离,启动时也不需要启动操作系统的内核空间。
虚拟机(VM)运行一个完整的客户端操作系统,并通过虚拟机管理程序以虚拟方式访问主机资源,虚拟机提供的环境所包含的资源超出了大多数的应用程序的实际需要。虚拟机有自己的操作系统,独立于主机的操作系统,其操作系统内核可以和主机不同。
docker引擎
服务器:即docker守护进程,是docker后台应用程序,可使用docker命令进行管理,可用于创建和管理docker对象
REST API:定义程序与docker守护进程交互的接口,便于编程操作
客户端:命令行接口(CLI),可使用docker命令进行操作
docker架构
docker使用客户/服务器架构

docker守护进程相当于docker服务器,负责构建、运行和分发容器的繁重任务
docker客户端与docker守护进程可以在同一个系统上运行,也可以将docker客户端连接到远程主机上的docker守护进程
docker客户端和docker守护进程通过REST API使用UNIX套接字或网络接口进行通信
docker注册中心用来存储docker镜像,使用docker pull或者docker run时,所请求的镜像会从所配置的docker注册中心拉取到本地,当使用docker push时,镜像会被上传到所配置的注册中心
docker底层技术
名称空间
Linux的名称空间机制提供了一种资源隔离的解决方案,docker通过名称空间为容器提供了隔离的空间工作
名称空间又称命名空间,是对全局系统资源的一种封装隔离技术,使得处于不同名称空间的进程拥有彼此独立的全局资源,改变一个名称空间的系统资源只会影响当前名称空间中的进程,不会影响其他名称空间中的进程,PID(进程ID),IPC(进程间通信),网络等系统资源不再时全局性的,而是属于特定的名称空间
容器的本质是进程,不同容器内的进程属于不同的名称空间,彼此透明,互不干扰
docker引擎使用下列几个类型的Linux名称空间来实现特定的资源隔离管理功能
PID名称空间:用于进程隔离
网络名称空间:用于管理网络接口
IPC名称空间:用于管理IPC资源的访问
挂载名称空间:用于管理文件系统挂载点
UTS名称空间:用于隔离内核和版本标识符
用户名称空间:用于提高安全性,避免容器内进程获取额外的权限
控制组
控制组是Linux内核提供的可以限制、审计、隔离进程组所使用的物理资源(CPU,内存,IO等)的一种机制。docker引擎使用控制组设置容器使用的资源
每个容器都是一个或一组进程,可以作为一个控制组
联合文件系统
将其他文件系统合并到一个联合挂载点的一个文件系统,支持提交文件系统中的变更信息,每提交一次就产生一层,并且层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
联合文件系统是docker镜像的技术基础,docker镜像可以通过分层进行继承
容器格式
docker将名称空间、控制组和联合文件系统打包到一起所用的就是容器格式,默认的容器格式是libcontainer。
libcontainer是docker用于容器管理的软件包,通过管理名称空间、控制组、Linux能力及文件系统等进行容器控制。
启动docker并进行测试

docker采取了以下步骤:
1.docker客户端联系docker守护进程
2.docker守护进程从docker hub 中拉取了“hello world"镜像
3.docker守护进程基于该镜像创建了一个新容器,该容器运行可执行文件并输出当前正在阅读的消息
4.docker守护进程将该消息流式传输到客户端,由它将此消息发送到客户终端
安装docker之后的配置
配置docker开机自动启动
systemctl enable docker
禁用docker守护进程开机启动
systemctl disable docker
配置镜像加速器
以非root用户身份管理docker
在使用docker命令时,如果不想使用sudo,可以创建一个名为docker的组并向其中添加用户。docker守护进程启动时,它将创建一个UNIX套接字,可由docker组成员访问,docker组将授予等同于root的特权
步骤:1.创建docker组
sudo groupadd docker
2.向docker组中添加用户
sudo usermod -aG docker 用户名
3.重启虚拟机

开启docker远程访问
docker命令
通过运行不带任何选项和参数的docker命令可以得到一份完整的命令列表
docker
运行docker COMMAND --help来查看某条命令的具体信息
分类:
系统信息:info,version......
系统运维:attch,build,commit,run......
日志信息:events,history,logs......
docker注册:login,pull,push,search......
docker命令的基本语法格式:
docker [OPTIONS] COMMAND
docker 选项 子命令
子命令又有各自的选项和参数
选项既可以用短格式(-):一个连字符加上单字符
长格式(--):两个连字符加上字符串
短格式选项可以组合在一起使用
对于较长的单行命令通常使用续行符(\)进行换行,这样的命令在命令行窗口中输入时,换行会在下一行开头显示">"符号表示是上一行的延续
docker API
分类:
引擎API:是docker最主要的API,提供对docker守护进程的编程访问接口
注册中心API:用于将镜像发布到docker引擎
DTR API:提供对docker可信注册中心部署的编程访问接口
UCP API:提供对通用控制面板部署的编程访问接口
docker配置文件格式
JSON格式
是一种轻量级的数据交换格式,是基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
JSON数据表示
对象表示为键值对,在花括号中,键值对组合中键与值用冒号隔开,键名是字符串,值可以是合法的JSON数据类型,各数据项(键值对)之间用逗号隔开
{"firstName":"Bill","lastName":"Gates"}
JSON数组位于方括号中,数值必须是合法的JSON数据类型,如字符串
{"Google","Baidu","Taobao"}
YAML格式
不是标记语言,是一种数据序列化格式,用缩进格式表示层级关系
数据分为三种类型:
标量
序列
映射
应用:容器编排和堆栈部署
290

被折叠的 条评论
为什么被折叠?



