从问题开始:
1. Dockerfile是什么:是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
From指定基础镜像: FROM <image name>
Maintainer设置镜像的作者:MAINTAINER <author name>
Run在shell或者exec的环境下执行的命令。Run指令会在新创建的镜像上添加新的层面(???)。RUN <command>
Env设置环境变量,键值对。ENV <key> <value>
Arg构造参数,定义参数名称,在--build-arg时用(没看懂???)
Cmd提供容器默认的执行命令。Dockerfile只允许使用一次CMD指令,多个则只有最后一个生效。三种:CMD ["executable", "param1", "param2"], CMD ["param1", "param2"], CMD command param1 param2(shell,主进程为sh)
2. 什么是Docker,Docker和虚拟机等传统虚拟技术有啥区别
Container容器:操作系统层面的虚拟化技术,在容器内运行的程序只能看到容器的内容和设备信息(而真正的操作系统中的程序可以看到所有资源)。文件系统、网络互联、进程隔离。
Docker在容器的基础上进一步封装,简化了容器的创建和维护。
Docker和传统虚拟机的区别在于,传统虚拟机中的每个APP需要虚拟出一套完整的操作系统(Guest OS),而Docker直接运行于宿主操作系统(Host OS),只是APP之间共享内核(???),容器内没有自己的内核,不进行硬件虚拟。
Docker在性能上能明显优于传统虚拟机:启动快、耗损少(实例多)
3. 什么是镜像(Image)、什么是容器(Container)、什么是仓库(Repository)
首先理解一个概念:文件系统的挂载。在内核启动之后,会挂载root文件系统(即/),用df -h可以看到mount的设备。
Docker镜像:相当于是一个root文件系统。镜像中不包含任何动态数据,构造后即不可变。主要提供:容器运行依赖的程序、库、资源、配置;以及配置参数(匿名卷、环境变量、用户)。分层存储:镜像构建时,会一层层进行构建,每一层构建完即定下来了,不会再改变了。如果在下一层删除上一层的文件,不会真正删除,而只是标记为已删除,so虽然看不到这个文件,但是文件一直存在。
Docker容器:容器是镜像的实例,每一个容器创建时,已镜像为基础,在镜像上创建容器存储层。一般要求容器存储层保持无状态,所有的文件写入操作,使用数据卷(Volume)或者绑定宿主目录。
Docker Registry:多个仓库(多个镜像),每个仓库包含多个标签(Tag)-> 对应不同版本的镜像。其中公开的Docker Registry包含官方的Docker Hub,国内访问比较慢,有相关加速器可以加速。
参考资料:
网友评论