一. 当使用docker pull命令去远程仓库docker hub拉取镜像时,docker会判断本地镜像仓库是否存在这个镜像,如果镜像不存在再去远程仓库下载
二.docker镜像本质上就是多个文件,UFS(Union File System)
将镜像打成tar包并解压后会发现:
当我们操作容器的时候,其实是操作容器upperDir(读写层),会将我们的操作保留至读写层。
如果在容器进行读写操作并生成镜像,则该读写层会保留为镜像读写层(最上层)。
执行:docker inspect imageID/containnerID:
可以通过docker inspect imageID/containnerID 查看镜像联合文件系统中每个文件对应的宿主机目录,
案例:
1. 启动nginx
2. 执行:docker inspect 9a11665e5e43,查看容器upperDir路径
3.cd 到upperDir目录(无法找到usr目录)
4.进入nginx容器(进行读写操作,更改/usr/share/nginx/html目录下 index.html)
5.再次 打开浏览器
6.再次去upperDir目录下
结论:
1.当我们操作容器的时候,其实是操作容器的upperDir(读写层)
2.当我们在容器进行读写操作后,如果不利用docker commit打包成镜像,当容器删除该读写层也随之删除,不会保留任何记录,若在容器进行读写操作并生成镜像,则该读写层会保留为镜像读写层(最上层)。
3.但是镜像是无法进行数据持久化,因为会被宿主机挂载的目录覆盖。持久化是指将容器运行产生的数据进行持久化,需要持久化的数据挂载到宿主机,当容器宕机或者被删除,再运行新的容器也能通过容器数据卷得到宿主机挂载目录的数据,从而达到数据持久化的目的。
三.容器数据持久化的两种方式
1.volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
2.bind mounts:将宿主机上任意位置的文件或者目录挂载到容器中(常用)
区别:bind mounts能指定宿主机的挂载目录,volumes固定宿主机挂载目录为/var/lib/docker/volumes
volumes示例:
docker volume create nginx-vol #创建容器数据卷
docker volume ls #显示所有容器数据卷
docker volume inspect nginx-vol #容器数据卷详情
docker run -d --name=nginx -v nginx-vol:usr/share/nginx/html nginx
bind mounts示例:
docker run -d --name=nginx -v /wuqirui/nginx:usr/share/nginx/html nginx