您的位置:首页 > 运维架构 > Docker

30分钟玩转Docker系列课程2---Docker核心概念

2015-07-24 14:06 645 查看
对于学习Docker而言,很关键的一点,一定要了解Docker的核心概念及其原理,若不了解清除,在后续的可持续集成,自动化生产部署方案会出现问题

Docker原理:





Docker使用客户端-服务器(C/S)架构模式。Docker客户端会与Docker守护进程进行通信。Docker守护进程会处理复杂繁重的任务,例如建立、运行、发布你的Docker容器。Docker客户端和守护进程可以运行在同一个系统上,当然你也可以使用Docker客户端去连接一个远程的Docker守护进程。Docker客户端和守护进程之间通过socket或者
RESTful API进行通信

Docker核心概念:

1、镜像(image)

类似于虚拟机镜像,可以理解为一个面向Docker引擎的只读模板,包含了文件系统

2、容器(Container)

容器是从镜像创建的应用运行实例

3、仓库(Repository)
类似代码仓库,Docker集中存放镜像文件的场所

镜像核心概念:

按照Docker官网的技术文档描述,Image(镜像)是Docker术语的一种,代表一个只读的layer。而layer则具体代表Docker
Container文件系统中可叠加的一部分

Docker镜像相关的4个概念:rootfs、Union
mount、image以及layer

1、rootfs
代表一个Docker Container在启动时(而非运行后)其内部进程可见的文件系统视角,或者是Docker
Container的根目录。当然,该目录下含有Docker Container所需要的系统文件、工具、容器文件等

例如:假设用户已经通过Docker Registry下拉了Ubuntu:14.04的镜像,并通过命令docker
run –it ubuntu:14.04 /bin/bash将其启动运行。则Docker Daemon为其创建的rootfs以及容器可读写的文件系统可参见图



2、 Unionmount
代表一种文件系统挂载的方式,允许同一时刻多种文件系统挂载在一起,并以一种文件系统的形式,呈现多种文件系统内容合并后的目录;

一般情况下,通过某种文件系统挂载内容至挂载点的话,挂载点目录中原先的内容将会被隐藏。而Unionmount则不会将挂载点目录中的内容隐藏,反而是将挂载点目录中的内容和被挂载的内容合并,并为合并后的内容提供一个统一独立的文件系统视角



3、image

最为简单的解释image,就是Docker容器中只读文件系统rootfs的一部分。换言之,实际上Docker容器的rootfs可以由多个image来构成。多个image构成rootfs的方式依然沿用Union
mount技术





继续以ubuntu14.04为例,虽然通过AUFS可以实现rootfs与read-writefilesystem的合并,但是考虑到rootfs自身接近200MB的磁盘大小,如果以这个rootfs的粒度来实现容器的创建与迁移等,是否会稍显笨重,同时也会大大降低镜像的灵活性。而且,若用户希望拥有一个ubuntu14.10的rootfs,那么是否有必要创建一个全新的rootfs,毕竟ubuntu14.10和ubuntu14.04的rootfs中有很多一致的内容。

DockerImage中又抽象出两种概念:ParentImage以及BaseImage。

通过image的形式,原先较为臃肿的rootfs被逐渐打散成轻便的多层。Image除了轻便的特性,同时还有上文提到的只读特性,如此一来,在不同的容器、不同的rootfs中image完全可以用来复用。

4、layer
Docker术语中,layer是一个与image含义较为相近的词。容器镜像的rootfs是容器只读的文件系统,rootfs又是由多个只读的image构成。于是,rootfs中每个只读的image都可以称为一层layer。
除了只读的image之外,Docker Daemon在创建容器时会在容器的rootfs之上,再mount一层read-write filesystem,而这一层文件系统,也称为容器的一层layer,常被称为top layer

综上所述,大家要把镜像和容器都理解成,镜像由多个不可写的layer层组成,容器是在镜像最上层,是一个可写的层;大家可以在linux操作系统上输入

Docker images -tree




就可以看多images的组成关系

容器核心概念:
容器是在镜像最上层,是一个可写的层;
我们从一个例子看下容器是如何运行的
docker run -ti docker.io/centos:latest /bin/bash

Docker底层做了哪些事情:
1、拉去centos镜像,首先检查本地是否有centos镜像,如果本地没这个镜像,则Docker会从Docker
Hub上下载
2、创建新的容器: 当Docker有了这个镜像之后,Docker会用它来创建一个新的容器。
3、分配文件系统并且挂载一个可读写的层: 容器会在这个文件系统中创建,并且一个可读写的层被添加到镜像中
4、分配网络/桥接接口: 创建一个允许容器与本地主机通信的网络接口。
5、设置一个IP地址: 从池中寻找一个可用的IP地址并且服加到容器上。
6、运行你指定的程序: 运行指定的程序。
7、捕获并且提供应用输出: 连接并且记录标准输出、输入和错误让你可以看到你的程序是如何运行的。

仓库核心概念:
可以通俗易懂的理解为:我们存放&&下载镜像的地方,这个地方有公共的Docker Hub或私有的Hub;
我们下载centos镜像,输入以下命令
docker pull centos
实际执行的命令为
sudodocker pullregistry.hub.docker.com/centos:latest

我们也可以创建自己私有的仓库,运行官方提供的 registry 镜像,将端口映射到主机的 5000 端口上,其它均使用默认配置
guohl@ghl-MBP ⮀ ~ ⮀ docker run -d -p 5000:5000 registry
Unable to find image 'registry:latest' locally
6cfde7386ab2: Pull complete
9789d95d9fda: Pull complete
19443e64f223: Pull complete
b329371ab73c: Pull complete
f0daee9a4e8f: Pull complete
a66e50e56475: Pull complete
8ab3d2988df5: Pull complete
5f60fa7ea945: Pull complete
db22a140c899: Pull complete
5b2fff9306bd: Pull complete
511136ea3c5a: Already exists
f3c84ac3a053: Already exists
a1a958a24818: Already exists
9fec74352904: Already exists
d0955f21bf24: Already exists
registry:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Status: Downloaded newer image for registry:latest
8fb8e82e61822e593e10b59a4e7bbad18c789b34e3b38942d5b63dccb497ed09
创建好私有仓库之后,我们就可以向该仓库上传镜像,别人也可以从该仓库下载镜像
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: