如何查看镜像支持的环境变量?
sudo docker run IMAGE env
如何批量清理临时镜像文件?
sudo docker rmi $(sudo docker images -q -f danging=true)
其中,dangling=true
表示虚悬镜像。
虚悬镜像(dangling image): 镜像没有仓库名或没有标签
查询显示虚悬镜像:docker images -f dangling=true
谈谈 Docker Storage Driver(存储驱动)
每个 Docker 容器都有一个本地存储空间,用于保存层叠的镜像层(Image Layer)以及挂载的容器文件系统。
默认情况下,容器的所有读写操作都发生在其镜像层上或挂载的文件系统中,所以存储是每个容器的性能和稳定性不可或缺的一个环节。
以往,本地存储是通过存储驱动(Storage Driver)进行管理的,有时候也被称为 Graph Driver。
虽然存储驱动在上层抽象设计中都采用了栈式镜像层存储和写时复制(Copy-on-Write)的设计思想,但是 Docker 在 Linux 底层支持几种不同的存储驱动的具体实现,每一种实现方式都采用不同方法实现了镜像层和写时复制。
虽然底层实现的差异不影响用户与 Docker 之间的交互,但是对 Docker 的性能和稳定性至关重要。
- 在 Linux 上,Docker 可选择的一些存储驱动包括 AUFS(最原始也是最老的)、Overlay2(可能是未来的最佳选择)。
- Docker 在 Windows 操作系统上只支持一种存储驱动,即 Windows Filter。
存储驱动的选择是节点级别的。这意味着每个 Docker 主机只能选择一种存储驱动,而不能为每个容器选择不同的存储驱动。
在 Linux 上,可以通过修改 /etc/docker/daemon.json
文件来修改存储引擎配置,修改完成之后需要重启 Docker 才能够生效。
下面的片段展示了如何将存储驱动设置为 Overlay2
:
{ "storage-driver": "overlay2" } 复制代码
容器相关
Docker容器是什么?
Docker容器是一个具体的镜像实例,Docker容器包括应用程序及所有的依赖项,作为操作系统的独立进程运行。
解释容器编排以及我们为什么需要使用它?
容器编排有助于管理大型环境中运行的容器。
容器编排可以控制和自动化以下任务:
- 容器的供应和部署
- 负载均衡
- 容器之间的资源分配
- 监控容器和主机的健康状况
- 容器的缩放
Docker容器有几种状态?
- created:已经被创建(使用
docker ps -a
命令可以列出)但是还没有被启动 (使用docker ps
命令无法列出) - running:运行中
- paused:容器的进程被暂停了
- restarting:容器的进程正在重启过程中
- exited:表示容器之前运行过但是现在处于停止状态(要区别于 created 状态,它是指一个新创建出的尚未运行过的容器),可以通过
start
命令使其重新进入 running 状态 - destroyed:容器被删除了,再也不存在了
容器与主机之间的数据拷贝命令?
docker cp
命令用于容器与主机之间的数据拷贝
- 主机到容器:
docker cp /www 96f7f14e99ab:/www/
- 容器到主机:
docker cp 96f7f14e99ab:/www /tmp
如何监控运行的Docker容器?
Docker提供docker stats
和docker events
等工具来监控生产中的docker。我们可以使用这些命令获取重要统计数据的报告。
docker stats
:获得容器的CPU,内存等资源使用情况,默认情况下,stats 命令会每隔 1 秒钟刷新一次输出的内容直到你按下ctrl + c
,如果不想持续的监控容器使用资源的情况,可以通过--no-stream
选项只输出当前的状态。docker events
:用于打印出实时的系统事件。
启动nginx容器(随机端口映射),并挂载本地文件目录到容器html的命令?
docker run -d -p --name nginx2 -v /home/nginx:/usr/share/nginx/html nginx
容器退出后,通过docker ps 命令查看不到,数据会丢失么?
容器退出后会处于 终止(exited) 状态,此时可以通过 docker ps -a
查看,其中数据不会丢失,还可以通过 docker start
来启动,只有删除容器才会清除数据。
如何停止所有正在运行的容器?
docker kill $(sudo docker ps -q)
如何清理批量后台停止的容器?
docker rm $(sudo docker ps -a -q)
如何临时退出一个正在交互的容器的终端,而不终止它?
docker 以交互式的方式启动容器后,如果使用exit退出交互界面后,整个容器都会exit(按Ctrl+c
会使容器内的应用进程终止,进而会使容器终止)。但是如何使我们退出交互模式的同时不关闭容器呢,那就是在要退出交互模式时不使用exit还是使用命令 Ctrl+P+Q
(先按Ctrl+p
,后按Ctrl+q
)。
如何退出容器时候自动删除?
使用 -rm
选项,例如:sudo docker run -rm -it ubuntu
。
怎么快速查看本地的镜像和容器?
- 通过
docker images
来快速查看本地镜像。 - 通过
docker ps -a
快速查看本地容器。
很多应用容器都是默认后台运行的,怎么查看它们的输出和日志信息?
使用docker logs
,后面跟容器的名称或者ID信息。
可以在一个容器中同时运行多个应用进程吗?
一般不推荐在同一个容器内运行多个应用进程。
如果有类似需求,可以通过额外的进程管理机制。比如,supervisord
来管理所运行的进程。
其他
仓库(Repository)、注册服务器(Registry)、注册索引(Index)有何关系?
- 仓库:存放一组关联镜像的集合,比如同一个应用的不同版本的镜像。
- 注册服务器:存放实际的镜像的地方。
- 注册索引:负责维护用户的账号,权限,搜索,标签等管理。
注册服务器利用注册索引来实现认证等管理。
Docker能在非Linux平台(Windows+MacOS)上运行吗?
可以
如何将一台宿主机的docker环境迁移到另外一台宿主机?
- 停止Docker服务。
- 将整个docker存储文件复制到另外一台宿主机上。
- 然后调整另外一台宿主机的配置即可。
Docker 与 虚拟机有何不同?
- 相比于虚拟机,Docker更快速(秒级启动)、轻便(联合文件系统)。
- Docker 是轻量级的沙盒,在其中运行的只是应用,虚拟机里面还有额外的系统。
- Docker是一个系统进程;虚拟机是在操作系统中的操作系统。
- Docker:体积小、启动速度快、性能好;虚拟机:体积大、启动速度慢、性能一般。
Docker 与 LXC(Linux Container)有何不同?
Linux Container 容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,LXC 利用 Linux 上相关技术实现容器。
Docker 则在如下的几个方面进行了改进:
- 移植性:通过抽象容器配置,容器可以实现一个平台移植到另一个平台;
- 镜像系统:基于 AUFS 的镜像系统为容器的分发带来了很多的便利,同时,共同的镜像层只需要存储一份,实现高效率的存储;
- 版本管理:类似于 GIT 的版本管理理念,用户可以更方面的创建、管理镜像文件;
- 仓库系统:仓库系统大大降低了镜像的分发和管理的成本;
- 周边工具:各种现有的工具(配置管理、云平台)对 Docker 的支持,以及基于Docker 的 Pass、CI 等系统,让 Docker 的应用更加方便和多样化。