docker镜像的使用
这篇文章的知识点包括:docker镜像的安装下载、docker镜像分层以及docker镜像的缓存特性,阅读完整文相信大家对docker的镜像有了一定的认识。
下载镜像(dockerfile的组成)
docker pull hello-world
Dockerfile的组成
1.》FROM:scratch 抓,挠(从零开始构建)
2》COPY: hello /
3》CMD: ["/hello"]
Base镜像
(基础镜像)
> ***个人理解:> 用户空间: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 param2ENTRYPOINT 配置容器启动时运行的命令。与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 实时监控该节点容器的资源使用情况
镜像的分层
1》dockerfile的书写格式为:Dockerfile
2》FROM:构建镜像有两种方式,一种是scratch(从零构建),另一种可以基于某个镜像开始构建。
3》镜像所运行的操作,(用户所期望的)
vim Dockerfile
运行一下
docker build -t centos7-vim-net-tools:12-11 .
. 点代表在当前目录自动查找Dockerfile文件
注意:镜像的查看顺序,从上到下
Dockerfile镜像分层总结:
镜像是容器的基石,容器是镜像运行后的实例,当镜像运行为容器后,对镜像的所有数据仅有只读权限,如果需要对镜像源文件进行修改或删除操做,此时实在容器层(可写层)进行的,用到了cow(copy on write)写时复制机制
Docker镜像的缓存特性:
一个目录最好只有一个Dockerfile文件
创建一个新的dockerfile文件
运行一下
docker build -t new-centos .
如果在相同的层有相同的镜像,看可以不必在去下载,可以直接使用缓存。
即使相同的镜像,在不同的层也会去下载
查看镜像的历史
docker history centos7-vim-net-tools:12-11
docker history new-centos:latest
Mkdir test1 在创建一个dockerfile
即使镜像操做一样,也必须是在同一层才可以使用dockerfile的缓存特性。
如果制作镜像过程中,不想使用缓存,可以加--no-cache选项。
看完上述内容,你们对docker镜像有进一步的了解吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读。