Docker笔记-容器数据卷

Docker笔记-容器数据卷

docker的理念将运行的环境打包形成容器运行,运行可以伴随容器,但是我们对数据的要求是希望持久化,容器

之间可以共享数据,Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为容器的一

部分保存下来,那么当容器被删除之后,数据也就没了,为了能够保存数据,在docker容器中使用卷。卷就是目

录或者文件,存在于一个或者多个容器中,但是不属于联合文件系统,因此能够绕过Union File System提供一些

用于持久化数据或共享数据的特点。

添加数据卷的方式有两种,第一种是直接通过命令行挂载,第二种是通过dockerFile添加。

1、通过命令挂载

$ docker run -it -v /宿主机绝对路径目录:/容器内目录  镜像名

1.1 指定路径挂载

# 获取镜像
$ docker pull mysql:5.7

在这里插入图片描述

# 启动MySQL
# -d 后台运行
# -p 端口映射
# -v 卷挂载
# -e 环境配置
# --name 容器名字
$ docker run -d -p 3306:3306 -v /home/zhangshixing/work/linuxmysql/conf:/etc/mysql/conf.d -v /home/zhangshixing/work/linuxmysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name zsxmysq1 mysql:5.7

在这里插入图片描述

在这里插入图片描述

1.2 匿名挂载

$ docker pull nginx
[root@zsx linuxmysql]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
eff15d958d66: Pull complete 
1e5351450a59: Pull complete 
2df63e6ce2be: Pull complete 
9171c7ae368c: Pull complete 
020f975acd28: Pull complete 
266f639b35ad: Pull complete 
Digest: sha256:097c3a0913d7e3a5b01b6c685a60c03632fc7a2b50bc8e35bcaa3691d788226e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
# -v容器内路径
$ docker run -d -P --name mynginx -v /ect/nginx nginx

在这里插入图片描述

# 查看所有的volume的情况
$ docker volume ls
[root@zsx linuxmysql]# docker volume ls
DRIVER    VOLUME NAME
local     9c4a5b5d2489bfed1f8d247349444362c96dd54d2b30454e2bb62eb370a8fd1b
local     50ea91e78556e99ee7a0ae4fb62e97b83c92e70aec54bb3b5a1038fa093c4555
local     629aa14a8191229b0b52b17198400ca69c6391285b6917a9a447bb8f58fd2a75
local     a542052cdf3ee37e072281e2d5c66b512a6db5f286a2cc5c6a1c5b442c93eaa8
local     my_wordpress_db_data
local     my_wordpress_wordpress_data

1.3 具名挂载

$ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

在这里插入图片描述

$ docker volume ls
root@zsx linuxmysql]# docker volume ls
DRIVER    VOLUME NAME
local     9c4a5b5d2489bfed1f8d247349444362c96dd54d2b30454e2bb62eb370a8fd1b
local     50ea91e78556e99ee7a0ae4fb62e97b83c92e70aec54bb3b5a1038fa093c4555
local     629aa14a8191229b0b52b17198400ca69c6391285b6917a9a447bb8f58fd2a75
local     a542052cdf3ee37e072281e2d5c66b512a6db5f286a2cc5c6a1c5b442c93eaa8
local     juming-nginx
local     my_wordpress_db_data
local     my_wordpress_wordpress_data
# 可以得到在宿主机上的卷的位置
$ docker volume inspect juming-nginx
[root@zsx linuxmysql]# docker volume inspect juming-nginx
[{"CreatedAt": "2021-11-18T17:44:10+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data","Name": "juming-nginx","Options": null,"Scope": "local"}
]
[root@zsx linuxmysql]# docker volume inspect 9c4a5b5d2489bfed1f8d247349444362c96dd54d2b30454e2bb62eb370a8fd1b
[{"CreatedAt": "2021-11-18T17:39:09+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/9c4a5b5d2489bfed1f8d247349444362c96dd54d2b30454e2bb62eb370a8fd1b/_data","Name": "9c4a5b5d2489bfed1f8d247349444362c96dd54d2b30454e2bb62eb370a8fd1b","Options": null,"Scope": "local"}
]

