初次学习 Docker Volume 的基本使用 (四)

在很早的一篇帖子里 http://dockone.io/question/24 就有人问:「请教下代码放在 Docker 里面还是外面呢」多数人评论类似下面的观点:

由于开发环境代码一直在变动,而且多人通过 git 协作,于是代码都是放在外面,构建一个运行环境的 image,然后代码部分用 volume 映射进去,方便随时调整。

我的观点也是这样的,目前我学习的 docker 更多的是本地开发使用,还未到测试或者真实环境下部署的时候,所以我目前赞同将 docker 作为部署开发环境使用,然后将代码和数据库用 volume 映射到容器中。

所以今天的文章话题是:学习 Docker Volume

Docker Volume

A volume is a specially-designated directory within one or more containers that bypasses the Union File System. Volumes are designed to persist data, independent of the container’s life cycle. Docker therefore never automatically delete volumes when you remove a container, nor will it “garbage collect” volumes that are no longer referenced by a container. Also known as: data volume There are three types of volumes: host, anonymous, and named:

  • A host volume lives on the Docker host’s filesystem and can be accessed from within the container.
  • A named volume is a volume which Docker manages where on disk the volume is created, but it is given a name.
  • An anonymous volume is similar to a named volume, however, it can be difficult, to refer to the same volume over time when it is an anonymous volumes. Docker handle where the files are stored.

Docker Volume 挂载

主要有两种参数方式挂载,一种是 -v,另一种是创建数据卷容器,以--volumes-from 挂载。

-v 方式挂载

-v [host-dir]:[container-dir]:[rw|wo]

其中,

· host-dir:表示主机上的目录,如果不存在,Docker 会自动在主机上创建该目录。 · container-dir:表示容器内部对应的目录,如果该目录不存在,Docker 也会在容器内部创建该目录。 · rw|ro:用于控制卷的读写权限。

所以[host-dir]:[container-dir] 一共就有四种组合,其中 container-dir 有没有存在,先不做尝试考虑。

一、假如不指定 host-dir,我们看看:

docker run -it -p 8890:8080 --rm -v /usr/local/tomcat/webapps --name test1 tomcat:8.0

接着使用查看容器中挂载数据卷的情况:

docker inspect test1

这时候看到的挂载的路径是临时的;而容器中对应的目录,也没有被覆盖:

二、假如指定了 host-dir,我们来看看:

docker run -it -d -p 8891:8080 --rm -v /Users/ye/docker/learning/javademo/volume2:/usr/local/tomcat/webapps --name test2 tomcat:8.0

接着使用查看容器中挂载数据卷的情况:

docker inspect test2

可以看出,将主机本地的文件夹挂在上去了:

这时候我们可以看到,在容器中对应的目录下的文件,和主机目录下的保持一致了

如果在主机中增加一个文件 world.java,我们再看看:

保持一致了!

--volumes-from 挂载

很多时候,我们会将一些相关的容器部署到同一个主机上,这时候希望这些容器之间可以共享一些数据。这时,我们可以创建一个数据卷容器,然后就可以供多个容器挂载使用了。

这里我就不继续往下进行阐述了,因为我学到 Docker Volume 还没真正使用过数据卷容器,所以没有发言权,等我使用过了,我将补充这方面的学习内容。

数据卷操作命令

主要有create、inspect、ls、prune、rm这几个命令,其中拿 ls 举个例子。

docker volume ls

List volumes 显示所有数据卷

命令:

docker volume ls [OPTIONS]

如:

其中:[OPTIONS] 命令:

Name, shorthand

Default

Description

--filter, -f

Provide filter values (e.g. ‘dangling=true’)

--format

Pretty-print volumes using a Go template

--quiet, -q

false

Only display volume names

具体其它的几个个命令,都比较简单:

Command

Description

docker volume create

Create a volume

docker volume inspect

Display detailed information on one or more volumes

docker volume ls

List volumes

docker volume prune

Remove all unused volumes

docker volume rm

Remove one or more volumes

更多参考官网说明:https://docs.docker.com/engine/reference/commandline/volume_create/#extended-description

总结

虽然在学习过程中,发现使用 -v 的挂载方式要多于使用数据卷容器的方式,主要是因为在本地学习为主,或者以单项目开发为主。但在现实产品开发中,我相信用--volume from 的方式会很多,尤其是生产环境下。有待于我们继续学习,也希望有人能提点我~~~,万谢!


原文发布于微信公众号 - coding01(coding01)

原文发表时间:2017-09-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏分布式系统和大数据处理

基于Docker的持续集成方案(介绍) - Part.1

使用docker有很多的便利,这个就不再讲述了,在文章 《基于Docker的持续集成方案(安装docker) - Part.2》 已经对docker有所介绍。这...

46950
来自专栏程序你好

从 Docker 的新手村出发?那么你需要这11条守则

11420
来自专栏北京马哥教育

写给新手的十一条 Docker 守则

18250
来自专栏Java后端技术

Docker三十分钟快速入门(下)

  上篇文章我们进行了Docker的快速入门,基本命令的讲解,以及简单的实战,那么本篇我们就来实战一个真实的项目,看看怎么在产线上来通过容器技术来运行我们的项...

10520
来自专栏磐创AI技术团队的专栏

5分钟配置好你的AI开发环境

无论是第一次设置TensorFlow的新手数据科学爱好者,还是使用TB级数据的经验丰富的AI工程师,安装库、软件包或者框架总是一个困难又繁琐的过程。但是像Doc...

17960
来自专栏同步博客

Docker之进入容器(三)

  经过前面两篇博客的扫盲,大家多多少少对docker有了一个基本的了解,也接触了docker的常用命令。在这篇博客中,我将介绍进入docker容器的几种方式。

22030
来自专栏WeTest质量开放平台团队的专栏

一次触摸,Android 到底干了啥

通过 Android 系统输入子系统的分析来回答你。

23210
来自专栏友弟技术工作室

docker微服务初体验配置文件composedocker compose使用

99050
来自专栏coding

docker初体验

17710
来自专栏Jerry的SAP技术分享

在Kubernetes上运行SAP UI5应用(下)

上一篇文章 在Kubernetes上运行SAP UI5应用(上),我介绍了如何在Docker里运行一个简单的SAP UI5应用,并且已经成功地将一个包含了这个U...

8510

扫码关注云+社区

领取腾讯云代金券