博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019/07/3 docker入门(02)
阅读量:3922 次
发布时间:2019-05-23

本文共 7706 字,大约阅读时间需要 25 分钟。

容器就是利用或内核或用户空间的,众多技术联合起来,将用户空间能分割成多个空间,而每个空间能够提供,一个完整意义上程序运行环境,容纳了文件系统和进程,以及彼此之间隔离的组件

容器的核心组件主要有两个,
namespaces
控制组 cgroups
chroot
利用这些内核级的功能,开发了应用程序,在应用程序上实现容器应用的,
主要代表lxc(虽然轻量,但是部署不轻量,迁移也不轻量),或者使用共享存储,对应的把容器部署在贡献存储上面,默认启动在第一主机上,如果主机出现故障,换一个主机可以启动起来,跟虚拟机类似
openvz
在这里插入图片描述
**lxc并不轻量,所以有了docker,把lxc和cgroups合起来做了一次二次封装,提供了更易用的容器管理界面和容器使用逻辑,docker只是一个让容器更加易用的前端管理工具
**在这里插入图片描述在这里插入图片描述
早期的docker确实是使用lxc来完成容器功能的,容器真正的运行环境是在内核级的,name spaces,cgroups,lxc只不过提供了管理调用接口的功能,
但docker觉得lxc提供的接口功能并不方便易用,因此尝试去改造lxc,或者也可以理解为去研发自己的容器实现,libcontainer
可以docker自己利用libcontainer调用了namespaces和chroot功能研发了容器自有的实现,并且libcontainer也没有存在太久,到了下一阶段,变成了runc
runc也并非唯一的容器实现方案
但是到了容器的战国时期,各个公司都提出了解决方案,并且为了留住用户,不兼容其他公司的容器,所以用户再切换的时候将会无法访问,这时候就需要有人站出主打容器标准化
docker从13年开始活,现在流行容器编排工具,k8s
容器这种再google其实已经跑了十几年了
谁控制了标准,谁就能指定容器的标准,docker就需要把代码开源出来,含泪共享出来
oci标准

在这里插入图片描述

lxc对应的容器运行时其实是对应的跟文件系统之下的某一个目录比如/var/lib/lxc/c1,把这个目录当作容器的跟目录,包含了其他文件,迁移到其他的主机上非常难,
在docker解决方案是,利用跟虚拟化技术一样的解决方案,不再单独地以目录来描述容器运行环境而是使用一个镜像文件,把所有文件打包在一个镜像文件里
容器时代为了通用,指定了打包这个镜像文件的格式表示,叫image spec,image只是构建出的静态的镜像文件,需要把镜像文件启动起来,
镜像文件要运行起来才能叫一个容器,启动以后,怎么根据格式去分配cpu内存磁盘,如何去准备运行环境,需要哪些东西,也需要有定义一个规范
容器运行时规范 runtime spec

Open Container Initiative 开放容器格式

由Linux基金会主导于2015年6月创立
旨在围绕容器格式和运行时制定一个开放的工业化标准
contains two specifications
runtime规范 the Runtime Specification (runtime-spec)
image规范 the Image Specification (image-spec)

** The Runtime Specification outlines how to run a “filesystem bundle”

that is unpacked on disk
At a high-level an OCI implementation would download an OCI Image
then unpack that image into an OCI Runtime filesystem bundle**在这里插入图片描述OCF:Open Container Format开放容器格式
runC is a CLI tool for spawning and running containers according to the OCI specification
用于启动和容器的命令行工具
Containers are started as a child process of runC and can be embedded into various other systems without having to run a daemon
runC is built on libcontainer, the same container technology powering millions of Docker Engine installations
基于libcontainer构建的容器管理器

**现在docker用的容器技术已经不是lxc也不是libcontainer而是runc,OCI之下的,对应CCF格式之上的,容器实现方案,docker定义了开源容器的标准

