Docker学习二:Docker镜像原理

Docker镜像原理

镜像定义

轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件

所有的应用,直接打包docker镜像,就可以跑起来。

获取镜像:

  • 从远程仓库
  • 拷贝
  • 自己制作DockerFile

Docker镜像加载原理

UnionFS:封层、轻量级并且高性能的文件系统。支持对文件系统的修改和提交来一层层叠加

Docker的镜像其实就是一层一层的文件系统组成

对一些精简的OS,rootfs可以很小。只需要基本的命令。工具和程序库。底层直接用Host的kernel

Docker分层理解

如果有之前已有的文件层,不会重复下载,而是进行复用。类似叠加的操作

提交分层镜像 Commit

1.启动一个默认的tomcat
2.将一些文件拷贝进去
3.将容器作为一个新的镜像进行commit
4.想要保存当前的容器状态,就可以通过commit来提交,获得一个镜像

image-20200524161949673

Docker容器数据卷

定义

docker的理念:将应用和环境打包成一个镜像!

如果剧都在容器中,那么容器删除,数据就会丢失 —> 需求,数据可以持久化

容器之间可以由一个数据共享的技术!Docker容器中产生的数据,同步到本地

将容器内的目录,挂载到linux上面。

总结:容器的持久化和同步操作!容器间可以实现数据共享!

使用数据卷

方式一:使用命令挂载 -v

docker run -it -v 主机目录:容器内目录
# 挂载本地与容器
docker run -it -v /home/test:/home centos /bin/bash

#启动后用docker inspect进行测试

image-20200524162909989

运行结果:

image-20200524163111581

同理,宿主主机上的文件修改也会在容器中同步。

以后修改只需要在本地修改即可:容器内会自动同步

安装MySQL

注意需要配置一个初识密码密码

#设置初识密码
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

docker run -d -p 3310: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
# -d 后台运行
# -p 端口映射
# -v 数据卷挂载
# -e 设置mysql的初识密码
# --name 设置运行时的进程名


image-20200524165806722

删除容器后,挂载到本地的数据卷依旧会被保留 — 实现了数据的持久化

# 匿名挂载:没有起名字 -- 仅指明了容器内的数据目录 -- etc/var
# -P 随机端口映射
docker run -d -P --name nginx-1 -v etc/var nginx 

# 具名挂载,通过 -v 加上容器内路径 -- 建议使用

大部分时候都是用具名挂载

-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径::容器内路径 #指定路径挂载

拓展

# 通过 -v 容器内路径:ro rw 改变读写权限
ro -- 只读
rw -- 可读可写

# 一旦设置了容器权限,容器对我们挂载的内容就有限定了
# ro 只能通过宿主主机来操作

DockerFile初识

DockerFile是用来构建docker镜像的构建文件!命令脚本

通过脚本生成镜像,镜像是一层层的,脚本的一个个命令,都是一层

docker build -f dockerfile1 -t dennis/centos:1.0 .
#其中dockerfile1的内容如下。指令都是大写的
FROM centos

VOLUME ["volume1","volume2"]

CMD echo "-----end---"
CMD /bin/bash
#这里的每个命令就是镜像的一层

image-20200524171423832

image-20200524171836720

这个卷和外部一定有一个同步的目录! — 匿名挂载

image-20200524172405409

这是一个匿名挂载卷

数据卷容器

多个mysql共享数据!

利用一个容器实现多个容器之间的数据共享

#在创建容器的时候使用命令 --volumes-from [容器1]
新创建的容器会与容器1的数据进行同步。 --- 这里的容器1就是数据卷容器
# 实验,删除了最开始链接的dennis1之后,dennis2与dennis3之间还是可以保持数据共享

image-20200524173651079

这是一种备份的机制

多个mysql数据共享

docker run -d -p 3310: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

docker run -d -p 3311:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
#这个时候,可以实现两个容器的数据同步

结论:

  • 容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
  • 但是一旦持久化到了本地,这个时候,本地的数据不会被删除

猜你喜欢

转载自blog.csdn.net/qq_41989109/article/details/106320549