docker——数据卷volume:文件共享
volume——如何让容器中的一个目录与宿主机的一个目录进行绑定,实现容器与宿主机之间的文件共享?
数据卷volume功能特性
数据卷:是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定。数据卷 是被设计用来持久化数据的
对于数据卷你可以理解为NFS中的哪个分享出来的挂载点,指宿主机共享的目录。
主要有如下的功能和特性
• 容器中数据的持久存储
• 容器间的资源共享
• 容器的迁移(分布式)
• 对数据卷的修改会立马生效
• 对数据卷的更新,不会影响镜像
• 数据卷默认会一直存在,即使容器被删除 (注意docker自主管理的会被删除,容器删除前一定要对数据卷进行备份)
数据卷volume共享方式:
实现数据卷有如下三种方法
• Bind mount volume:用户需要明确指定容器中的目录和宿主机中的哪个目录进行绑定
• Docker Management Volume:docker daemon自行管理将容器中的目录和宿主机中的哪个目录进行绑定
• 基于一个现有容器实现多个容器之间文件共享
数据卷volume文件共享之Bind Mount Volume
(自己创建文件夹)
第一步:在宿主机创建目录并准备测试文件
[root@ken ~]# mkdir /ken
[root@ken ~]# echo "test for volumes by ken">/ken/index.html
第二步:启动容器
[root@ken ~]# docker container run -it --name ken1 -p 7879:80 --rm -v /ken:/data/ busybox
- it :互动模式登录容器,并分配一个终端
- name :指定容器名称
- p :小p指定容器的80端口映射为宿主机的7879端口。
- rm :表示退出容器时,容器一起删除
- v :指定volumes,格式为: 宿主机共享目录:容器目录 ,这样宿主机的/ken目录就被挂载到了容器的/data/目录下了
第三步:查看挂载点
可以发现容器内有了/data目录而且还有了我们创建测试文件
注意:如果容器内没有我们指定的挂载点,会自动创建
[root@ken ~]# docker container run -it --name ken -v /ken:/data/ busybox
/ # ls /data
index.html
/ # cat /data/index.html
test for volumes by ken
第四步:启动容器的apache
/ # httpd -h /data
第五步:查看端口
可以发现现在宿主机已经有了7879端口了
[root@ken ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:*
LISTEN 0 1024 127.0.0.1:8080 *:*
LISTEN 0 511 *:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 1024 :::7879 :::*
LISTEN 0 70 :::3306 :::*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 :::22 :::*
第六步:浏览器进行访问
现在我们就可以使用宿主机的IP地址加上我们映射的端口就可以访问容器中的网站数据内容了
第七步:修改网站数据进行测试
现在我们修改宿主机分享出去的目录下的内容,检查看容器内的内容是否会发生改变
[root@ken ~]# echo "this is the append line for ken">> /ken/index.html
第八步:浏览器刷新
可以发现我们追加的内容已经可以看到了,说明容器中网站数据内容已经被成功修改了
数据卷volume文件共享之Docker Management Volume:
(系统自己创建文件夹,一般会在/var/lib/docker/volumes/下)
Docker Management Volume与Bind Mount Volume区别就是它会自己管理将会把容器中的目录与宿主机哪个目录进行绑定
实例一、
第一步:启动容器
这个时候的-v后面只需要跟上容器内的一个目录即可
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
第二步:查看容器的目录
可以发现目录不存在也是自动创建
现在目录下没有任何文件
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
/ # ls /data/
/ #
第三步:查看挂载点
我们检查看下容器内的这个目录被挂载到了那个宿主机的那个位置
可以发现容器中的data目录被挂载到了宿主机的如下目录下
[root@ken ~]# docker container inspect ken1 | grep Source
"Source": "/var/lib/docker/volumes/61535b617c3d6a41d2a8dd965622bb44e27029c1fffbb166bc940fcffd069560/_data",
第四步:宿主机创建文件进行测试
我们可以在宿主机的共享目录中创建文件查看容器内是否有相同文件即可验证
[root@ken ~]# cd /var/lib/docker/volumes/61535b617c3d6a41d2a8dd965622bb44e27029c1fffbb166bc940fcffd069560/_data
[root@ken _data]# touch ken{1..5}
[root@ken _data]# ls
ken1 ken2 ken3 ken4 ken5
第五步:容器内查看
第二次查看/data目录下即可发现我们刚才在宿主机内创建的文件了
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
/ # ls /data/
/ # ls /data/
ken1 ken2 ken3 ken4 ken5
/ #
实例二、
第一步:启动容器
这个时候的-v后面只需要跟上容器内的一个目录即可
[root@localhost game]# docker run -d --name http-test -p 90:80 -v /usr/local/apache2/htdocs httpd
e60cdf12daa7450d3aaaf625dde3436e39ea15455bfb95c8fd6ae4a3b463ee25
[root@localhost game]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e60cdf12daa7 httpd "httpd-foreground" 12 seconds ago Up 11 seconds 0.0.0.0:90->80/tcp http-test
391afba79c84 httpd "httpd-foreground" 4 minutes ago Up 4 minutes 0.0.0.0:82->80/tcp httpd
9225fd6da0e2 tomcat:test "catalina.sh run" 53 minutes ago Up 53 minutes 0.0.0.0:86->8080/tcp tomcat
第二步:查看挂载点
我们检查看下容器内的这个目录被挂载到了那个宿主机的那个位置
可以发现容器中的data目录被挂载到了宿主机的如下目录下
[root@localhost game]# docker container inspect e60cdf12daa7 |grep -i "source"
"Source": "/var/lib/docker/volumes/bb78252b862ca3470c8c60112de30c5b912eb6b1939fe3394f44875a24bc07e9/_data",
[root@localhost game]# cd /var/lib/docker/volumes/bb78252b862ca3470c8c60112de30c5b912eb6b1939fe3394f44875a24bc07e9/
[root@localhost bb78252b862ca3470c8c60112de30c5b912eb6b1939fe3394f44875a24bc07e9]# ls
_data
[root@localhost bb78252b862ca3470c8c60112de30c5b912eb6b1939fe3394f44875a24bc07e9]# cd _data/
[root@localhost _data]# ls
index.html
[root@localhost _data]# cat index.html
<html><body><h1>It works!</h1></body></html>
第四步:宿主机创建文件进行测试
我们可以在宿主机的共享目录中放置游戏文件
[root@localhost _data]# cp /game/* ./ -a
[root@localhost _data]# rm -rf index.html
[root@localhost _data]# ls
game game.zip images jquery-1.8.3.min.js readme.xls sky_fight.html sky.php
第五步:容器内查看
查看是否有游戏文件
[root@localhost _data]# docker exec -it e60cdf12daa7 bash
root@e60cdf12daa7:/usr/local/apache2# ls
bin build cgi-bin conf error htdocs icons include logs modules
root@e60cdf12daa7:/usr/local/apache2# cd /usr/local/apache2/htdocs
root@e60cdf12daa7:/usr/local/apache2/htdocs# ls
game game.zip images jquery-1.8.3.min.js readme.xls sky.php sky_fight.html
root@e60cdf12daa7:/usr/local/apache2/htdocs# exit
数据卷volume文件共享之基于一个现有容器:
(容器与容器挂载,容器与宿主机挂载)
实例一、
第一步:再次启动一个容器
–volumes-from:后面指定容器名,上一个实验我已经启动了一个容器ken1
[root@ken ~]# docker run --name ken2 -it --volumes-from ken1 --rm busybox
第二步:查看新容器的文件
可以在新创建的容器有了我们之前创建容器的文件了
/ # ls /data/
ken1 ken2 ken3 ken4 ken5
第三步:在新容器内创建新的文件
如下我创建了一个kenken的文件
/ # cd /data
/data # touch kenken
/data # ls ./
ken1 ken2 ken3 ken4 ken5 kenken
第四步:查看ken1容器
在ken1容器内查看是否已经有了我们创建的文件
可以发现在ken1容器内也有了我们在新容器内创建的文件了
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
/ # ls /data/
/ # ls /data/
ken1 ken2 ken3 ken4 ken5
/ # ls /data
ken1 ken2 ken3 ken4 ken5 kenken
第五步:查看宿主机
其实这个时候宿主机也应该有我们刚才创建的文件
这样就实现了多台容器之间以及和多台容器和宿主机之间的文件共享
[root@ken ~]# ls /var/lib/docker/volumes/61535b617c3d6a41d2a8dd965622bb44e27029c1fffbb166bc940fcffd069560/_data
ken1 ken2 ken3 ken4 ken5 kenken
实例二、
第一步:再次启动一个容器
–volumes-from:后面指定容器名
[root@localhost _data]# docker run -d --name httpd-test2 -it --volumes-from http-test -P httpd
0400349ee7c8c3286226b95bc993ac77ad6565fcb5dc24569710414f937c75de
[root@localhost _data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0400349ee7c8 httpd "httpd-foreground" 14 seconds ago Up 14 seconds 0.0.0.0:32768->80/tcp httpd-test2
e60cdf12daa7 httpd "httpd-foreground" 15 minutes ago Up 15 minutes 0.0.0.0:90->80/tcp http-test
391afba79c84 httpd "httpd-foreground" 19 minutes ago Up 19 minutes 0.0.0.0:82->80/tcp httpd
9225fd6da0e2 tomcat:test "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:86->8080/tcp tomcat
第二步:查看新容器的文件
[root@localhost _data]# docker exec -it 0400349ee7c8 bash
root@0400349ee7c8:/usr/local/apache2# cd /usr/local/apache2/htdocs
root@0400349ee7c8:/usr/local/apache2/htdocs# ls
game game.zip images jquery-1.8.3.min.js readme.xls sky.php sky_fight.html
root@0400349ee7c8:/usr/local/apache2/htdocs# exit
exit
第三步:打开http-test和httpd-test2的挂载文件(同一个文件目录)
[root@localhost _data]# docker container inspect 0400349ee7c8|grep -i "source"
"Source": "/var/lib/docker/volumes/bb78252b862ca3470c8c60112de30c5b912eb6b1939fe3394f44875a24bc07e9/_data",
[root@localhost _data]# docker container inspect e60cdf12daa7 |grep -i "source"
"Source": "/var/lib/docker/volumes/bb78252b862ca3470c8c60112de30c5b912eb6b1939fe3394f44875a24bc07e9/_data",
[root@localhost _data]#
docker——数据卷volume:文件共享的更多相关文章
- Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken
前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ...
- Docker数据卷Volume实现文件共享、数据迁移备份(三)
数据卷volume功能特性 数据卷 是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定.数据卷 是被设计用来持久化数据的对于数据卷你可以理解为NFS中的 ...
- docker数据卷(volume)
1.什么是数据卷volume https://blog.csdn.net/dream_broken/article/details/52314993 为了了解什么是Docker Volume,首先我们 ...
- 你必须知道的Docker数据卷(Volume)
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓 ...
- Docker之数据卷Volume(七)
一.简介 Docker数据卷(volume)机制.volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利. 1)v ...
- docker 数据卷之进阶篇
笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入,笔者对 docker 数据卷的理解与认识也在不断的增强.本文将在前 ...
- docker 数据卷 ---- 进阶篇
笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入,笔者对 docker 数据卷的理解与认识也在不断的增强.本文将在前 ...
- docker学习5--docker数据卷(volume)
https://blog.csdn.net/dream_broken/article/details/52314993 1.什么是数据卷volume 为了了解什么是Docker Volume,首先我们 ...
- Docker容器数据卷-Volume详解
Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享.数据 ...
随机推荐
- COGS 2095. 不平凡的引线
2095. 不平凡的引线 ★☆ 输入文件:firelead.in 输出文件:firelead.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] 这里说的引线是炮 ...
- C语言I作业004
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 作业 我在这个课程的目标是 掌握使用for循环语句实现指定次数的循环程序设计 这个作业在那个具体方面帮助我实现目标 pta运用for循环语 ...
- 《java编程思想》P160-P180(第八章部分+第九章部分)
1.什么是多态? 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 现实中,关于多态的例子不胜枚举.比方说按下 F1 ...
- Stack Overflow 上 250W 浏览量的一个问题:你对象丢了
在逛 Stack Overflow 的时候,发现最火的问题竟然是:什么是 NullPointerException(java.lang.NullPointerException),它是由什么原因导致的 ...
- RF中的if判断
关键字run keyword if 格式如下: Run Keyword If 判断条件 其他关键字 ... ELSE IF 判断条件 其他关键字 ... ELSE ...
- eclipse常用快捷键即项目操作
快捷键: 1.代码提示:Alt+/ 2.撤销上一步操作:Ctrl+z:取消撤销:Ctrl+y: 3.如何注销一整段代码?☞▲第一种注释方法是每行代码前加//:先选中,然后按Ctrl+/:取消注销方法一 ...
- 快速傅里叶变换(FFT)略解
前言 如果我们能用一种时间上比 \(O(n^2)\) 更优秀的方法来计算大整数(函数)的乘法,那就好了.快速傅里叶变换(FFT) 可以帮我们在 \(O(n\log n)\) 的时间内解决问题. 函数乘 ...
- 不安分的管家——Jenkins
占个位,持续补充. 一.使用Jenkins进行自动化部署 一直以来关于xx框架/中间件的技术博客有个奇怪的事情.这类文章特点大而全,重复率高,读者阅读完毕基本从安装到放弃. 作为一个使用者,我只是为了 ...
- 网页背景H5视频自动播放---PC端、移动端兼容问题完美解决方案(IOS、安卓、微信端)
最近公司官网需要使用视频当做banner背景且自动播放,并且因为是官网需要做到PC端和移动端都可以适配兼容,这些问题很是头疼: 兵来将挡,水来土掩,进过查阅相关技术资料,现已完美兼容PC端和移动端.下 ...
- openssl生成密钥/证书
一.公钥/私钥/签名/验证签名/加密/解密/非对称加密 对称加密:用同一个密码 加密/解密 文件. 非对称加密:加密用的一个密码,解密用另外一组密码. 加密解密:公钥加密数据,然后私钥解密. 公钥 ...