Docker网站:
https://hub.docker.com/ 
Docker镜像分层的概念:
Docker的最小镜像
docker的架构,镜像分层特性,dockerfile缓存特性
下载镜像(dockerfile的组成)
docker pull hello-world
docker的架构,镜像分层特性,dockerfile缓存特性_第1张图片

Dockerfile的组成
1.》FROM:scratch 抓,挠(从零开始构建)
2》COPY: hello /
3》CMD: [“/hello”]

Base镜像
(基础镜像)
docker的架构,镜像分层特性,dockerfile缓存特性_第2张图片
docker的架构,镜像分层特性,dockerfile缓存特性_第3张图片

> ***个人理解:
> 用户空间:rootfs
> 内核空间 :bootfs
> kernel内核
> 总体有七个部分:
> docker client,docker daemon,driver,libcontainer,
> docker container,graph,docker registry
> 
> docker是一个C/S的架构,用户可以在客户端输入各种指令,客户端负责接受请求并作出相应的响应返回给客户。
> DockerClient
> DockerClient 负责接受并传递请求指令 。
> DockerDaemon
> 后台运行(不占用程序与端口)
> DockerDaemon的功能主要有两个:(是一个守护进程)
> 1.负责接受client的请求2.管理docker容器
> dockerdaemon的架构主要可以分为两部分:dockerserver和engine
> DockerServer作为服务端最主要的作用就是配合client端将请求指令接受过来,如图所示,DockerServer主要分为三个部分:Http.server,routermux.server,Handler
> DockerServer运行时会从一个名为mux的包中创建一个mux.Router路由器,然后为路由器中添加相关的路由项用于路由信息, 每个路由项由HTTP请求方法(get,post,put,delete)+URL+Handler三部分组成。
> DockerServer每收到一个请求就会生成一个goroutine然后进行相应的解析、匹配相应的路由项最后会找到相匹配的Handler来处理,Handler处理玩请求之后给DockerClient返回响应
> 2.Engine
> Engine是docker中的运行引擎,存储着大量的容器信息并管理着大部分job的执行。
> 
> job是docker中的最小执行单元,类似于unix中的进程,也会有相应的名字、参数、环境变量、标准输入输出、返回状态等等。docker每进行一次相应的操作都会 生成一个相应的Job,比如创建一个容器、下载一个文件等等都是由job完成的。
> DockerDriver
> DockerDriver是docker内部的驱动模块,负责容器内部相关网络、文件系统等的构建
> 
> libcontainer
> libcontainer主要是对linux内核的一些诸如namespace、cgroups、capabilities等特性做了封装
> 
> Graph
> DockerRegistry(私有仓库)
> Docker Container:运行应用程序的特定容器,是容器服务的交付实体***

**总结:文档(网上)
Docker核心概念
**
容器技术的核心概念有容器(container)、镜像(image)、仓库(registry)三个。

容器:具体的运行应用程序的一个进程,它里面包含应用程序的各种依赖。

镜像:创建容器的模板,根据不同配置的镜像来创建不同的容器使用。镜像和容器的关系可以理解为面向对象中类和实例对象的关系。

仓库:一个镜像只可以创建一种类型的容器,镜像多了就需要放到镜像仓库中存起来,仓库有本地镜像仓库和公共镜像仓库,平时使用本地仓库的镜像,没有的话去Registry hub公共镜像仓库下载。

Docker架构

Docker框架主要由Docker Client、Docker Daemon、Docker Registry、Driver、Docker Container五个模块组成,另外还有Graph和Libcontainer两个辅助模块,如下图所示:

Docker架构

Docker Client: 用户通过Docker Client与Docker Daemon进行通信,利用命令行发送创建镜像、运行容器之类的请求。

Docker Daemon:Docker Daemon是Docker架构中一个常驻在后台的系统进程,接受并处理Docker Client发送的请求。该守护进程在后台启动了一个Server,Server负责接受Docker Client发送的请求;然后通过路由与分发调度,找到相应的Handler来执行请求。

Docker Registry:存储容器镜像的仓库。

Driver: Driver是Docker架构中的驱动模块。通过Driver驱动,Docker可以实现对Docker容器执行环境的定制。包含管理容器镜像的graphdriver驱动,配置容器内网络环境的networkdriver驱动,execdriver用来创建和维护容器。

