docker系列10:Dockerfile挂载容器卷

 传送门

docker系列1:docker安装

docker系列2:阿里云镜像加速器

 docker系列3:docker镜像基本命令

docker系列4:docker容器基本命令

docker系列5:docker安装nginx

docker系列6:docker安装redis

docker系列7:docker安装ES

docker系列8:容器卷挂载(上)

docker系列9:容器卷挂载(下)

容器卷挂载简单回顾

通过前面2节初步接触了容器卷,也从整体了解容器卷!

 docker系列8:容器卷挂载(上)

docker系列9:容器卷挂载(下)

这里还是有必要再回顾一下:

什么是容器卷?

从传统的磁盘挂载说起类比到容器卷挂载,所谓的容器卷就是为解决容器数据持久化而将外部设备(目录)挂载到容器(目录)的技术!

解决了什么问题?

这样既解决了容器应用在有状态的应用下的场景,也达到了容器数据共享的目的。所谓的有状态应用典型场景就是docker运行Mysql,里面的数据需要进行持久化,不能因为容器停止而消失

图片来自:https://docs.docker.com/storage/bind-mounts/
容器卷管理

容器卷的管理也可以像平时开发那样(CRUD-boy)归纳为C-创建、R-读取、D-删除:

C-创建:

# my-vol为卷名称
docker volume create my-vol

 R-读取:

docker volume ls

 D-删除

docker volume rm my-vol

 当然还有其它的一些参数,可以查看docker volume

具名与匿名挂载

通过上面的卷创建命令:docker volume create 卷名称 创建出来的卷进行手动挂载,这种称为具名挂载!反之通过容器启动命令-v挂载的称为匿名挂载

docker  run  -v ./content:/content -w /content -i -t  ubuntu pwd

比如下面命令查看的卷列表:

容器卷的读写控制
回顾卷挂载的命令:-v 宿主机路径:容器内路径:权限
  • 在容器内路径后面,接着指定权限
  • r-代表读,w-代表写,ro-代表只读(read only),rw-代表可读可写
关于-v与--mount的选择 

卷挂载除了通过-v来使用以外还可以通过--mount方式:

docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest

关于-v与--mount的选择可以参考Choose the -v or --mount flag 

官方推荐的是用mount方式:

New users should use the --mount syntax. Experienced users may be more familiar with the -v or --volume syntax, but are encouraged to use --mount, because research has shown it to be easier to use. 

手动挂载的烦恼

无论是通过运行容器自动挂载容器卷,还是通过手动管理的方式先创建好容器卷再进行绑定,可以预料的是这样的方式都不是一种理想方式:需要运行镜像在容器启动之后再手动挂载,如果容器实例一多,管理起来在操作上也是件麻烦事情(容器的编排先不去考虑探讨),这是原因这一。

再一个原因是,理论上一般镜像的提供者与使用者并不是同一个人(或团队),如果镜像的提供者在发布的镜像里面要指定卷挂载,或者说要规定一些默认的目录,肯定是不能用上面的方式来设定。

通过Dockerfile文件挂载容器卷

所以Docker提供了专门的方式,让镜像提供者在编写Dockerfile文件时指定卷挂载:

VOLUME ["/data"]

Dockerfile卷挂载命令

命令的具体详情可以查看VOLUME,该命令的表示 :创建一个具有指定名称的挂载点,并将其标记为保存来自本机主机或其他容器的外部挂载卷。

其中VOLUME命令后参数表示卷挂载的目录,其中["/data"]就是一个普通的json数组,表示可以挂载多个目录;也可以配置多个字符串,VOLUME /var/log or VOLUME /var/log /var/db。

一个例子

来看一个官方给的例子,Dockerfile文件如下:

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

 首先在Linux机器上创建一个文件,比如名字为Dockerfile,该命令的大概意思就是:

  • FROM表示,从标准的ubuntu镜像为准
  • RUN表示执行shell命令,创建一个文件目录/myvol
  • 执行命令,打印"hello world"字符串到greeting文件
  • 最后VOLUME,就是这节要讲到卷挂载!
touch Dockerfile

将上面的命令粘贴到该文件中,如下:

 然后运行该Dockerfile文件,进行镜像构建:

docker build -t getting-started .

执行之后如果构建成功应该会显示如下结果: 

 既然是构建了镜像那就先查看一下在没有在镜像列表里面:docker images

 接着运行一下这个自己构建的镜像试试:

 会发现通过编写Dockerfile构建的镜像,在启动时自动的挂载了对应的卷。可以在宿主机上面查看该目录文件及容器的卷挂载信息:docker inspect 容器ID

这样对应找到该卷的名称之后,再用:docker volume ls里面查询一下,就可以看到卷的信息了,然后再查看该卷信息即可:

 宿主机看下存储的目录内容,跟容器里面一致,说明卷也挂载成功!

更多Dockerfile介绍

关于Dockerfile的更多介绍,可以看看这里

 

 

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值