共计 2557 个字符,预计需要花费 7 分钟才能阅读完成。
一句话总结
dockerfile:相似于“package.json”
Image:相似于”Win7 污浊版.rar“
Container: 一个残缺的操作系统
docker 是什么?
docker 是用 Go 语言实现的开源我的项目,能够让咱们不便的创立和应用容器,docker 将程序以及程序所有的依赖都打包到 docker container,这样你的程序能够在任何环节都会有统一的体现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的体现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系
容器技术 只隔离应用程序的运行时环境但容器之间能够共享一个操作系统,这里的运行时环境指的是程序运行依赖的各种库以及配置
留神,容器是一种通用技术,docker 只是其中的一种实现
docker 的长处
环境隔离
- docker 实现了资源隔离,实现一台机器运行多个容器互不影响。基于容器来开发、部署、运行应用程序
更疾速地交付部署
- 应用 docker,开发者能够利用镜像疾速构建一套规范的研发环境,开发实现后,测试和运维人员能够间接通过应用此镜像部署代码
更高效的资源利用
- docker 的运行不须要额定的虚拟化管理程序的反对,它是内核级的虚拟化,能够实现更高的性能,同时对资源的额定需要很低
更易迁徙扩大
- docker 简直能够在任意平台上运行
更简略的更新治理
- 应用 dockerfile,只须要小小的配置批改,就能够代替以往大量的更新工作,并且所有批改都是以增量的形式进行散发和更新,从而实现自动化和高效的容器治理
重启更快
- docker 的启动只须要几秒,虚拟机要几分钟
docker 的三个概念
docker 的整个生命周期由三局部组成:镜像(image)+ 容器(constainer)+ 仓库(repository)
每台宿主机(电脑),下载好了 docker 后,能够生成多个镜像,每个镜像,能够创立多个容器。公布到仓库时,以镜像为单位。能够了解成:一个容器就是一个独立的虚构操作系统,互不影响,而镜像就是这个操作系统的安装包。想要生成一个容器,就要安装包(镜像)生成一次,这就是 Docker 的外围概念
镜像(Image)
相似于虚拟机上的镜像,是一个蕴含有文件系统的面向 docker 引擎的 只读 模板。任何利用程序运行都须要环境,而镜像就是用来提供这种运行环境的。例如一个 Ubuntu 镜像就是一个蕴含 Ubuntu 操作系统环境的模板(安装包),同理在该镜像上装上 Apache 软件,就能够称为 Apache 镜像
容器(Container)
相似于一个轻量级的沙盒,能够将其看作一个极简的 Linux 零碎环境(包含 root 权限、过程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker 引擎利用容器来运行,隔离各个利用。容器是镜像创立的利用实例,能够创立、启动、进行、删除容器,各个容器之间是互相隔离的,互不影响。
留神:镜像自身是只读的,容器从镜像启动时,Docker 在镜像的下层创立一个可写层,镜像自身不变。
仓库(Repository)
相似于代码仓库,这里是镜像仓库,是 Docker 用来集中寄存镜像文件的中央。
留神与注册服务器(Registry)的区别:注册服务器是寄存仓库的中央,个别会有多个仓库;而仓库是寄存镜像的中央,个别每个仓库寄存一类镜像,每个镜像利用 tag 进行辨别,比方 Ubuntu 仓库寄存有多个版本(12.04、14.04 等)的 Ubuntu 镜像
传统的虚拟机与容器比照
能够看出,传统的虚拟机是每开一个虚拟机,相当于运行一个零碎,这种是十分占用系统资源的,但容器(以 docker 为例)。也起到了利用之间的隔离成果
它的底层是通过 namespace(命名空间)和 control groups 来实现
其本质就是将反复的资源公有化,让资源分配更加正当
这样做除了资源分配正当外,还能做到应用程序的环境统一化
基于 docker 的开发过程
开发者通过 dockerfile 生成(build)一个镜像(image),通过 docker run ...
生成一个容器(constainer),能够把这个镜像推送至近程仓库上(docker push
),既能够供他人下载(docker pull
)再 run 生成容器。而一些环境变量能够写进 dockerfile 中,这样就放弃了环境的一致性,可移植到任何服务器上
技术实现原理
namespace 解决的问题是环境隔离问题
cgroup 解决计算机资源应用上的隔离
架构图
docker 是如何工作的
docker 应用的是常见的 CS 架构,也就是 client-server 模式,docker client 负责解决用户输出的各种命令,比方 docker build、docker run,真正工作的其实是 server,也就是 docker daemon(守护过程),值得注意的是,docker client 和 docker daemon 能够运行在同一台机器上
咱们用几个命令来解释下 docker 工作流程:
docker build
当咱们写完 dockerfile 交给 docker“编译”时应用这个命令,那么 client 在接管到申请后转发给 docker daemon,接着 docker daemon 依据 dockerfile 创立出“可执行程序”image
docker run
有了“可执行程序”image 后就能够运行程序了,接下来应用命令 docker run,docker daemon 接管到该命令后找到具体的 image,而后加载到内存能够执行,image 执行起来就是所谓的 container
docker pull
其实 docker build 和 docker run 是两个最外围的命令,会用这两个命令基本上 docker 就能够用起来,剩下的就是一些补充。
docker pull 是什么意思,学过 git 的同学都晓得有 git pull,从远端仓库拉数据,你能够将你的 image 放到 docker hub 上,咱们应用 docker pull,就是从 docker hub 上下载 image
这个命令的实现很简略,用户通过 docker client 发送命令,docker daemon 承受到命令后向 docker registry 发送 image 下载申请,下载后寄存在本地,这样咱们就能够应用 image 了
这是我 19 年的旧文,目前做搬运整顿