Docker构成

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2022-07-06

docker镜像

docker镜像加载原理

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提交容器副本使之称为一个新的镜像,格式为:

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名[:标签名]

docker私有仓库

# 下载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/容器名:标签

docker容器数据卷

设置参数 -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、宿主机三个之间都保持共享