本文已参加 [新人创作礼] 活动,一起开启掘金创作之旅。
前面我们学习了docker的基础名词、常用命令、dockerfile的格式和常用指令、dockercompose的文件格式和dockercompose的常用命令,并使用docker、dockerfile、dockercompose 都进行了实战部署构建。
本篇我们来看下docker在面试中常问的题!
1. 什么是docker
docker 是用 go 语言 开发的开源的虚拟化容器引擎,容器就是将软件打包成标准化单元,以用于开发、交付和部署。
容器镜像是轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。
容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
2. 列举下docker 的优劣势
- 优势
- Web 应用的自动打包和发布;
- 自动化测试和持续集成、发布;
- 在服务型环境中部署和调整数据库或其他的后台应用;
- 部署简单方便;
- 劣势
-
资源占用过多
-
冗余步骤多
-
启动慢
-
3. docker 是由那些部分组成的
- 镜像:Image docker 镜像就好比是一个模版,可以通过这个模版来创建容器服务。可以类比 Java 中的类,它本身不具备执行运行的能力,是一个对象抽象的模版。每个模版可以有多个版本,用 tag 来区分。镜像可以通过 Dockerfile 来构建。
- 容器:Container Docker 运行的最小单位对象。它是通过镜像实例化出来的一个可运行对象。容器的修改,可以通过提交反作用于镜像,更新这个容器的模版。
- 仓库:Repository 用于存储管理镜像的仓库,类似于 git 管理代码的仓库一样,可以管理多版本的镜像。
4. dockerfile 中的add 和 copy 都是 将宿主机中的资源加入到镜像中,那它两个有什么区别,各自的优势是什么?
-
add
- 如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。如果目标路径不存在,则会自动创建目标路径。
- 如果源路径是个文件,且目标路径是不是以 / 结尾,则docker会把目标路径当作一个文件。如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。
- 如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。
- 如果源文件是个归档文件(压缩文件),则docker会自动帮解压。
-
copy
- 只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。Docker开发者推荐:满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩。