本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2022-07-06
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。
UnionFS(联合文件系统):是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
特性是,一次同时加载多个文件系统,但从外面看来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统包含所有底层的文件和目录。
bootfs包含了bootloader和kernel(Linux内核)。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system)则包含了一般系统上的常见目录结构,类似于/dev, /proc, /bin等等以及一些基本的文件和命令,在 bootfs之上。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等。
aufs(advanced multi layered unification filesystem),是一种可堆叠的文件系统。
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就行了,由此可见不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版本可以公用bootfs。
Docker的文件系统是分层的,最大的好处就是共享资源,方便复用。多个镜像可以从同一个base镜像构建而来,那么Docker就只需要保存一份base镜像,内存中也只需要加载一份就可以为所有容器服务了,而且镜像的每一层都可以被共享。
Docker的rootfs在挂载之后会转为只读模式。image是只读的,container部分则是可写的。当容器启动时,一个新的可写层被加载到镜像的顶部,这就是容器层,容器层之下就是镜像层。
docker commit提交容器副本使之称为一个新的镜像,格式为:
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名[:标签名]
# 下载registry镜像
docker pull registry
# 后台守护式启动私有仓库容器,默认仓库被创建在容器的/var/lib/registry目录下,建议自行使用容器卷映射,方便宿主机联调
docker run -d -p 5000:5000 -v /xxx/myregistry:/tmp/registry --privileged=true registry
# -v A:B 设置数据卷 A是宿主机的路径 B是容器内的路径
# 查询当前私有仓库有哪些镜像
curl -XGET http://yourip:5000/v2/_catalog
# 将需要推送到私有仓库的镜像改名为符合私服规范的tag 创建一个副本
docker tag 容器名:标签 yourip:5000/容器名:标签
# 修改配置文件使之支持http
cat /etc/docker/daemon.json
# 加一个配置
# {
# "insecure-registries": ["yourip:5000"]
# }
# 修改会不生效,可以先检查json格式,再重启docker systemctl restart docker
# 将本地镜像推送到私有仓库 (即上面改完名之后成本的一个副本镜像)
docker push yourip:5000/容器名:标签
# 验证 查看私有仓库上的镜像
curl -XGET http://yourip:5000/v2/_catalog
# 拉下来使用
docker pull yourip:5000/容器名:标签
设置参数 -v A:B
就是设置容器数据卷的。
Docker挂载主机目录访问如果出现 cannot open directory, :Permission denied,解决办法是在挂载目录后多加一个 –privileged=true参数即可
容器数据卷是将本地路径与容器内的路径进行映射,使得容器内的数据能备份+持久化到本地的主机目录
特点:
查看容器数据卷挂载在哪了 docker inspect 容器id
,返回的信息中有一个Mounts
数组,其中数组项的Source
属性代表宿主机目录,Destinnation
属性代表容器内目录。
# 普通设置数据卷
docker run -it --privileged=true -v 宿主机绝对路径目录:容器内目录 --name=容器名 镜像名
# 默认的权限能读写
docker run -it --privileged=true -v 宿主机绝对路径目录:容器内目录:rw --name=容器名 镜像名
# 设置只读不能写 readonly
docker run -it --privileged=true -v 宿主机绝对路径目录:容器内目录:ro --name=容器名 镜像名
# 此时如果宿主机写入内容 可以同步给容器内 容器可以读取到
# 容器1完成和宿主机的映射
docker run -it --privileged=true -v 宿主机绝对路径目录:容器内目录 --name=container1 镜像名
# 容器2继承容器1的卷规则
docker run -it --privileged=true --volumes-from containe1 --name=container2 镜像名
# 这样文件共享就在容器1、容器2、宿主机三个之间都保持共享