title: Docker面试题
tags: Docker
author: Clown95
本文摘抄自 杨保华 戴王剑 曹亚仑编著的《Docker技术入门与实战》镜像相关 如何批量清理临时镜像文件?
可以使用sudo docker rmi $ (sudo docker images -q -f dangling=true)命令。如何查看镜像支持的环境变量?
可以使用sudo docker run IMAGE env命令。本地的镜像文件都存放在哪里?
与Docker相关的本地资源都存放在/var/lib/docker/目录下,其中container目录存放容器信息,graph目录存放镜像信息,aufs目录下存放具体的镜像层文件。构建Docker镜像应该遵循哪些原则?
整体原则上,尽量保持镜像功能的明确和内容的精简,要点包括:ADD 和 COPY 指令有什么区别?推荐使用哪种方式?
- 尽量选取满足需求但较小的基础系统镜像。
- 清理编译生成文件、安装包的缓存等临时文件。
- 安装各个软件时候要指定准确的版本号,并避免引人不需要的依赖。
- 从安全角度考虑,应用要尽量使用系统的库和依赖。
- 如果安装应用时候需要配置一些特殊的环境变量, 在安装后要还原不需要保持的变量值。
- 使用Dockerfle创建镜像时候要添加.dockerignore 文件或使用干净的工作目录。
ADD 指令ADD 指令的功能是将主机构建环境(上下文)目录中的文件和目录,拷贝到镜像中,如果源文件是个归档文件,ADD 指令会自动进行解压。如果是个url,ADD又会自动下载文件,。 有趣的是,URL下载和解压功能不能一起使用。任何通过URL复制的压缩文件都不会自动解压缩。当前的ADD指令非常的神奇。它可以添加本地和远程文件。它有时会解压一个文件,它有时不会解压文件。如果某个文件是要复制的tar包,则意外解压缩它。如果该文件是一个压缩格式的tar包,需要解压,则意外复制它。两个 namespace 如何进行通信?
COPY指令COPY 指令和 ADD 指令类似,都是负责拷贝文件或者目录到容器里,但 COPY 指令功能更简洁和易懂,COPY 是ADD 的一种简化版本,目的在于满足大多数人复制文件到容器的需求。
在大多数情况下,都建议使用 COPY 指令,除非你明确需要ADD指令。
我们都知道,Docker 是基于 LXC容器技术 namespace 来实现资源的隔离,基于 LXC容器技术 cgroups 来实现资源的限制,Docker 采用虚拟网络设置(Virtual Network Device)的方式,将不同命名空间的网络设备连接到一起,这种设备对都是成对存在的,一端作为容器的网卡eth0,一端连接到宿主机上的docker网桥 veth,从而实现 Docker 主机上不同 namespace通信。简述 Docker 如何用 namespace 来进行资源隔离?
Docker 主要通过六大 Namespace 来实现资源的隔离,如下:容器相关 容器退出后,通过docker ps 命令查看不到,数据会丢失么?
- Mount Namespace,挂载命名空间,用来隔离挂载目录,让不同 Namespace 拥有独立的挂载结构,而程序中对挂载信息的修改不会影响到其他 Namespace 中程序的运行。
- UTS Namespace,UTS Namespace,用来隔离主机名和域名,通过UTS Namespace,让不同 Namespace 拥有独立的主机名称和网络访问域名。
- IPC Namespace,进程通信命名空间,用来隔离进程间通信,主要作用于 消息队列、信号量或者是管道,IPC 只能做到同一个命名空间进行通信,无法做到不同命名空间进行信息交换通信。
- PID Namespace,进程命名空间,用来隔离进程的运行信息,PID Namespace 让命名空间拥有独立的进程号管理。
- Networt Namespace,网络命名空间,用来隔离网络协议栈,包括网络设备接口、IPV4 和 IPV6 协议等。
- User Namespace,用户命名空间,用来隔离用户和用户组信息,通过严格的用户隔离机制,避免 Namespace 中的程序直接操作到宿主机或者其他 Namespace 中的用户。
容器退出后会处于终止( exited)状态,此时可以通过如何停止所有正在运行的容器?docker ps -a
查看。其中的数据也不会丢失,还可以通过docker start
命令来启动它。只有删除掉容器才会清除所有数据。
可以使用如何清理批量后台停止的容器?sudo docker kill $ (sudo docker ps -q)
命令。
可以使用如何给容器指定一个固定IP地址,而不是每次重启容器IP地址都会变?sudo docker rm $ (sudo docker ps-a -q)
命令。
使用pipework工具如何临时退出一个正在交互的容器的终端,而不终止它?
也可以:https://yaxin-cn.github.io/Docker/docker-container-use-static-IP.html
按Ctrl-p Ctrl-g。 如果按Ctrl-c往往会让容器内应用进程终止,进而会终止容器。很多应用容器都是默认后台运行的,怎么查看它们的输出和日志信息?
使用docker logs 命令,后面跟容器名称或ID信息。使用“dockerport”命令映射容器的端口时,系统报错Error:Nopublicport’80’published for xxxxxx,是什么意思?
可以在一个容器中同时运行多个应用进程吗?
- 创建镜像时Dockerfile 要指定正确的EXPOSE的端口。
- 容器启动时指定PublishAllPort=true。
一般并不推荐在同一个容器内运行多个应用进程。如果有类似需求,可以通过一些额外的进程管理机制,比如supervisord来管理所运行的进程。如何控制容器占用系统资源(CPU、内存)的份额? 答:在使用
docker create
命令创建容器或使用docker run
创建并启动容器的时候,可以使用-cl--cpu-shares[=0]
参数来调整容器使用CPU的权重;
使用-m|--memory [=MEMORY]
参数来调整容器使用内存的大小。仓库相关 仓库(Repository)、注册服务器(Registry)、 注册索引(Index)有何关系?
首先,仓库是存放一组关联镜像的集合,比如同一个应用的不同版本的镜像。注册服务器是存放实际的镜像文件的地方。注册索引则负责维护用户的账号、权限、搜索、标签等的管理。因此,注册服务器利用注册索引来实现认证等管理。从非官方仓库下载镜像时候,有时候会提示“Error:Invalid registry endpoint …?
Docker自1.3.0 版本往后,加强了对镜像安全性的验证,需要手动添加对非官方仓库的信任。编辑Docker配置文件,在其中添加:配置相关 Docker的配置文件放在哪里,如何修改配置?DOCKER OPTS="--insecure-registry dl.dockerpool.com:5000"
之后,重启Docker服务即可。
Ubuntu系统的配置文件是/etc/default/docker,如何修改Docker默认存储位置?
Centos 系统的配置文件放在/etc/sysconfig/docker。
Docker 的默认存储位置是/var/ lib/docker,如果希望将Docker的本地文件存Docker与虚拟化 Docker与LXC (Linux Container)有何不同?
储到其他分区,可以使用Linux软连接的方式来完成。
LXC利用Linux上相关技术实现了容器。Docker 则在如下的几个方面进行了改进:Docker与Vagrant有何不同?
- 移植性:通过抽象容器配置,容器可以实现从一个平台移植到另个平台;
- 镜像系统:基于AUFS的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;
- 版本管理:类似于Git的版本管理理念,用户可以更方便的创建、管理镜像文件;
- 仓库系统:仓库系统大大降低了镜像的分发和管理的成本;
- 周边工具:各种现有工具(配置管理、云平台)对,Docker的支持,以及基于Docker的PaaS、CI等系统,让Docker的应用更加方便和多样化。
两者的定位完全不同.
【Go全栈面试题(7) -Docker面试题】简单说:Vagrant适合用来管理虚拟机,而Docker适合用来管理应用环境。
- Vagrant类似于Boot2Docker (一款运行Docker 的最小内核),是一套虚拟机的管理环境。Vagrant可以在多种系统上和虚拟机软件中运行,可以在Windows、Mac等非Linux平台上为Docker提供支持,自身具有较好的包装性和移植性。
- 原生的Docker自身只能运行在Linux平台上,但启动和运行的性能都比虚拟机要快,往往更适合快速开发和部署应用的场景。
推荐阅读
- linux|2022年云原生趋势
- 个人日记|K8s中Pod生命周期和重启策略
- k8s|k8s(六)(配置管理与集群安全机制)
- Go|Docker后端部署详解(Go+Nginx)
- docker|Docker
- 【快速学习】docker构建java项目实践
- Alpine Docker 安装 bash
- docker|docker导入dmp文件到oracle容器
- 阿里云docker开发者平台镜像上传和下载
- 工具|dockers 自定义tomcat