容器数据卷
容器数据卷介绍
Docker容器运行时产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷来实现容器内数据与我们指定的目录文件同步,当某一方数据发生修改时,另一方也随之改变。
因此,容器的持久化和同步操作!容器间数据也是可以共享的!
使用数据卷
方式一:直接使用-v命令挂载
本机中装有的镜像
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ReGa6flw-1648561803297)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329210304975.png)]
用以下命令运行centos镜像
[root@iZwz9bpgwmtcokdzlg5sv0Z ~]# docker run -it -v /home/test:/home centos /bin/bash
[root@8fe371c5f10c /]# cd /
[root@8fe371c5f10c /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
这里/home/test为主机目录,/home centos为容器目录,有时候会在容器目录后加上:ro或者:rw,代表容器目录的只读或者可读可写权限。这是指定的主机目录被挂载。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c0qULS1K-1648561803298)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329211355959.png)]
修改主机内的数据,观察容器是否同步(测试成功)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-78HeGx4W-1648561803298)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329212317462.png)]
再来测试(测试通过)
- 停止容器
- 主机上修改文件
- 启动容器
- 容器内的数据依旧是同步的!
具名与匿名挂载
匿名挂载:即用命令行来实现数据卷挂载时,不指定主机挂载路径,直接使用 -v 容器路径。
[root@iZwz9bpgwmtcokdzlg5sv0Z ~]# docker run -it -v /home centos /bin/bash
具名挂载:即用一个自定义的名字来取代主机路径。
[root@iZwz9bpgwmtcokdzlg5sv0Z test]# docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx
515d09242c0ffaafb566b60fdfa7491832f0b994b0002b44db8d37a9fcdc0be9
[root@iZwz9bpgwmtcokdzlg5sv0Z test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
515d09242c0f nginx "/docker-entrypoint.…" 35 seconds ago Up 34 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp nginx01
#查看所有卷
[root@iZwz9bpgwmtcokdzlg5sv0Z test]# docker volume ls
DRIVER VOLUME NAME
local 8a29251fcab0df56f5f048d8b6da913ffde329575de7fb1114d6002caa4632a3
local juming-nginx
#查看数据卷的详细信息
[root@iZwz9bpgwmtcokdzlg5sv0Z test]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-03-29T21:37:25+08:00",
"Driver": "local",
"Labels": null,
#这里可查看主机被挂载目录
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
根据上述,三种挂载方式:
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /主机路径:容器内路径 # 指定路径挂载
除此之外,还有一种挂载方式dockerFile
DockerFile
dockerFile是用来构建docker镜像的文件!命令参数脚本!
构建步骤
1. 编写一个dockerFile文件
2.docker build 构建成为一个镜像
3. docker run 运行镜像
4. docker push 发布镜像(DockerHub、阿里云镜像)
基础知识:
- 每个保留关键字(指令)都是必须大写字母
- 执行从上到下顺序执行
#
表示注释- 每个指令都会创建提交一个新的镜像层,并提交!
dockerFile是面向开发的, 我们以后要发布项目, 做镜像, 就需要编写dockefile文件, 这个文件十分简单!
Docker镜像逐渐成为企业的交互标准,必须要掌握!
步骤:开发,部署, 运维… 缺一不可!
DockerFile: 构建文件, 定义了一切的步骤,源代码
DockerImages: 通过DockerFile构建生成的镜像, 最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供服务器
DockerFile指令说明
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY # 类似ADD, 将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
我们可以在编写命令脚本时用volume来规定挂载路径。