Docker镜像加载原理
UnionFs(联合文件系统)
是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加。
docker镜像原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
镜像是什么
镜像是一种轻量级、可执行的独立软件包,用于打包软件运行环境和基于运行环境开发的软件。
commit镜像
Docker commit 提交一个容器成为一个新的副本
# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
容器数据卷
什么是容器数据卷?
docker的理念:将应用和环境打包成一个镜像。
数据?如果数据都存在容器中,那么我们容器删除,数据就会丢失!== 需求:数据可以持久化 ==
将容器内的目录挂载到linux上面。卷技术。
为什么使用容器数据卷:为了容器的持久化和同步操作,容器间也是可以数据共享的。
使用数据卷
方式一: 直接使用命令来挂载 -v
# docker run -it -v 主机目录:容器内目录
[root@localhost ~]# docker run -it -v /home/ceshi:/home centos /bin/bash
[root@94dca5cec883 /]#
# 查看是否挂载这成功
docker inspect 容器id
实战:安装mysql
mysql的数据持久化问题
# 获取镜像
[root@localhost ~]# docker pull mysql:5.7
# 运行容器,需要做数据挂载 # 安装数据需要配置密码
# 官方测试docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动mysql,挂载目录
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器命名
[root@localhost ~]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
b2d42bf99c9f1081fccad171cf869d422eb6961445c7e66ec55f3610e3f0736d
[root@localhost ~]#
# 启动成功之后,使用本地工具连接mysql进行测试。
具名和匿名挂载
# 匿名挂载:-v 容器内路径!
-P 随机端口指定
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的volume的情况
[root@localhost ~]# docker volume ls
# 这里发现是匿名挂载,我们在-v
匿名挂载:只写容器的内路径,没有写容器外的路径
# 具名挂载 :通过-V -卷名:容器内路径
[root@localhost ~]# docker run -d -P --name nginx02 -v xiaoming:/etc/nginx nginx
5217f8ad5dc50563de9db4ca10f220a0faa60eca40c63cddb5acac1f50b927c7
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 2f0f08e1f745bb527a45fdc2ab27def1de12edbb461ba164e407b1615a53b97c
local 3f5ecf577201255a39fe3e772a17ffbb1bd02ba9a7d4ccbc71ff9822c1f52234
local xiaoming
# 没有指定目录的情况下都在:/var/lib/docker/
通过具名挂载可以方便的找到我们的一个卷,大多数
[root@localhost ~]# docker volume inspect xiaoming
[
{
"CreatedAt": "2021-08-22T14:02:00-04:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/xiaoming/_data",
"Name": "xiaoming",
"Options": null,
"Scope": "local"
}
]
# 匿名和具名挂载的区别
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:/容器内路径 # 指定路径挂载
拓展:
# 通过-v 容器内路径,ro rw改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦这个设置容器的权限,容器对我们挂载出来的内容就有限制了。
docker run -d -P --name nginx03 -v xiaoming:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v xiaoming:/etc/nginx:rw nginx
# ro 说明只能通过宿主机来操作,容器内部是无法操作的
DockerFile
方式一
DockerFile就是构建docker镜像的构建文件
通过脚本可以生产脚本
# 创建一个dockerfile文件,名字可以随机
# 文件中的内容指令(大写)参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
# 这里的每个命令,都是镜像的一层!
# 启动自己的生成的容器
[root@localhost docker-test-volume]# docker run -it 8a94d73b9137(随机生成的容器id) /bin/bash
[root@1b6d30fa048d /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume02
dev home lib64 media opt root sbin sys usr volume01
# 查看卷挂在的路径
docker inspect 容器ID # mount关键字
数据卷容器
多个mysql同步数据
# --volumes-from 通过这个命令可以实现数据共享
docker run -it --name docker02 --volumes-from docker01 xiaoming/centos:1.0
多个mysql实现数据共享
容器直接配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。