镜像
简介
1.镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件,他包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量、配置文件
2.将所有的应用和环境11,直接打包成docker镜像,就可以直接运行
获取镜像
1.从远程仓库下载
2.从他出拷贝
3.自己制作一个镜像DockerFile
镜像加载原理
Docker镜像的加载原理基于UnionFS(联合文件系统)。
Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支 持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性
一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系 统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
加载步骤
1.Docker客户端从Docker镜像仓库下载镜像的每一层。
2.Docker客户端将每一层按照层叠关系挂载到UnionFS上。
3.UnionFS将所有的层合并成一个完整的文件系统。
4.Docker容器内部使用这个根文件系统作为自己的根文件系统。
分层理解
分层结构最大的好处就是资源共享。
如:多个镜像都从相同的 Base 镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看分层:
docker image inspect 镜像名
理解
所有的 Docker镜像都起始于一个基础镜像层,当进行修改或培加新的内容时,就会在当前镜像层之上,创建新的镜像层
假如基于 Ubuntu Linux16.04 创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加 Python 包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层该像当前已经包含3个镜像层
特点
Docker 镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部
这一层就是我们通常说的容器层,容器之下的都叫镜像层!
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 run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
docker volume ls# 通过 -v 卷名:容器内路径
# 查看一下这个卷
匿名挂载
-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 中声明多个数据卷,并在构建镜像时自动创建它们。