Docker Container:运行应用程序的特定容器,是容器服务的交付实体。

一般运行流程为:用户在Docker Client端通过命令行发送请求到Docker Daemon,Docker Daemon中的Server收到请求后,Engine会创建一个工作任务job,通过调用Driver模块的各个驱动分别执行不同的任务,比如需要镜像就调用graphdriver从镜像仓库下载镜像,创建容器时也需要调用其它两个驱动来配置网络和创建并维护容器。最后生成运行中的容器或者上传镜像到镜像仓库等。

容器应用

当想使用容器来跑自己的应用程序时,首先需要明确应用程序依赖的环境,如果本地有现成镜像可以直接使用来运行容器跑应用,没有的话可以通过docker pull去registry hub下载,或者自己创建所需要的镜像。

可以使用dockerfile来创建镜像,首先编辑一个dockerfile文件,其中

FROM 表示这个镜像是基于哪个镜像来建立

MAINTAINER 表示这个镜像是由谁来维护

RUN 告诉镜像要执行的操作,比如更新或安装一个软件等,会新建一个镜像层。

EXPOSE 表示暴露的端口。

ENV 表示配置环境变量

CMD 设置容器启动后默认执行的命令及其参数,这条命令会在容器启动而且docker run没有指定其它命令时运行,如果docker run指定了其它命令,CMD指定的默认命令将被忽略。

CMD有三种格式:

Exec格式:CMD [“executable”,“param1”,“param2”]
CMD [ “param1”,“param2”] 一般使用这个,为ENTRYPOINT提供默             认参数
Shell格式:CMD command param1 param2
ENTRYPOINT 配置容器启动时运行的命令。与CMD不同的是,ENTRYPOINT的指令一定会被运行,即使运行docker run时指定了其它命令。

        ENTRYPOINT有两种格式:

Exec格式:ENTRYPOINT [“executable”,“param1”,“param2”]
Shell格式:ENTRYPOINT command param1 param2
一般优先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可为 ENTRYPOINT 提供额外的默认参数,同时可利用 docker run 命令行替换默认参数。

常用命令

Docker build 创建镜像

Docker run  利用镜像运行容器

Docker image 关于镜像的一系列操作

Docker pull  从镜像仓库下载镜像到本地仓库

Docker push  上传镜像到镜像仓库

Docker container 执行关于容器的一系列操作

Docker stats 实时监控该节点容器的资源使用情况

docker的架构,镜像分层特性,dockerfile缓存特性_第4张图片
镜像的分层
1》dockerfile的书写格式为:Dockerfile
2》FROM:构建镜像有两种方式,一种是scratch(从零构建),另一种可以基于某个镜像开始构建。
3》镜像所运行的操作,(用户所期望的)

vim Dockerfile
docker的架构,镜像分层特性,dockerfile缓存特性
运行一下
docker build -t centos7-vim-net-tools:12-11 .
. 点代表在当前目录自动查找Dockerfile文件
docker的架构,镜像分层特性,dockerfile缓存特性_第5张图片

注意:镜像的查看顺序,从上到下

Dockerfile镜像分层总结:
镜像是容器的基石,容器是镜像运行后的实例,当镜像运行为容器后,对镜像的所有数据仅有只读权限,如果需要对镜像源文件进行修改或删除操做,此时实在容器层(可写层)进行的,用到了cow(copy on write)写时复制机制

Docker镜像的缓存特性:
一个目录最好只有一个Dockerfile文件
创建一个新的dockerfile文件
docker的架构,镜像分层特性,dockerfile缓存特性_第6张图片
运行一下
docker build -t new-centos .
如果在相同的层有相同的镜像,看可以不必在去下载,可以直接使用缓存。
即使相同的镜像,在不同的层也会去下载

查看镜像的历史
docker history centos7-vim-net-tools:12-11
docker的架构,镜像分层特性,dockerfile缓存特性_第7张图片
docker history new-centos:latest
docker的架构,镜像分层特性,dockerfile缓存特性_第8张图片
Mkdir test1 在创建一个dockerfile
docker的架构,镜像分层特性,dockerfile缓存特性_第9张图片

即使镜像操做一样,也必须是在同一层才可以使用dockerfile的缓存特性。
如果制作镜像过程中,不想使用缓存,可以加--no-cache选项。