概念解读
系统虚拟化与容器虚拟化
系统虚拟化,Hypervisor Virtualization,全虚拟化。在 Host 中通过 Hypervisor 层实现安装多个 GuestOS。每个 GuestOS 都有自己的内核,和主机的内核不同,GuestOS 之间完全隔离。
容器虚拟化,Operating System Virtualization ,使用 Linux 内核中的 namespaces 和 cgroups实现进程组之间的隔离。是用内核技术实现的隔离,所以它是一个共享内核的虚拟化技术。
注:容器虚拟化没有 GuestOS,使用 Docker 时下载的镜像,只是为运行 App 提供的一个依赖的环境,是一个删减版本的系统镜像。一般情况下系统虚拟化没有容器虚拟化的运行效率高,但是系统安全性高很多。
知识点总结
Dockerfile编写
- 将RUN apt-get update和apt-get install组合成一条RUN声明。
如果将apt-get update放在一条单独的RUN声明中会导致缓存问题以及后续的apt-get install失败。 - 指令过apt-get install相关指令后,需要清理掉apt缓存。
rm -rf /var/lib/apt/lists/*
注意:官方的 Debian 和 Ubuntu 镜像会自动运行apt-get clean,所以不需要显示的调用apt-get clean。
- ADD和COPY的使用
- 虽然ADD和COPY功能类似,但一般优先使用COPY。因为它比ADD更透明。
- COPY只支持简单将本地文件拷贝到容器中,而ADD有一些并不明显的功能(比如本地 tar 提取和远程 URL 支持)。因此,ADD的最佳用例是将本地 tar 文件自动提取到镜像中。
- 如果你的 Dockerfiles 有多个步骤需要使用上下文中不同的文件。单独COPY每个文件,而不是一次性COPY完。这将保证每个步骤的构建缓存只在特定的文件变化时失效。
- 为了让镜像尽量小,最好不要使用ADD指令从远程 URL 获取包,而是使用curl和wget。这样你可以在文件提取完之后删掉不再需要的文件,可以避免在镜像中额外添加一层。
注:ADD指令不能和其他指令合并,所以前者ADD指令会单独产生一层镜像。而后者可以将获取、提取、安装、删除合并到同一条RUN指令中,只有一层镜像。
docker空间管理
## 查看空间
docker system df
## 查看volume容器
docker volume ls(查看volume容器id:docker volume ls -qf dangling=true)
## 删除所有容器
docker rm `docker ps -a -q`
## 删除所有关闭的容器
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm(docker rm $(sudo docker