为何要为容器进行文件挂载

为了持久化docker容器产生的数据(数据文件/配置文件/日志文件), 通常会挂载(映射)产生数据的容器内路径到主机路径上.

用处:

  1. 不用进入容器内就能访问配置容器内数据
  2. 删除容器时能保留数据

3种挂载方式

  1. 指定路径挂载
  2. 具名挂载
  3. 匿名挂载

1.指定路径挂载

首先查看当前的数据卷和容器列表
当前只有1个运行中的容器和1个数据卷(volume)

[gateman@i-93f6y1io docker]$ docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED       STATUS                  PORTS                    NAMES
5b82adf8f3f5   mysql:latest          "docker-entrypoint.s…"   7 days ago    Exited (0) 7 days ago                            mysql01
5d1736f42fd3   portainer/portainer   "/portainer"             13 days ago   Up 12 days              0.0.0.0:3346->9000/tcp   condescending_cartwright
[gateman@i-93f6y1io docker]$
[gateman@i-93f6y1io docker]$ docker volume ls
DRIVER    VOLUME NAME
local     ad53aaa75e87f4e8c176f7f6d6eaa6819bcf5f88e70bc7b690fe70dad44ba261
[gateman@i-93f6y1io docker]$

语法:

-v /主机路径:/容器内路径

例子 我们创建1个tomcat容器

docker run -d -p 3348:8080 -v /home/gateman/docker/webapps:/usr/local/tomcat/webapps --name tomcat_spe_mount tomcat

[gateman@i-93f6y1io docker]$ pwd
/home/gateman/docker
[gateman@i-93f6y1io docker]$ mkdir -p webapps
[gateman@i-93f6y1io docker]$ ls
run_portainer.sh  scripts  webapps
[gateman@i-93f6y1io docker]$ docker run -d -p 3348:8080 -v /home/gateman/docker/webapps:/usr/local/tomcat/webapps --name tomcat_spe_mount tomcat
052e6104aeaf65f56e53535d249d5417701560ce6332dbcc764dfb4cc6435bae
[gateman@i-93f6y1io docker]$

这是我们访问 tomcat主页,见到tomcat启动了, 但是什么也没有, 因为容器内的webapps是空的
通过查看容器信息, 我们可以看到一条挂载记录

[gateman@i-93f6y1io docker]$ docker inspect --format="{{.Mounts}}" tomcat_spe_mount
[{bind  /home/gateman/docker/webapps /usr/local/tomcat/webapps   true rprivate}]
[gateman@i-93f6y1io docker]$

这时我们把一些东西webapps初始的管理项目copy 到挂载点 /home/gateman/docker/webapps 上
然后刷新tomcat主页, 能正常显示了

