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实现数据共享

容器直接配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。