Docker容器间中的数据如何共享?

本文和大家分享的是Docker进阶中容器中的数据管理相关知识,希望可以帮助大家更好的学习Docker,一起来看看吧。

先思考一些场景,如果利用Docker创建了一个N个容器,这些容器之间需要数据共享,此时该怎么办?如果我们想在本机了解容器的运行状态、命令历史等,此时该怎么办?

按照Docker官方文档的说明,容器中的数据管理有两种形式: Manage data in containers

数据卷(Data Volumes)

可以将“数据卷”理解为容器中的一个目录,类似于Linux中mount的概念。创建容器时,可以一并创建数据卷,并且能够挂载一个主机目录为数据卷。有点绕口,实例说明一下。

(1)创建mysql容器,不添加任何关于数据卷的参数:

# 这里假设我们已经pull下mysql镜像

[[email protected] ~]# docker run -d -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql # 创建一个名字为mysql01的容器

此时并没有指定关于任何数据卷的参数。-p 3306:3306是将本机的3306端口映射到容器的3306端口。此时利用命令查看容器的基本信息,其中一段为:

[[email protected] ~]# docker inspect mysql01

......"Mounts": [

{

"Name": "6cb3597e2da5......",

"Source": "/var/lib/docker/volumes/6cb3597e2da5....../_data",

"Destination": "/var/lib/mysql",

"Driver": "local",

"Mode": "",

"RW": true,

"Propagation": ""

}

],

......

这段数据说明该容器自动生成一个数据卷,在容器中的目录为"/var/lib/mysql",用于存放Mysql数据,同时在本机也有相对应的目录:"/var/lib/docker/volumes/....../_data"。当你在Mysql中创建数据库、表时,就会在本机目录下生成相应的数据。

(2)创建mysql容器,并添加自定义的数据卷:

# 这里假设我们已经pull下mysql镜像

[[email protected] ~]# docker run -d -p 3307:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -v /appdata mysql # 创建一个名字为mysql02的容器

此时指定了一个-v /appdata的参数,用于在容器中创建一个目录为/appdata的数据卷。注意-p选项变为了-p 3307:3306,这是因为上一次的容器将本机的3306端口占用了,需要选择另外一个端口。此时利用inspect命令查看容器基本信息,其中一段为:

[[email protected] ~]# docker inspect mysql02"Mounts": [

{

"Name": "d95fd2d33.......",

"Source": "/var/lib/docker/volumes/d95fd2d33....../_data",

"Destination": "/appdata",

........

},

{

"Name": "695e371973......",

"Source": "/var/lib/docker/volumes/695e371973....../_data",

"Destination": "/var/lib/mysql",

........

}

],

这个容器中有两个数据卷,一个是Mysql自建的"/var/lib/mysql",用于存放mysql数据。另外一个是我们自己指定的"/appdata",类似于前者,这个数据卷在本机也有相对应的目录。这里的"appdata"数据卷并没有什么用,只是作为例子说明一下。

(3)创建mysql容器,并挂载本机目录作为数据卷

# 这里假设我们已经pull下mysql镜像

[[email protected] ~]# docker run -d -p 3308:3306 --name mysql03 -e MYSQL_ROOT_PASSWORD=123456 -v /root/mysqldata/:/var/lib/mysql mysql

此时的-v参数将本机的"/root/mysqldata"目录挂载到"/var/lib/mysql"。此时查看容器的基本信息,其中一段为:

[[email protected] ~]# docker inspect mysql03"Mounts": [

{

"Source": "/root/mysqldata",

"Destination": "/var/lib/mysql",

"Mode": "",

"RW": true,

"Propagation": "rprivate"

}

],

这里只有一个数据卷,应该比较容易理解。注意这里的"Propagation"参数,官方的解释为:

By default bind mounted volumes are private. That means any mounts done inside container will not be visible on host and vice-a-versa. One can change this behavior by specifying a volume mount propagation property. Making a volume shared mounts done under that volume inside container will be visible on host and vice-a-versa. Making a volume slave enables only one way mount propagation and that is mounts done on host under that volume will be visible inside container but not the other way around.To control mount propagation property of volume one can use :[r]shared, :[r]slave or :[r]private propagation flag. Propagation property can be specified only for bind mounted volumes and not for internal volumes or named volumes. For mount propagation to work source mount point (mount point where source dir is mounted on) has to have right propagation properties. For shared volumes, source mount point has to be shared. And for slave volumes, source mount has to be either shared or slave.

(4)创建容器,并挂载本机文件作为数据卷。

除了能挂载本机的目录外,同样可以挂载本机文件。官网上给出的例子是:

$ docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu /bin/bash

这里将本机的.bash_history文件挂载到容器的.bash_history文件上。根据数据卷的特性,这样在本机就能看到容器中的操作历史了。

(5)删除数据卷。数据卷是被用来持久化数据的,它独立于容器存在。当我们删除容器时,并不会自动删除数据卷,同时Docker也没有垃圾回收机制可以回收无用的数据卷。但是我们可以在删除容器时,连同数据卷一并删除,比如:docker rm -v mysql02。

数据卷容器(Data Volumes Container)

如果你有一些需要持续更新,并且需要在容器之间共享的数据,建议创建数据卷容器。数据卷容器其实就是一个容器,专门用来提供数据卷供其他容器挂载。

(1)首先建立一个数据卷容器,用于存放数据。

[[email protected] ~]# docker run -d -p 3306:3306 --name store -v /data/ -e MYSQL_ROOT_PASSWORD=123456 mysql