[gateman@i-93f6y1io docker]$ cp -a ~/docker/scripts/mount/webapps/* /home/gateman/docker/webapps/
[gateman@i-93f6y1io docker]$ docker exec -it tomcat_spe_mount /bin/bash
root@052e6104aeaf:/usr/local/tomcat# ls /usr/local/tomcat/webapps
ROOT  docs  examples  host-manager  manager
root@052e6104aeaf:/usr/local/tomcat# exit
exit
[gateman@i-93f6y1io docker]$


证明了挂载点有效的.

我们再查看下数据卷列表

[gateman@i-93f6y1io docker]$ docker volume ls
DRIVER    VOLUME NAME
local     ad53aaa75e87f4e8c176f7f6d6eaa6819bcf5f88e70bc7b690fe70dad44ba261
[gateman@i-93f6y1io docker]$

数据卷并没有增加
说明 指定路径挂载并不会创建数据卷(volume)

2.具名挂载

可以讲具名挂载和匿名挂载都不用指定主机的挂载路径, 由docker自己管理(通常在/var/lib/docker/volumn/ 下), 只需要指定容器里需要映射出来的路径。 而且会增加1个数据卷。

具名就是会给这个新增的数据卷添加1个名字。
匿名就是给这个数据卷产生1个随机token作为数据卷名字

语法

-v 数据卷名:/容器内路径

例子

我们创建多个tomcat 容器

[gateman@i-93f6y1io docker]$ docker run -d -p 3349:8080 -v vol_has_name_tomcat:/usr/local/tomcat/webapps --name tomcat_has_name_mount tomcat
d0bc64be6bdc9aedaec4bf22777eeea8a47106df90e05c929e31f540541f79df
[gateman@i-93f6y1io docker]$ docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED          STATUS          PORTS                    NAMES
d0bc64be6bdc   tomcat                "catalina.sh run"   5 seconds ago    Up 4 seconds    0.0.0.0:3349->8080/tcp   tomcat_has_name_mount
052e6104aeaf   tomcat                "catalina.sh run"   15 minutes ago   Up 15 minutes   0.0.0.0:3348->8080/tcp   tomcat_spe_mount
5d1736f42fd3   portainer/portainer   "/portainer"        13 days ago      Up 13 days      0.0.0.0:3346->9000/tcp   condescending_cartwright
[gateman@i-93f6y1io docker]$ docker exec -it tomcat_has_name_mount /bin/bash
root@d0bc64be6bdc:/usr/local/tomcat# ls /usr/local/tomcat/webapps
root@d0bc64be6bdc:/usr/local/tomcat# exit
exit

可以见到1个新创建的容器。 这时访问这个tomcat, 也是没有主页的, 因为容器内webapps是空的

这时我们查看下这个容器的挂载信息

[gateman@i-93f6y1io docker]$ docker inspect --format="{{.Mounts}}" tomcat_has_name_mount
[{volume vol_has_name_tomcat /var/lib/docker/volumes/vol_has_name_tomcat/_data /usr/local/tomcat/webapps local z true }]
[gateman@i-93f6y1io docker]$

可以很清晰见到, 1个volume被指定了, 名字就是我们命令中定义的。
挂载点是/var/lib/docker/volumes/vol_has_name_tomcat/_data

我们再查看下数据卷列表

[gateman@i-93f6y1io docker]$ docker volume ls
DRIVER    VOLUME NAME
local     ad53aaa75e87f4e8c176f7f6d6eaa6819bcf5f88e70bc7b690fe70dad44ba261
local     vol_has_name_tomcat
[gateman@i-93f6y1io docker]$

1个新的数据卷被创建

我们把一些default东西copy到挂载点(要加sodu), 主页就出来了

[gateman@i-93f6y1io docker]$ sudo cp -a ~/docker/scripts/mount/webapps/* /var/lib/docker/volumes/vol_has_name_tomcat/_data/
[sudo] gateman 的密码:
[gateman@i-93f6y1io docker]$ docker exec -it tomcat_has_name_mount /bin/bash
root@d0bc64be6bdc:/usr/local/tomcat# ls /usr/local/tomcat/webapps
ROOT  docs  examples  host-manager  manager
root@d0bc64be6bdc:/usr/local/tomcat#

3.匿名挂载

语法

-v /容器内路径

不用指定数据卷名

例子
[gateman@i-93f6y1io docker]$ docker run -d -p 3350:8080 -v /usr/local/tomcat/webapps --name tomcat_ano_mount tomcat
132f575e0345ef5808e250c3b18741b294d4bb3e61a1ac88d8b6a9b4d2a76a79
[gateman@i-93f6y1io docker]$ docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED          STATUS          PORTS                    NAMES
132f575e0345   tomcat                "catalina.sh run"   3 seconds ago    Up 3 seconds    0.0.0.0:3350->8080/tcp   tomcat_ano_mount
d0bc64be6bdc   tomcat                "catalina.sh run"   38 minutes ago   Up 38 minutes   0.0.0.0:3349->8080/tcp   tomcat_has_name_mount
052e6104aeaf   tomcat                "catalina.sh run"   53 minutes ago   Up 53 minutes   0.0.0.0:3348->8080/tcp   tomcat_spe_mount
5d1736f42fd3   portainer/portainer   "/portainer"        13 days ago      Up 13 days      0.0.0.0:3346->9000/tcp   condescending_cartwright
[gateman@i-93f6y1io docker]$ docker volume ls
DRIVER    VOLUME NAME
local     5889eed1cc2a05c3f54d69db7c95178b14a3821b6b02a341f3ac717d63ea2beb
local     ad53aaa75e87f4e8c176f7f6d6eaa6819bcf5f88e70bc7b690fe70dad44ba261
local     vol_has_name_tomcat
[gateman@i-93f6y1io docker]$ docker inspect --format="{{.Mounts}}" tomcat_ano_mount
[{volume 5889eed1cc2a05c3f54d69db7c95178b14a3821b6b02a341f3ac717d63ea2beb /var/lib/docker/volumes/5889eed1cc2a05c3f54d69db7c95178b14a3821b6b02a341f3ac717d63ea2beb/_data /usr/local/tomcat/webapps local  true }]
[gateman@i-93f6y1io docker]$

可以见到 1个新的volume 被创建, 而且名字是一堆无意义的字符

挂载点同样也是很冗长,

所以一般情况不建议用匿名挂载

docker 三种挂载文件路径方式相关推荐

  1. 文件的存取方式java_三种访问文件的方式

    标准IO,带缓冲的标准IO,内存映射等在Java中的实现: 1 package com.mesopotamia.test;  2   3 import java.io.BufferedReader;  ...

  2. java 输出文件到mac路径_Java 中几种获取文件路径的方式

    原标题:Java 中几种获取文件路径的方式 1. 前言 Java开发中我们经常要获取文件的路径,比如读取配置文件等等.今天我们就关于文件的路径和如何读取文件简单地探讨一下. 2. 文件的路径 文件的路 ...

  3. zynq学习03 zynq中三种实现GPIO的方式

    http://m.blog.csdn.net/article/details?id=52123465 http://blog.chinaaet.com/songhuangong/p/43084 本文介 ...

  4. CI框架的三种设置cookie的方式

    [php] view plaincopyprint? //第一种设置cookie的方式:采用php原生态的方法设置的cookie的值 setcookie("user_id",$us ...

  5. java.io几种读写文件的方式

    一.Java把这些不同来源和目标的数据都统一抽象为数据流. Java语言的输入输出功能是十分强大而灵活的. 在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作 ...

  6. python打开一个文件-python下几种打开文件的方式

    昨天看完了这本python进阶,感觉这本书对我启发很大,做了三张纸的笔记,方便我在遇到问题的时候翻阅,然后寻找可能的解决方案.作为一个使用Python一年的小白,虽然说不是小白,但是这一年来基本上是用 ...

  7. SSO单点登录三种情况的实现方式详解

    SSO单点登录三种情况的实现方式详解 单点登录(SSO--Single Sign On)对于我们来说已经不陌生了.对于大型系统来说使用单点登录可以减少用户很多的麻烦.就拿百度来说吧,百度下面有很多的子 ...

  8. 浅淡Webservice、WSDL三种服务访问的方式(附案例)

    Webservice Webservice是使应用程序以与平台和编程语言无关的方式进行相互通信技术. eg:站点提供访问的数据接口:新浪微博.淘宝. 官方解释:它是一种构建应用程序的普遍模型,可以在任 ...

  9. swift调用oc_OC与Swift混编,三种场景的实现方式

    多语言并存时期,混编成为一种必须的方式 ,在多场影中实现OC和Swift语言的并存原来是如此简单 第一种场景,App中实现混编 创建桥接文件*.h 新建一个桥接文件,New File 选择 Heade ...

最新文章

  1. 设计模式之享元模式学习笔记
  2. [云炬创业基础笔记]第十一章创业计划书测试14
  3. mysql explain中的type列含义和extra列的含义
  4. uestc summer training #2
  5. 数据库利器Navicat最全快捷键整理
  6. 构建第一个fabric网络
  7. ba网络c语言编程,如何用C语言程序构造随机网络和BA无尺度网络
  8. 超参数调整——网格搜索
  9. 一篇文章读懂拿了图灵奖和诺贝尔奖的概率图模型
  10. ACL(标准/扩展访问控制列表)
  11. 原 《老路用得上的商学课》86-90学习笔记
  12. prometheus Metric类型
  13. 电商收付通系列⑤,商户进件之二级商户进件申请
  14. 统计小写英文字母的个数 c语言,输入一行字符,统计英文字母,空格,和其他字符的个数...
  15. kubernetes kind类型之Deployment
  16. 童年经典,任天堂switch红白机游戏
  17. csp m2 HRZ学英语
  18. 三个路由器三个pc实现全网可达
  19. 微信小程序之二级联动下拉列表
  20. 阿里巴巴Java开发手册及Java代码规约扫描eclipse插件

热门文章

  1. 数据结构--队列(数组)的一种实现
  2. [Java基础] Properties类的基本操作和介绍
  3. 思想解读:TF-A(ATF)中栈指针和栈内存的设计思想解读
  4. [问答]-ARM文档中的†和‡的含义
  5. 【网络安全】如何搭建MySQL恶意服务器读取文件?
  6. 【网络安全】JAVA代码审计—— XXE外部实体注入
  7. 从一个被Tomcat拒绝的漏洞到特殊内存马
  8. 10.Windows线程切换_FS段寄存器
  9. 1.段描述符与段选择子
  10. Ksusha and Array (vector)