容器真正跨主机良好运行,得需要一个容器编排工具,要使用三个容器,一个运行,mysql,tomcat,nginx,谁先启动谁后启动,彼此关联关系,需要定义
docker官方编排工具,docker machine
google内部有个报表系统。BORG,几十万个容器的编排工具,Google是相当有经验
所以docker在编排领域是弄不过google的
Kubernetes已经拿到OCI定义了,拿到牌照,成为标准了
K8S在用的时候,更多引用的还是docker,玩转docker才能玩转K8S
在这里插入图片描述
docker把提供运行容器的环境打包成一个镜像文件,所以迁移变的简单了,
docker在组织镜像的时候,采用非常精巧的方式,分层构建,联合镜像,分层构建的联合文件系统,把一个镜像开源分成N层,而不是一层构成的
第一层基础层,最小安装内容,后面改动的时候,不改动底层镜像,在这个镜像文件之上再加一层,这个层有底层不具有的功能,挂载时可以先挂载第一层,再挂载第二层,联合起来用户看起来就像是直接提供的文件一样,所以叫联合挂载的文件系统,而这么一来,每一层都时只读的,每一层都可以在底层的基础上,完成底层文件功能的编辑,
比如底层只提供最小文件安装,在底层上提供一个httpd的环境,挂载的时候叠加,增文件好增,
但是要在底层文件删除文件,是删不掉的,只能标记不可见,在上面的层标记底层文件不可见,
假设一个镜像有三层,基于这个镜像,启动一个容器以后,镜像是只读的,不能写数据,所以每一次基于容器挂载启动以后,这个容器必须在所有镜像层的最上层,再附加一层,这个层可写层,用户可读可写,删除内容只是标记为不可见,最上一层才是真的读写层,
将来做镜像分发时,底层可以只有一个,上级的各种变化,只需要用读写层,就 能完成各种系统的创建了,
三个300M的镜像文件,其实只需要500M,因为300M可能是底层镜像文件共享
带来的坏处可能 是文件系统较差,毕竟创建文件,删除文件只能用最上层来实现,作为用户来讲,也可以在已有的层上,构建自己的层,这就是镜像文件,但对于用户看到的就是最终的结果,这个镜像有几层你可能不知道,
在这里插入图片描述
**
1docker用这种方式来把所有用于容器的文件构建成镜像,而且用分层的镜像
2.docker又采用另外的方式,镜像是只读就可以共享,只要不包含自己的独有数据,可以共享给所有人使用,
找一个主机把所有的镜像放在一个主机上,而且提供给用户一个访问接口,任何人可以取到本地,下载安装到本地来,镜像库可以有多个,同一个镜像可以有N版,都放在同一个库可以
用户以后再去启动容器,只需要自动连接到远程服务器上,按用户所指定的镜像文件名,找一个名称匹配的镜像文件,拖到本地来,并基于此镜像启动一个容器。
在另外一个主机启动也一样,容器不用迁移,当即下载当即使用
容器启动以后会创建很多文件,容器上有文件,将来想要迁移,基于这个镜像启动容器的时候,产生的文件,一般不存储在镜像文件里和,容器里,而应该容器挂载一个外部存储设备,比如卷,iscsi,挂载的卷上,所有文件都存储在外部存储上,容器只要挂载此前的卷,数据就来了,
容器就有了生命周期,启动开始,关闭消亡
程序=指令+数据,容器也类似=外部存储+镜像,持久只是镜像,容器是按需要创建的,
在这里插入图片描述
简单来讲,物理机有很多存储空间,启动容器,容器跑起来后,,所有数据都放在物理机/宿主机上,容器蹦了没事,基于同一镜像再启动一个即可,数据还在,不变的数据打包在镜像内,变化的数据放在外部的卷上,将来部署应用程序,就成了部署镜像了

docker的架构在这里插入图片描述