(2)接着你就能使用--volumes-from选项在其他容器中挂载/data/目录。

[[email protected] ~]# docker run -d -p 3307:3306 --name u1 --volumes-from store -e MYSQL_ROOT_PASSWORD=123456 mysql

[[email protected] ~]# docker run -d -p 3308:3306 --name u2 --volumes-from store -e MYSQL_ROOT_PASSWORD=123456 mysql

此时容器u1和u2中都有/data/目录,并且和容器store中的该目录共用。即当我们在容器u1中新建、更改、删除文件时,容器u2同样能得到对应的操作。

注意,这里的数据卷容器store并不需要一直处于运行的状态。

(3)删除数据卷容器。这里删除容器u1、u2或store都不会删除数据卷,需要在删除最后一个容器时使用-v选项来删除数据卷。这里建议删除每一个时都带有-v选项。

[[email protected] ~]# docker rm -v u1

[[email protected] ~]# docker rm -v u2

[[email protected] ~]# docker rm -v store

文章来源:撸代码,学知识

时间: 2024-11-10 12:30:13

Docker容器间中的数据如何共享?的相关文章

[docker] 管理docker容器中的数据

之前我们介绍了Docker的基本概念(前面的没翻译...),了解了如何使用Docker镜像进行工作,并且学习了网 络和容器之间的链接.这一节我们将讨论如何管理容器中及容器之间的数据. 我们将查看下面两种管理Docker中数据的主要方法. 数据卷 数据卷容器 数据卷 一个数据卷就是经过特殊设计的,在一个或多个容器中通过UFS文件系统提供的一些特性 实现数据持久化或共享. 数据卷可以在容器之间共享和重复利用 可以对数据卷里的内容直接进行修改 对镜像的更新不会改变数据卷的内容 卷会一直持续到没有容器使

如何在Docker容器之间拷贝数据

[编者的话]在容器之间拷贝数据是Docker一个重要而且基本的功能.拷贝数据到其他容器是一个经常使用到的场景,如当服务器遇到不可预见的“灾难”(注:断电,宕机)时,起到备份数据的作用.本文作者详细介绍了操作步骤. 如何在Docker容器之间拷贝数据 Docker容器可以类比成一个目录,它可以将一个应用程序运行时所依赖的所有环境(注:此应用依赖的其他的服务或程序等)打包在一起运行:同时可以随意的对它进行“启动”.“停止”.“移动”或者“删除”等操作.Docker容器在Linux的命名空间(Name

使用burpsuite等代理工具抓取docker容器中的数据包

使用burpsuite等代理工具抓取docker容器中的数据包,下面是详细的教程. 以docker中的某个漏洞平台(bwapp)为例,展示如何抓包. 1.首先使用docker下载bwapp: # docker pull raesene/bwapp 2.然后运行bwapp (使用命令   --env HTTP_PROXY="http://192.168.43.14:8080"   来进行代理设置,这里设置的是burpsuite中的ip地址以及端口) # docker run -d --n

docker容器与大数据组件的冲突点

1.容器里面安装spark,外面的程序(安装spark主机的容器)会连接不上集群.理由:这个组件用的akka,连接上集群,会提示: akka.ErrorMonitor: dropping message [class akka.actor.ActorSelectionMessage] for non-local recipient [Actor[akka.tcp://[email protected]:50071/]] arriving at [akka.tcp://[email protect

Docker系列-第五篇Docker容器数据卷

1.是什么 在生产环境中使用 Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作 . 容器中的管理数据主要有两种方式 : 数据卷 ( Data Volumes ) : 容器内数据直接映射到本地主机环境: 数据卷容器( Data Volume Containers ) : 使用特定容器维护数据卷. 一句话:有点类似我们Redis里面的rdb和aof文件 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的

Docker容器(分享十五)

自从加入公司云计算部门,接触的新技术越来越多了,而且客户需求也原来越多样性,做我一名老IT,也必须跟上节奏,接下来一段时间我先尝试去了解docker基本功能,然后深入去挖掘. 一.什么是docker? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 一个完整的Docker有以下几个部分组成: dockerClient客户端 Docker

docker容器的数据卷以及使用方式

            Docker容器的数据卷 想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的.Docker镜像是由多个文件系统(只读层)叠加而成.当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(即镜像栈顶部)添加一个读写层.如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏.当删除Docker容器,并通过该镜像重新启动时,之前的更改

Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)

service 的容器副本会 scale up/down,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果 service 有要管理的数据,那么这些数据应该如何存放呢? 选项一:打包在容器里. 显然不行.除非数据不会发生变化,否则,如何在多个副本直接保持同步呢? 选项二:数据放在 Docker 主机的本地目录中,通过 volume 映射到容器里. 位于同一个主机的副本倒是能够共享这个 volume,但不同主机中的副本如何同步呢? 选项三:利用 Docker 的 volum

docker 12 docker容器数据卷

数据卷概念 ♣我们知道,当我们把一个运行中的容器关闭后,容器里的数据就没有了(如果你做了docker commit操作,数据会保留到新的镜像里面).所以我们就需要用容器数据卷把容器数据进行持久化储存. ♣还有一种情况,就是希望容器之间能共享数据,这时也需要容器数据卷. ♣一句话,数据卷就是用来解决数据持久化和数据共享的. ♣卷就是目录或者文件,存在一个或者多个容器中,由docker宿主机挂载到容器上,但是不属于联合文件系统,因此能绕过联合文件系统提供一些用于持久化存储或者共享数据的特性. ♣卷的