什么是Docker
一次构建,到处运行。
为什么会有docker
解决了开发人员与运维之间应用上线时的部署和维护的难题。
Docker的优势
- 启动速度快
docker的启动速度非常快,因为它启动的只是一个精简版的一个Linux文件系统。所以启动速度非常快。
- 易上手
docker的上手非常简单,一般几个命令就可以满足你大部分的使用需求。
- 性能高
由于docker启动的只是一个精简版的Linux系统,所以它非常的轻量,只使用极少量的内存和IO开销。
- 易构建
docker commit方式对已有的容器环境进行提交,然后打包成一个新的镜像。另一种是通过 docker build对已有的Dockerfile文件进行构建。
Docker的run命令执行流程
新建并 启动一个容器。
- docker客户端发出docker run的指令
- docker在本地镜像存储库中寻找要启动的镜像
- 找的到,以该镜像为模板运行一个容器实例
- 找不到,到Docker Hub去搜索要启动的镜像
- Docker Hub找得到,下载该镜像到本地,并以该镜像为模板启动一个容器实例
- Docker Hub找不到,返回一个错误消息
下面,我们就上面的执行流程分析一下,我们来举个例子看一下
我们这里用docker images来看一下我们本地主机上有哪些镜像
可以看到REPOSITORY这一列,有三个镜像:gotojava/tomcat8.5、Tomcat、CentOS
下面我们执行一下docker run -it ubuntu,看看会发生什么
上面画框的地方,我们一会再聊,我们这时候再执行dokcer images,看看和刚才相比有什么变化
发现此时多了一个ubuntu的镜像,这是为什么呢?
好了,上面的问题,我们先放一下,先看看这张图,分析一下
我们看看红色区域的部分"Unable to find image 'ubuntu:latest' locally"。上面的话告诉我们在“无法在本地找到图像'ubuntu:latest'”,这里的ubuntu表示Ubuntu的镜像,latest表示是最新版本。
我们继续往下看,它告诉我们最新版的镜像来自library/ubuntu这里,通过pull拉取到本地仓库中。一共拉取了四个,那么问题来了,为什么它要拉四个呢?这个问题我们一会再看。
Digest显示了该镜像的sha256的签名,Status表示拉取状态,告诉我们下载了一个新的镜像是ubuntu的最新版。
总结:当本地仓库不存在该镜像时,run命令会默认到docker hub上进行搜索,如果找的到该镜像资源的话,就会把该镜像下载到本地。
那么问题来了?如果我们这里拉取一个不存在的镜像会发生什么呢?我们一起来看一下。
此时告诉我们,我们要拉取这个镜像在存储库上不存在。
上面有个问题,需要我们来解释一下,在上面我们只拉取了一个ubuntu的镜像,而下面它却pull(拉取)了四次,这是怎么回事呢。
此时,我们通过docker history命令来看一下ubuntu镜像的打包记录
可能这张图,不太好理解,我这里解释一下,docker中一个镜像是由多个镜像一层一层封装起来的,什么意思呢。这里我用Java的环境举例。一个Java环境,需要Linux(操作系统)+jdk(Java开发工具包)+还需要一个Tomcat(应用服务器)才能组合成一套环境,因为tomcat需要依赖于JDK,而JDK需要依赖于操作系统,系统依赖于内核,这个就不说了。镜像也是一样的,它也需要一层一层的依赖,最后打包成一个整体。
总结:因为docker的镜像是一层一层依赖的,所以会先下载最底层的镜像,直到所有镜像的下载完成。并且docker的镜像每一层是共享的。
这里用一张图表示一下。
最后,我用一张图,来说明一下执行流程