镜像是什么
001 一个分层存储的文件,不是一个单一的文件
002 一个软件的环境
003 一个镜像可以创建N个容器
004 一种标准化的交付
005 一个不包含Linux内核而又精简的Linux操作系统
镜像从哪里来
Docker Hub是由Docker公司负责维护的公共镜像仓库,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
地址:https://hub.docker.com
-----------------------------------------------------------------------------
配置镜像加速器:
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
镜像存储位置
[root@es3 ~]# docker info
Docker Root Dir: /var/lib/docker
Storage Driver: overlay2
[root@es3 overlay2]# cd /var/lib/docker/overlay2
----------------------------------------------------------------------------
001 分层存储
002 Dockerfile的每一行指令都是一层存储
镜像与容器联系
1638312184354.png镜像:类似于虚拟机镜像,一个只读模板
容器:通过镜像创建的运行实例
管理镜像常用命令
指令 | 描述 | |
---|---|---|
ls | 列出镜像 | docker image ls |
build | 构建镜像来自Dockerfile | |
history | 查看镜像历史 | docker history redis |
inspect | 显示一个或多个镜像详细信息 | docker inspect redis |
pull | 从镜像仓库拉取镜像 | |
push | 推送一个镜像到镜像仓库 | |
rm | 移除一个或多个镜像 | docker image rm nginx |
prune | 移除没有被标记或者没有被任何容器引用的镜像 | docker image prune -a |
tag | 创建一个引用源镜像标记目标镜像 | |
save | 保存一个或多个镜像到一个tar归档文件 | docker save nginx:latest > nginx.tar |
load | 加载镜像来自tar归档或标准输入 | docker load <nginx.tar |
#删除所有的容器
[root@es3 overlay2]# docker rm -f $(docker ps -aq)
镜像存储核心技术:联合文件系统(UnionFS)
1638314309288.png1638314348154.png
镜像怎么高效存储?
难道像虚拟机那样一个容器对应一个独立的镜像文件?这样对于密集型容器,磁盘占用率太大!
答:引入联合文件系统,将镜像多层文件联合挂载到容器文件系统
写时复制(COW)
1638314683897.png了解联合文件系统后,我们知道,镜像是只读的,类似共享形式让多个容器使用,如果要在容器里修改文件,即镜像里的文件,那该怎么办呢?
答:引入写时复制(copy-on-write),需要修改文件操作时,会先从镜像里把要写的文件复制到自己的文件系统中进行修改。
------------------------------------------------------------
[root@es3 ~]# docker ps
CONTAINER ID IMAGE
7c072f3408a7 nginx
[root@es3 ~]# docker inspect 7c072f3408a7
LowerDir:镜像层
UpperDir:容器层
MergedDir:合并层,展示给最终用户
------------------------------------------------------------
001 所有容器的镜像层的init是不变的,共同引用基础镜像
002 所有容器的容器层是不一样的
优化建议
001 使用SSD固态硬盘
002 使用卷作为频繁读写文件的工作目录,绕过存储驱动,减少抽象的开销
网友评论