Docker组成原理

1.什么是Docker?
docker底层是由linux container组成,使得进程之间互相隔离,但能够共享主机资源python

2.Docker带来的好处?
经过 Docker 能够将程序运行的环境也一块儿打包到版本控制去了,这样就排除了由于环境不一样形成的各类问题linux

Docker 是一个开源的应用容器引擎,基于 go 语言开发,可让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,而后发布到任何流行的 Linux 服务器。容器是一个沙箱机制,相互之间不会有影响(相似于咱们手机上运行的 app),而且容器开销是很低的git

3.Docker几个重要概念
镜像:是一个只读模板,带有建立 Docker 容器的说明,通常来讲的,镜像会基于另外的一些基础镜像并加上一些额外的自定义功能来组成。好比,你能够构建一个基于 Centos 的镜像,而后在这个基础镜像上面安装一个 Nginx 服务器,这样就能够构成一个属于咱们本身的镜像了github

容器:是一个镜像的可运行的实例,可使用 Docker REST API 或者 CLI 命令行工具来操做容器,容器的本质是进程,但与直接在宿主执行的进程不一样,容器进程运行于属于本身的独立的命名空间。所以容器能够拥有本身的 root 文件系统、本身的网络配置、本身的进程空间,甚至本身的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操做同样。这种特性使得容器封装的应用比直接在宿主运行更加安全docker

registry:是用来存储 Docker 镜像的仓库,Docker Hub 是 Docker 官方提供的一个公共仓库,并且 Docker 默认也是从 Docker Hub 上查找镜像的,固然你也能够很方便的运行一个私有仓库,当咱们使用 docker pull 或者 docker run 命令时,就会从咱们配置的 Docker 镜像仓库中去拉取镜像,使用 docker push 命令时,会将咱们构建的镜像推送到对应的镜像仓库中,registry 能够理解为用于镜像的 github 这样的托管服务ubuntu

Namespaces:
命名空间 (namespaces) 是 Linux 为咱们提供的用于分离进程树、网络接口、挂载点以及进程间通讯等资源的方法。在平常使用我的 PC 时,咱们并无运行多个彻底分离的服务器的需求,可是若是咱们在服务器上启动了多个服务,这些服务其实会相互影响的,每个服务都能看到其余服务的进程,也能够访问宿主机器上的任意文件,一旦服务器上的某一个服务被***,那么***者就可以访问当前机器上的全部服务和文件,这是咱们不肯意看到的,咱们更但愿运行在同一台机器上的不一样服务能作到彻底隔离,就像运行在多台不一样的机器上同样。而 Docker 其实就经过 Linux 的 Namespaces 技术来实现的对不一样的容器进行隔离安全

一张图片完整的解释什么是镜像???
镜像究竟是什么,它又是如何组成和组织的呢?而这其中最重要的概念就是镜像层(Layers)的概念,而镜像层依赖于一系列的底层技术,好比文件系统(filesystems)、写时复制(copy-on-write)、联合挂载(union mounts)等
Docker组成原理服务器

Docker 镜像是由一系列的层组成的,每层表明 Dockerfile 中的一条指令,好比下面的 Dockerfile 文件:网络

FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.pyapp

这里的 Dockerfile 包含4条命令,其中每一行就建立了一层,FROM 语句从 ubuntu:18.04 这个基础镜像建立一个层开始,COPY 命令从 Docker 客户端的当前目录添加一些新的文件,RUN 指令使用 make 命令构建应用,最后一层指定在容器中运行什么命令

镜像就是由这些层一层一层堆叠起来的,镜像中的这些层都是只读的,当咱们运行容器的时候,就能够在这些基础层至上添加新的可写层,也就是咱们一般说的容器层,对于运行中的容器所作的全部更改(好比写入新文件、修改现有文件、删除文件)都将写入这个容器层