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:文件共享的更多相关文章

  1. Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken

    前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ...

  2. Docker数据卷Volume实现文件共享、数据迁移备份(三)

    数据卷volume功能特性 数据卷 是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定.数据卷 是被设计用来持久化数据的对于数据卷你可以理解为NFS中的 ...

  3. docker数据卷(volume)

    1.什么是数据卷volume https://blog.csdn.net/dream_broken/article/details/52314993 为了了解什么是Docker Volume,首先我们 ...

  4. 你必须知道的Docker数据卷(Volume)

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓 ...

  5. Docker之数据卷Volume(七)

    一.简介   Docker数据卷(volume)机制.volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利. 1)v ...

  6. docker 数据卷之进阶篇

    笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入,笔者对 docker 数据卷的理解与认识也在不断的增强.本文将在前 ...

  7. docker 数据卷 ---- 进阶篇

    笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入,笔者对 docker 数据卷的理解与认识也在不断的增强.本文将在前 ...

  8. docker学习5--docker数据卷(volume)

    https://blog.csdn.net/dream_broken/article/details/52314993 1.什么是数据卷volume 为了了解什么是Docker Volume,首先我们 ...

  9. Docker容器数据卷-Volume详解

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享.数据 ...

随机推荐

  1. vodevs3031 最富有的人

    在你的面前有n堆金子,你只能取走其中的两堆,且总价值为这两堆金子的xor值,你想成为最富有的人,你就要有所选择. 输入描述 Input Description 第一行包含两个正整数n,表示有n堆金子. ...

  2. Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理

    在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案.Spring Boot 中,对异常的处理有 ...

  3. python学习(数据类型)

    基本数据类型 (1)numbers 数字 %d 整型 int 长整型 Long 布尔型 boor True False %f 浮点型 float 3.1415926 4.2E-10 复数 comple ...

  4. 【Java 基础】谈谈集合.List

    目录 1. ArrayList 1.1 ArrayList的构造 1.2 add方法 1.3 remove方法 1.4 查询方法 1.5 一些其他常用方法 1.6 ArrayList小结 2. Vec ...

  5. 内网渗透bypassuac和smb溢出

    对内网渗透需要渗透的目标主机处于跨网段和uac限制的情况做一个渗透记录 环境大致如下 拥有shell权限的win7(有uac限制,处于双网段) 和同win7同一网段下暂时无权限的靶机xp 先对有权限的 ...

  6. PHP call_user_func的一些用法和注意点

    版本:PHP 5.6.28 在call_user_func的调用中: 1.参数的传递过程,并不是引用传值. 1 error_reporting(E_ERROR); // 此处不是E_ALL 2 $cu ...

  7. [JOYOI1510] 专家复仇 - Floyd

    题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目背景 外星人完成对S国的考察后,准备返回,可他们的飞碟已经没燃料了……S国的专家暗自窃喜 ...

  8. 【RabbitMQ 实战指南】一 死信队列

    1.死信队列 DLX,全称为 Dead-Letter-Exchange,可以称之为死信交换器.当消息在一个队列中变成死信(dead message)之后,它能被发送到另一个交换器中,这个交换器就是DL ...

  9. pytest6-Fixture finalization / executing teardown code(使用yield来实现)

    Fixture finalization / executing teardown code By using a yield statement instead of return, all the ...

  10. Springboot项目的jar包目录结构

    上图为一个由Luyten工具反编译后的一个jar包 说明: SpringBoot提供的bootstrap的类是放到包的最外面,比如上面的org.springframework.boot.loader. ...