如何确定是具名挂载还是匿名挂载,还是指定路径挂载:

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

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

ro    readonly   # 只读
rw    readwrite  # 可读可写
# 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作
$ docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
$ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

2、通过DockerFile添加

Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

# 创建一个Dockerfile文件,名字可以随机,建议Dockerfile
# 文件中的指令(大写)
# 这里的每个命令,就是镜像的一层
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "Hello World!!!"
CMD /bin/bash
# zsx242030/centos:1.0是登录的情况下
$ docker build -f /home/zhangshixing/work/volumetest/dockerfile -t zsx242030/centos:1.0 .
# 没有登录的情况下
$ docker build -f /home/zhangshixing/work/volumetest/dockerfile -t centos:1.0 .
[root@zsx volumetest]# docker build -f /home/zhangshixing/work/volumetest/dockerfile -t centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]---> Running in e77e19d82b76
Removing intermediate container e77e19d82b76---> 0f77fb23826b
Step 3/4 : CMD echo "Hello World!!!"---> Running in 456e49681cf3
Removing intermediate container 456e49681cf3---> 055a082db43e
Step 4/4 : CMD /bin/bash---> Running in babb5220e85c
Removing intermediate container babb5220e85c---> 02f263acec53
Successfully built 02f263acec53
Successfully tagged centos:1.0
[root@zsx volumetest]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
centos       1.0       02f263acec53   30 seconds ago   231MB
nginx        latest    ea335eea17ab   26 hours ago     141MB
mysql        5.7       8b43c6af2ad0   26 hours ago     448MB
centos       latest    5d0da3dc9764   2 months ago     231MB
ubuntu       15.10     9b9cb95443b5   5 years ago      137MB

3、数据卷容器进行数据的双向同步

