Docker概念
Posted 李先生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker概念相关的知识,希望对你有一定的参考价值。
说明:
一直想学Docker,容器、镜像、仓库什么的好难理解就没怎么看了,最近下定决心好好看看,google、Baidu发现这篇好文章,看完差不多有个大概的理解。里面的内容基本上来以下博文,是国外一小伙写的,很牛~,第二个链接是国内翻译的一个译文,第三个链接里有几幅图很经典,是参考这里的。这么好的文章真的得分享
http://merrigrove.blogspot.sg/2015/10/visualizing-docker-containers-and-images.html 原文
http://dockone.io/article/783 译文
https://www.cnblogs.com/SzeCheng/p/6822905.html
http://dockone.io/article/783 译文
https://www.cnblogs.com/SzeCheng/p/6822905.html
总体图:
docker save创建一个镜像的压缩文件,这个文件能够在另一个主机的Docker上使用。和export命令不同。save命令为每一个层都保存了它们的元数据,只对镜像生效
![](https://image.cha138.com/20210605/c40124bd31074362ba822afecfc44788.jpg)
一、镜像
镜像(Image)就是一堆只读层(read-only layer)的统一视角。一个只读的模板。如一个镜像可以包含一个完整的操作系统环境,里面仅安装了Apache或用户需要的其他应用程序。镜像可以用来创建Docker容器。Docker提供了一个简单的机制来创建镜像或更新现有的镜像。用户也可以直接从其他人那里下载一个已经做好的镜像直接来使用。
![](https://image.cha138.com/20210605/b1efedaffb424481bb5bd22f5e930b51.jpg)
![](https://image.cha138.com/20210605/a67ba97f462a4e6f95346bc818b1710f.jpg)
二、容器(Container)
Docker利用容器来运行应用、容器是从镜像创建的运行实例。可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。容器的定义和镜像几乎一样,也是一堆层的视角,唯一的区别在与容器的最上面那一层是可读可写的。
![](https://image.cha138.com/20210605/501d25bb551c4ef88e3b3a3f109ab91e.jpg)
![](https://image.cha138.com/20210605/259c62f9dcb64a2f9c99175a9fcfe8a8.jpg)
三、运行容器(Running Container Definition)
一个运行态容器(running container)被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程。
![](https://image.cha138.com/20210605/93923a1ed0a14cb19019f3ca862085a5.jpg)
正是文件系统隔离技术使得Docker成为了一个前途无量的技术。一个容器中的进程可能会对文件进程修改,删除,创建,这些改变都将作用于可读写层(read-write layer)
![](https://image.cha138.com/20210605/6acc9119f0524b5c98654545aff189ec.jpg)
四、镜像层(image layer)
一个层并不仅仅包含文件系统的改变,还包含了其他重要信息。
![](https://image.cha138.com/20210605/084825395f8f4488a6b5153cfe5f5724.jpg)
元数据(metadata)就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息,只读层和读写层都包含元数据。
![](https://image.cha138.com/20210605/8b6c7015e00849abb0648fb084b132ce.jpg)
每一层都包含了一个指向父层的指针,如果一个层没有这个指针,说明他处于最底层。
![](https://image.cha138.com/20210605/769ba0578aac4c82b23a01f27639844c.jpg)
五、全局理解
1)docker create <image-id>
![](https://image.cha138.com/20210605/8b948a078f87471da7bd21f476221815.jpg)
docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器,这个容器并没有运行
![](https://image.cha138.com/20210605/98796a66ee134515a8b4b16dca7e57e5.jpg)
2)docker start <container-id>
![](https://image.cha138.com/20210605/b243600b78d44d3dab8336165a9450f7.jpg)
Docker start 命令为容器文件系统创建了一个进程隔离空间,每个容器只能够有一个进程隔离的空间
3)docker run <image-id>
![](https://image.cha138.com/20210605/6ee8a71f96af49afb0ecd72af922d8cb.jpg)
docker start 与docker run的区别
![](https://image.cha138.com/20210605/249cde8fd89640fca791142470a4b8e4.jpg)
docker run 命令先是利用镜像创建了一个容器,这个命令隐藏了docker create与docker start细节
4)docker ps
![](https://image.cha138.com/20210605/dd27128e564c42cd8774d3630ddfe85a.jpg)
docker ps命令会列出所有运行中的容器。这隐藏了非运行态容器的存在。
5)docker ps -a
![](https://image.cha138.com/20210605/7c1fe04b7bc14c3a89dd883185758acb.jpg)
docker ps -a 会列出所有的容器,不管是运行的,还是停止的
6)docker images
![](https://image.cha138.com/20210605/952f10e0d340406aa098ea5d78e21513.jpg)
docker images 会列出所有顶层(top-level)镜像。没有办法区分一个镜像和一个只读层,所以提出了top-level镜像。只有创建容器时使用的镜像或者是直接pull下来的镜像能被称为顶层镜像(top-level),并且每一个顶层镜像下面都影藏了多个镜像层
![](https://image.cha138.com/20210605/4c9e00d0233e4117930310456ca5ec9c.jpg)
7)docker images -a
![](https://image.cha138.com/20210605/842cefd60f084cbf9f78b88de007b129.jpg)
docker iamges -a命令列出了所有的镜像,列出了所有的可读层,查看某一个image-id下的所有层,可使用docker history image-id来查看
![](https://image.cha138.com/20210605/70e225a4230046fdb48a3d28060fe464.jpg)
8)docker stop <container-id>
![](https://image.cha138.com/20210605/bf1a450d8ffa4a0797f935c77973999a.jpg)
docker stop命令会向运行中的容器发送一个SIGTERM信号,然后停止所有进程
9)docker skill <container-id>
![](https://image.cha138.com/20210605/5d87c294660045b588fbf30d462bd78b.jpg)
docker kill 命令向所有运行在容器中的进程发送一个不友好的SIGKILL信号
10)docker pause <container-id>
![](https://image.cha138.com/20210605/360fc3b4cc004e29a1ae6a0e12d247d6.jpg)
docker stop和docker kill 命令会发送UNIX的信号给运行中的进程。docker pause用cgroups的特性将运行中的进程空间暂停
11)docker rm <container-id>
![](https://image.cha138.com/20210605/58853150757c4aafa8e1404eb81eb8d7.jpg)
docker rm命令会移除构成容器的可读写层,这个命令只能对非运行态容器执行
11)docker rmi <image-id>
![](https://image.cha138.com/20210605/82fa6a1561794524ab0d6ec2e45b10c8.jpg)
docker rmi 命令会移除构成镜像的一个只读层。只能够使用docker rmi来移除最顶层(top level layer)也就是镜像,也可以使用-f参数来强制删除中间的只读层
12)docker commit <container-id>
![](https://image.cha138.com/20210605/1f72bbb49fff4b4590539e3f987a1211.jpg)
docker commit命令将容器的可读写层转换成一个只读层,这样把一个容器转换成了不可变的镜像
![](https://image.cha138.com/20210605/ff00f8fe754e4a83818a7201611f245a.jpg)
13)docker build
![](https://image.cha138.com/20210605/baaf4c1ed89f432f9e56e64968e9973c.jpg)
![](https://image.cha138.com/20210605/e87ec967d0bd4f57b9311bd7762e04bc.jpg)
build命令根据Dockerfile文件中的FROM指令获取到镜像,然后重复的run、修改、commit。在循环中每一步都会生成一个新的层,因此许多新的层会被创建
14)docker exec <running-container-id>
![](https://image.cha138.com/20210605/4535cfca1db74d04ba5d83990e7d447f.jpg)
docker exec 命令会在运行中的容器执行一个新进程
15)docker inspect <container-id> or <image-id>
![](https://image.cha138.com/20210605/4ae958befe0e4189bcc957ff24589cd3.jpg)
docker inspect 命令会提取出容器或者镜像最顶层的元数据
16)docker save <image-id>
![](https://image.cha138.com/20210605/a1557adba5084607a329bb4e600288fb.jpg)
17)docker export <container-id>
![](https://image.cha138.com/20210605/5b85c2c93b66417c8e861cbf72a6ec4f.jpg)
docker export创建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成一个层,只保存当前统一视角看到的内容。export后的容器再import到Docker中,通过docker images -tree命令只能看到一个镜像;而save后的镜像不同,他能看到这个镜像的历史镜像
18)docker history <image-id>
![](https://image.cha138.com/20210605/e969349ee6b24126ac428f8bf9df214e.jpg)
docker history命令递归的输出指定镜像的历史镜像
以上是关于Docker概念的主要内容,如果未能解决你的问题,请参考以下文章