docker之镜像与数据卷

镜像

简介

1.镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量、配置文件

2.将所有的应用和环境11,直接打包成docker镜像,就可以直接运行

获取镜像

        1.从远程仓库下载

        2.从他出拷贝

        3.自己制作一个镜像DockerFile

镜像加载原理

        Docker镜像的加载原理基于UnionFS(联合文件系统)。

        Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支 持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像

特性

        一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系 统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

加载步骤

        1.Docker客户端从Docker镜像仓库下载镜像的每一层。

        2.Docker客户端将每一层按照层叠关系挂载到UnionFS上。

        3.UnionFS将所有的层合并成一个完整的文件系统。

        4.Docker容器内部使用这个根文件系统作为自己的根文件系统。

docker之镜像与数据卷_第1张图片

分层理解

分层结构最大的好处就是资源共享。

如:多个镜像都从相同的 Base 镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。

查看分层:

        docker image inspect 镜像名

docker之镜像与数据卷_第2张图片

 理解

        所有的 Docker镜像都起始于一个基础镜像层,当进行修改或培加新的内容时,就会在当前镜像层之上,创建新的镜像层

        假如基于 Ubuntu Linux16.04 创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加 Python 包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层该像当前已经包含3个镜像层

docker之镜像与数据卷_第3张图片

 特点

        Docker 镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部

        这一层就是我们通常说的容器层,容器之下的都叫镜像层!

docker之镜像与数据卷_第4张图片

 pull 下来的只是 只读文件,run 之后镜像才开始运行,我们平时在 docker 里面操作镜像,此时操作的层次就是容器层

commit镜像

docker commit 提交容器成为一个新的副本

# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]    # tag 表示版本

如果你想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像,就好比使用虚拟机时的快照。

数据卷

数据容器卷:是一种将容器内部目录和本地目录进行挂载的技术,它允许将容器内的数据持久化,并且可以在容器之间共享数据和重用数据

功能

        1.数据持久化:能够将数据保存到本地文件系统,容器删除数据页不会丢失

        2.数据共享:多个容器可以共享一个数据卷,并在其中进行读写操作

        3.数据迁移:通过复制或者移动将数据卷从一个地方迁移到另一个地方

解决问题

        1.数据丢失问题:由于数据卷的持久化特性,即使容器被删除,数据也不会丢失

        2.数据管理问题:多个容器可以共享同一个数据卷,避免了数据管理的复杂性

        3.数据保护问题:数据卷不会被容器生命周期所限制,只要本地文件系统存在,数据就能持久保存

使用

方式一:命令挂载

docker run -it -v 主机目录:容器内目录

# 测试
docker run -it -v /home/ceshi:/home centos /bin/bash

docker之镜像与数据卷_第5张图片

 修改只需要在本地修改即可,容器内会自动同步!只有一个物理地址,二者共享一个资源

具名挂载和匿名挂载

具名挂载

# 具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume ls  

# 通过 -v 卷名:容器内路径
# 查看一下这个卷

docker之镜像与数据卷_第6张图片

匿名挂载

-P 不指定路径
-v 容器内路径!
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有的volume的情况
docker volume ls

# 这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径!

        所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data

        如果指定了目录,docker volume ls 是查看不到的。

        我们通过具名挂载可以方便的找到我们的一个卷,大多数情况使用具名挂载

方式二:Dockerfile

Dockerfile 就是用来构建 docker 镜像的构建文件!相当于命令脚本;通过这个脚本可以生成镜像。镜像是一层一层的,脚本的一个个的命令,每个命令都是一层。

FROM centos

VOLUME ["/data"]

CMD echo "------end------"

VOLUME ["/data"] 指令声明了一个名为 /data 的数据卷。当使用该 Dockerfile 构建镜像并运行容器时,该数据卷将会被自动挂载到容器的 /data 目录下。

通过使用 VOLUME 指令,您可以在 Dockerfile 中声明多个数据卷,并在构建镜像时自动创建它们。

你可能感兴趣的:(k8s,docker,容器,运维)