三个角色
docker_host 运行容器的主机
client
registry 仓库,注册表,帮你管理镜像文件仓库的,一个镜像文件有多个版本组成一个仓库,比如同一程序不同版本的镜像文件组成一个仓库,一个仓库只包含一个程序的多个版本,
所有镜像有两类,
基础镜像(操作系统)和基础镜像上附加的服务
如果你的镜像是ubuntu,你的nginx就需要先获取ubuntu联合,如果你的镜像是cnetos,就需要,nginx联合 centos
基础的系统镜像库(centos ,5,6,7)
redis每一个版本就是不同的仓库,不同的版本就组成的redis仓库的仓库,centos也有仓库,nginx也有仓库,所有仓库是裸仓库,裸仓库就是在这个操作系统上直接使用的仓库,有些仓库还可以到用户级别的,
比如这个仓库是托管的,允许用户自己创建镜像,以用户为单位创建magedu仓库,这个仓库内部可以有centos,ngixn的各种仓库,这种就是用户仓库,
不附加用户,直接使用的称为裸仓库
有多少仓库,仓库有多少镜像,镜像有多少标签,需要有一个目录去搜索,所以在仓库之外需要提供一个目录让用户实现快速搜索,索引,里面标记了每个仓库的名称
这个索引结合了众多仓库结合起来,生成的服务就叫registry,注册表
在这里插入图片描述在这里插入图片描述1.docker_host 运行容器的主机,运行在某个主机之上的docler进程
2.registry,里面映射了此前做好的镜像,
当用户试图去启动一个容器的时候 ,一般使用docker的客户端命令,向docker的daemon发起,daemon输出的API,不可能进行手动去操作API,得使用客户端工具,与服务器使用http协议通信。,resultfull风格的API,
docker_run表示需要创建启动一个容器 了,发给docker_daemon,告诉daemon用哪个镜像文件,得需要看本地有没有这个镜像,如果有直接启动容器,
如果没有,daemon负责到你配置好的仓库上,检索这个镜像,检索到了,就先下载到本地,然后在本地启动一个镜像,
如果远程仓库没有你所指定的镜像,报错启动不了,
所以docker的核心有三个
1.client
2.daemon
3.registry
物理角度,核心组件有三个
1,。容器
2.镜像image
3.镜像库,registry
在这里插入图片描述
三个组件在这里插入图片描述The Docker daemon
The Docker daemon (dockerd) listens for Docker API requests and manages Docker objects such as images, containers, networks, and volumes. 监听在套接字上,监听dockerapi的请求并完成管理docker对象,,容器,网络,卷
4个核心docker对象 images 镜像, containers 容器, networks 网络, and volumes卷

v The Docker client命令行工具

The Docker client (docker) is the primary way that many Docker users interact with Docker.
ɝ The docker command uses the Docker API.
用docker_daemon api来和daemon进行交互,发出请求
** Docker registries
ɝ A Docker registry stores Docker images. Docker Hub and Docker Cloud are public registries that anyone can
use, and Docker is configured to look for images on Docker Hub by default.
ɝ You can even run your own private registry.**

虽然仓库便捷了使用方式,但是还有一点麻烦在于,镜像从哪来,仓库在哪,做镜像是一个 痛苦的事情,仓库不需要我们自己去建立,docker官方提供了一个在互联网上公开的仓库 Docker Hub,允许用户托管代码的https://hub.docker.com/search?source=verified&type=image

https://hub.docker.com/_/centos在这里插入图片描述
每一个仓库都是一个镜像,下载某个仓库,不但要指明镜像标签才行,默认是latest,自己建立的镜像可以放到docker.hub也可以不想公开,公共的,私有的就是收费
也可以使用gitlab,不像使用docker.hub,可以创立自己的私有仓库,your own private registry
在这里插入图片描述When you use Docker, you are creating and using
docker几个对象
images 只读,分层构建,联合挂载, containers, networks, volumes, plugins,
and other objects.
ɝ IMAGES
ɰ An image is a read-only template with instructions for creating a Docker container.
ɰ Often, an image is based on another image, with some additional customization.
ɰ You might create your own images or you might only use those created by others and published in a registry.
ɝ CONTAINERS
ɰ A container is a runnable instance of an image.
ɰ You can create, run, stop, move, or delete a container using the Docker API or CLI.
ɰ You can connect a container to one or more networks, attach storage to it, or
even create a new image based on its current state.在这里插入图片描述
使用docker之前需要安装docker程序,依赖3.10以后的内核,centos6是2.4.2,天生就不适用docker,红帽打了补丁,才可以使用,所以早期docker都在ubuntu上跑,因为ububtu的更新
docker的分层构建技术,依赖于内核级的联合文件系统,而这个文件系统没有被收录进内核树,要想使用,需要给内核自己打补丁,重新编译
联合文件系统 日本人开发,30000多行,李娜丝本人嫌弃太多,一个内核才几千行

后来这种联合文件系统可以用dm设备映射,基于DM也能实现分层镜像和联合挂载,devicematter

