daemon配置详解 docker daemon.json docker_Docker


什么是Docker

一次构建,到处运行

为什么会有docker

解决了开发人员与运维之间应用上线时的部署和维护的难题

Docker的优势

  • 启动速度快

docker的启动速度非常快,因为它启动的只是一个精简版的一个Linux文件系统。所以启动速度非常快。

  • 易上手

docker的上手非常简单,一般几个命令就可以满足你大部分的使用需求。

  • 性能高

由于docker启动的只是一个精简版的Linux系统,所以它非常的轻量,只使用极少量的内存和IO开销。

  • 易构建

docker commit方式对已有的容器环境进行提交,然后打包成一个新的镜像。另一种是通过 docker build对已有的Dockerfile文件进行构建。

Docker的run命令执行流程

新建启动一个容器。

  1. docker客户端发出docker run的指令
  2. docker在本地镜像存储库中寻找要启动的镜像
  3. 找的到,以该镜像为模板运行一个容器实例
  4. 找不到,到Docker Hub去搜索要启动的镜像
  5. Docker Hub找得到,下载该镜像到本地,并以该镜像为模板启动一个容器实例
  6. Docker Hub找不到,返回一个错误消息

下面,我们就上面的执行流程分析一下,我们来举个例子看一下

我们这里用docker images来看一下我们本地主机上有哪些镜像


daemon配置详解 docker daemon.json docker_daemon配置详解 docker_02


可以看到REPOSITORY这一列,有三个镜像:gotojava/tomcat8.5、Tomcat、CentOS

下面我们执行一下docker run -it ubuntu,看看会发生什么


daemon配置详解 docker daemon.json docker_ubuntu_03


上面画框的地方,我们一会再聊,我们这时候再执行dokcer images,看看和刚才相比有什么变化


daemon配置详解 docker daemon.json docker_ubuntu_04


发现此时多了一个ubuntu的镜像,这是为什么呢?

好了,上面的问题,我们先放一下,先看看这张图,分析一下


daemon配置详解 docker daemon.json docker_Docker_05


我们看看红色区域的部分"Unable to find image 'ubuntu:latest' locally"。上面的话告诉我们在“无法在本地找到图像'ubuntu:latest'”,这里的ubuntu表示Ubuntu的镜像,latest表示是最新版本。

我们继续往下看,它告诉我们最新版的镜像来自library/ubuntu这里,通过pull拉取到本地仓库中。一共拉取了四个,那么问题来了,为什么它要拉四个呢?这个问题我们一会再看。

Digest显示了该镜像的sha256的签名,Status表示拉取状态,告诉我们下载了一个新的镜像是ubuntu的最新版。

总结:当本地仓库不存在该镜像时,run命令会默认到docker hub上进行搜索,如果找的到该镜像资源的话,就会把该镜像下载到本地。

那么问题来了?如果我们这里拉取一个不存在的镜像会发生什么呢?我们一起来看一下。


daemon配置详解 docker daemon.json docker_ubuntu_06


此时告诉我们,我们要拉取这个镜像在存储库上不存在。

上面有个问题,需要我们来解释一下,在上面我们只拉取了一个ubuntu的镜像,而下面它却pull(拉取)了四次,这是怎么回事呢。

此时,我们通过docker history命令来看一下ubuntu镜像的打包记录


daemon配置详解 docker daemon.json docker_Docker_07


可能这张图,不太好理解,我这里解释一下,docker中一个镜像是由多个镜像一层一层封装起来的,什么意思呢。这里我用Java的环境举例。一个Java环境,需要Linux(操作系统)+jdk(Java开发工具包)+还需要一个Tomcat(应用服务器)才能组合成一套环境,因为tomcat需要依赖于JDK,而JDK需要依赖于操作系统,系统依赖于内核,这个就不说了。镜像也是一样的,它也需要一层一层的依赖,最后打包成一个整体。

总结:因为docker的镜像是一层一层依赖的,所以会先下载最底层的镜像,直到所有镜像的下载完成。并且docker的镜像每一层是共享的。

这里用一张图表示一下。


daemon配置详解 docker daemon.json docker_daemon配置详解 docker_08


最后,我用一张图,来说明一下执行流程


daemon配置详解 docker daemon.json docker_docker_09