目录
1、原理简介
镜像( Image )和容器( Container )的关系,就像是面向对象程序设计中的 类 和 实一样,镜像是静态的定义,容器是镜像运行时的实体,有自己的生命周期。容器可以被创建、启动、停止、删 除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命 名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚 至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一 个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安 全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。
每一个容器运行时,是以镜像为基础层, 在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容 器存储层。 容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存 于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
容易就是在隔离的环境里运行的一个进程,这个隔离的环境有自己的目录文件,有自己的IP地址、主机名等,进程结束了容易也就死了。
2、仓库(Docker Registry)
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中可以包含多个仓库( Repository );每个仓库可以包含多个标签( Tag );每个标签对应一个镜像。
- 公有Docker Registry:
比如 时速云镜像仓库、网易云 镜像服务、DaoCloud 镜像市场、阿里云镜像库 等。
- 私有 Docker Registry:
用户还可以在本地搭建私有 Docker Registry
3、Docker容器的核心理念
Docker的本质是:在隔离的环境运行的一个进程
所以:docker容器内的第一个进程必须一直处于前台运行的状态(必须夯住),否则这个容器,就会处于退出的状态。
4、Linux的Ubuntu的支持
4.1 Linux的支持
namespace | 系统调用参数 | 隔离内容 | 内核版本 |
Mount | CLONE_NEWNS | 挂载点(文件系统) | 2.4.19 |
UTC | CLONE_NEWUTS | 主机名和域名 | 2.6.19 |
IPC | CLONE_NEWIPC | 信号量、消息队列、共享内存 | 2.6.19 |
PID | CLONE_NEWPID | 进程编号 | 2.6.24 |
Network | CLONE_NEWNET | 网络设置、网络栈、端口等 | 2.6.29 |
User | CLONE_NEWUSER | 用户和用户组 | 3.8 |
说明:在2.4.19版本的Linux只支持Mount的隔离,像其他的网络、用户都隔离不了,2.6.19、2.6.24、2.6.29、3.8等都是一样的。
Linux版本的docker支持性最好的是3.8版本以后
4.2 Ubuntu的支持
Ubuntu的内核版本一向都很高,早就到了5.0版本以上了,所以在Ubuntu上部署docker的有很多,为什么Ubuntu内核升级那么快,Centos的内核升级那么慢?
Ubuntu则适用于个人桌面,对新技术支持度更好,追求最新功能,内核版本版本较新,新的功能能及时推出同步,CentOS适用于服务器,更稳定些,支持时间也比较长,比较适合稳定线上环境,由于追求稳定性,所以内核版本往往比较旧,一些新功能的支持也跟不上。centos对运维更加友好一点。