而再ubuntu用的是联合挂载镜像,联合文件系统,unionfs,,但是据说DM性能很差,建议使用UNIONFS,但是红帽不支持。在这里插入图片描述依赖的基础环境
ɝ 64 bits CPU
ɝ Linux Kernel 3.10+
ɝ Linux Kernel cgroups and namespaces

v CentOS 7

需要配置 “Extras” repository 仓库
https://mirrors.aliyun.com/centos/7/extras/
https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/在这里插入图片描述
Docker Daemon
ɝ systemctl start docker.service
v Docker Client
ɝ docker [OPTIONS] COMMAND [arg…]

有extras仓库,说明可以直接使用在这里插入图片描述在这里插入图片描述

直接安装在这里插入图片描述
配置文件再/etc/docker目录下在这里插入图片描述
unitfile 在这里插入图片描述
在这里插入图片描述
可以配置docker使用哪个仓库,不指明仓库,指的就是官方的仓库
add_registry 添加额外仓库,要求安全,要求你的协议必须是https
如果你建的仓库没有提供https协议,就不让你访问了
在这里插入图片描述
**允许使用非安全仓库,是http协议,而非https协议
**
在这里插入图片描述

阻断对网络仓库的访问

在这里插入图片描述
在这里插入图片描述
启动服务在这里插入图片描述
默认监听在本机,sortfile在这里插入图片描述
默认只允许在本机允许在这里插入图片描述
所以docker不能进行远程通信,要想远程通信,需要让docker监听在一个套接字上在这里插入图片描述在这里插入图片描述
images列出本地镜像的
镜像的tag标签
镜像自己的ID image id
创建时间created
大小size
在这里插入图片描述
下载镜像可以去search搜索 docker hub在这里插入图片描述
docker.io直接开始就表示裸仓库的镜像,是官方提供的
在这里插入图片描述
如果中间加了名称就代表,用户名的一个 仓库
在这里插入图片描述
点赞的,次数越多,越靠谱
在这里插入图片描述
官方的
在这里插入图片描述
自动构建的,还是手工构建的
在这里插入图片描述
这只是一个仓库。pull下载一个镜像:跟上标签,不跟就是latest在这里插入图片描述
基于这个 镜像就可以使用容器了,需要先创建再运行
直接运行用run,表示既创建又运行
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
运行结束直接删除
在这里插入图片描述
交互式接口
在这里插入图片描述
赋予一个终端
在这里插入图片描述
让镜像附加到网络上
在这里插入图片描述
启动docker就自动给创建了一个桥,nat桥,172.17.0。1是docke配置好的,也可以进行修改在这里插入图片描述
只要不是从172.16.。。0.1网络出去,就进行masqurcerade在这里插入图片描述
docker0默认应该启动了dhcp服务
–name容器名字 -it 指明基于busybox镜像来允许
在这里插入图片描述、跑一个centos的镜像试试,没指明标签就是latest,没指明仓库就是官方仓库在这里插入图片描述在这里插入图片描述
这个是提供ifconfig的在这里插入图片描述
默认的docker程序终止,对应容器也就停止了,但是容器应该都还在在这里插入图片描述
rm来删除容器在这里插入图片描述在这里插入图片描述

转载地址:http://pckgn.baihongyu.com/

你可能感兴趣的文章
HITS算法--从原理到实现
查看>>
MapReduce原理
查看>>
zookeeper原理
查看>>
MapReduce入门
查看>>
WEB服务器、应用程序服务器、HTTP服务器区别
查看>>
小白入门:大型网站技术架构负载均衡技术
查看>>
归并排序(JAVA)
查看>>
对Java Serializable(序列化)的理解和总结
查看>>
Netty Buffer(缓冲)
查看>>
Docker简单介绍
查看>>
.ftl文件 是什么文件
查看>>
数据结构与算法--栈、队列(队列)
查看>>
分段,分页与段页式存储管理
查看>>
动态规划
查看>>
增强学习(一)——马尔科夫决策过程(MDP)
查看>>
增强学习(二)——策略迭代与值迭代
查看>>
IPv6地址表示方法详解
查看>>
数据库三级模式
查看>>
Shiro连载-----2.Shiro身份验证
查看>>
Mybatis之PageHelper使用文档
查看>>