# 启动之后会有两个容器卷
$ docker run -it --name docker01 centos:1.0
[root@zsx work]# docker run -it --name docker01 centos:1.0
[root@33acc58bfa50 /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var	   volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01
$ docker run -it --name docker02 --volumes-from docker01 centos:1.0
[root@zsx work]# docker run -it --name docker02 --volumes-from docker01 centos:1.0
[root@3499fc3a4a5b /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var	   volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01

在docker01中的volume01中新建一个a.txt文件

[root@33acc58bfa50 /]# cd volume01/
[root@33acc58bfa50 volume01]# touch a.txt
[root@33acc58bfa50 volume01]# ls
a.txt

在docker02中的volume01中查看

[root@3499fc3a4a5b /]# cd volume01/
[root@3499fc3a4a5b volume01]# ls
a.txt
[root@3499fc3a4a5b volume01]# 

在docker02中的volume02中新建b.txt文件

[root@3499fc3a4a5b volume01]# cd ../volume02
[root@3499fc3a4a5b volume02]# touch b.txt
[root@3499fc3a4a5b volume02]# ls
b.txt

在docker01中的volume02中查看

[root@33acc58bfa50 volume01]# cd ../volume02/
[root@33acc58bfa50 volume02]# ls
b.txt

只要有一个容器在运行,数据就会在。

[root@zsx test]# docker inspect 02f263acec53
[{"Id": "sha256:02f263acec53fd4b71a01dc0b194e91ba90069fc1b98c825758c6995e7d4fb3e","RepoTags": ["centos:1.0"],"RepoDigests": [],"Parent": "sha256:055a082db43e9f890e5abd27847eb0a950e9ee76f54eff0d54d8b19e5c2d9f56","Comment": "","Created": "2021-11-18T12:28:21.778839806Z","Container": "babb5220e85cd98c6b7267d99b0b8d4372012218f6276d65b9b994e63872e7a2","ContainerConfig": {"Hostname": "babb5220e85c","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/sh","-c","#(nop) ","CMD [\"/bin/sh\" \"-c\" \"/bin/bash\"]"],"Image": "sha256:055a082db43e9f890e5abd27847eb0a950e9ee76f54eff0d54d8b19e5c2d9f56","Volumes": {"volume01": {},"volume02": {}},"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20210915","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"DockerVersion": "20.10.10","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/sh","-c","/bin/bash"],"Image": "sha256:055a082db43e9f890e5abd27847eb0a950e9ee76f54eff0d54d8b19e5c2d9f56","Volumes": {"volume01": {},"volume02": {}},"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20210915","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"Architecture": "amd64","Os": "linux","Size": 231268856,"VirtualSize": 231268856,"GraphDriver": {"Data": {"MergedDir": "/var/lib/docker/overlay2/38db170a6092df8b72f4c87a12fc9936436f6fb360e19ad69a96a7e084b9bd3a/merged","UpperDir": "/var/lib/docker/overlay2/38db170a6092df8b72f4c87a12fc9936436f6fb360e19ad69a96a7e084b9bd3a/diff","WorkDir": "/var/lib/docker/overlay2/38db170a6092df8b72f4c87a12fc9936436f6fb360e19ad69a96a7e084b9bd3a/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59"]},"Metadata": {"LastTagTime": "2021-11-18T20:28:21.791051431+08:00"}}
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/427780.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

发送成绩的app或小程序推荐

老师们,新学期的第一次月考马上开始,是不是还在为如何高效、便捷地发布成绩而头疼呢?别担心,都2024年了,我们有更智能的方式来解决这个问题! 给大家安利一个超级实用的工具——易查分小程序。这个小程序简…

【Unity踩坑】UI Image的fillAmount不起作用

在游戏场景中,我们经常在界面上展示进度条,当然有各种形状的,线性的,长方形的,圆形,环形等等。 Unity中实现这种效果的话,最基本的方法说是改变Image的fillAmout属性。 如果你是初次使用UI Ima…

基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示,设置电流阈值为80,电流小阈值为50,电压阈值为60,温度阈值为30 随便哪个超过预祝,则继电器切断,LE…

块匹配算法简介(上)

图像中的运动估计方法大致分为两类:光流法和块匹配算法(BMA,Block Matching Algorithm)。本文将介绍BMA的相关内容,包括基本原理、相似度计算准则与常见的几种搜索方法,如三步法、四步法、钻石搜索法等。 1. 背景 视频中相邻帧往往存在大量的相似内容,即只有局部的一些…

Golang | Leetcode Golang题解之第417题太平洋大西洋水流问题

题目: 题解: type pair struct{ x, y int } var dirs []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func pacificAtlantic(heights [][]int) (ans [][]int) {m, n : len(heights), len(heights[0])pacific : make([][]bool, m)atlantic : make([][]bool, …

ansible远程自动化运维、常用模块详解

一、ansible是基于python开发的配置管理和应用部署工具;也是自动化运维的重要工具;可以批量配置、部署、管理上千台主机;只需要在一台主机配置ansible就可以完成其它主机的操作。 1.操作模式: 模块化操作,命令行执行…

Vue 依赖注入组件通信:provide / inject 使用详解

引言 在 Vue.js 中,我们经常会遇到组件之间需要共享数据的情况。一种常见的解决方案是通过 props 和 $emit 事件来进行数据传递,但对于多层嵌套的组件结构或共享状态的场景,这种方式显得繁琐而不直观。 幸运的是,Vue.js 提供了一…

web渗透—RCE

一:代码执行 相关函数 1、eval()函数 assert()函数 (1)原理:将用户提交或者传递的字符串当作php代码执行 (2)passby:单引号绕过:闭合注释;开启GPC的话就无法绕过(GPC就是将单引号转换为"反斜杠单引号"&a…

希亦超声波清洗机值得购买吗?百元清洁技术之王,大揭秘!

现代社会的高速发展,很多人由于工作繁忙的原因,根本没有时间去清洗自己的日常物品,要知道这些日常物品堆积灰尘之后是很容易就滋生细菌的,并且还会对人体的健康造成一定的危害!这个时候很多人就会选择购买一台超声波清…

什么是CSRF攻击,该如何防护CSRF攻击

CSRF攻击(跨站请求伪造,Cross-Site Request Forgery)是一种网络攻击手段,攻击者利用已通过身份验证的用户,诱导他们在不知情的情况下执行未授权操作。这种攻击通常发生在用户登录到可信网站并且有活动的会话时&#xf…

Python编码系列—Python组合模式:构建灵活的对象组合

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

cv2.bitwise_or 提取ROI区域

原图如下所示,想提取圆形ROI区域,红色框 img np.ones(ori_img.shape, dtype"uint8") img img * 255 cv2.circle(img, (50,50), 50, 0, -1) self.bitwiseOr cv2.bitwise_or(ori_img, circle)使用一个和原图尺寸一致的图像做mask,图白圆黑 以…

MySQL:索引02——使用索引

目录 引言 1、自动创建索引 2、手动创建索引 2.1 主键索引 2.2 查看索引信息 2.3 唯一索引 2.4 普通索引 2.5 复合索引 3、删除索引 3.1 主键索引 3.2 其他索引 4、查看执行计划 4.1 不加条件,查询所有 4.2 使用主键查询 4.3 子查询使用索引 4.4 普通索…

【架构设计】多级缓存:应用案例与问题解决策略

【架构设计】多级缓存:应用案例与问题解决策略 多级缓存系统的工作原理及其在提升应用性能方面的关键作用。通过对比本地缓存与分布式缓存的特点 | 原创作者/编辑:凯哥Java | 分类:架构设计系列教程 多级缓存…

在基准测试和规划测试中选Flat还是Ramp-up?

Flat测试和Ramp-up测试是各有优势的,下面我们就通过介绍几种实用的性能测试策略来分析这两种加压策略的着重方向。 基准测试 基准测试是一种测量和评估软件性能指标的活动,通过基准测试建立一个已知的性能水平(称为基准线)&…

WPS生成目录

导航窗格:视图->导航窗格 可修改标题的样式,之后的标题直接套用即可 修改其他标题样式也是这样 添加编号:可以选上面的模版 也可自定义编号 生成目录:引用->目录->选用一个 但是我想把目录插到另一页 当我添加几个标题…

Spark-RDD持久化

一、Spark的三种持久化机制 1、cache 它是persist的一种简化方式,作用是将RDD缓存到内存中,以便后续快速访问,提高计算效率。cache操作是懒执行的,即执行action算子时才会触发。 2、persist 它提供了不同的存储级别&#xff0…

无人机黑飞打击技术详解

随着无人机技术的普及,无人机“黑飞”(未经授权或违反规定的飞行)现象日益严重,对公共安全、隐私保护及重要设施安全构成了严重威胁。为有效应对这一挑战,各国政府和安全机构纷纷研发并部署了一系列无人机黑飞打击技术…

HTML简介

HTML简介 1.HTML概述2.HTML元素3.HTML属性4.HTML 注释5.HTML颜色 1.HTML概述 HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言HTML 不是一种编程语言&#xff0c;而是一种标记语言标记语言是一套标记标签HTML 使用标记标签来描述网页 例子&#xff1a; <htm…

Kotlin cancel CoroutineScope.launch的任务后仍运行

Kotlin cancel CoroutineScope.launch的任务后仍运行 import kotlinx.coroutines.*fun main() {runBlocking {val coroutineScope CoroutineScope(Dispatchers.IO)val job coroutineScope.launch {var i 0while (i < Int.MAX_VALUE) {iprintln(i)}}// 2ms 取消协程delay(…