docker容器与宿主机的数据交互方式总结
这篇文章主要给大家介绍了关于docker容器与宿主机的数据交互,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
前言
在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。
方式一、Docker cp命令
123456789docker
cp
:用于容器与主机之间的数据拷贝。语法# 容器内文件 copy to 宿主机docker
cp
[OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-# 宿主机文件 copy to 容器内docker
cp
[OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
OPTIONS说明:-L :保持源目标中的链接
操作示例:
宿主机到容器
容器到宿主机
注:此方式虽然他也可以管理但是数据不交融,基本不会使用,仅做了解
方式二、Docker数据卷
1. 什么是volume
想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的。Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载镜像层并在其上添加一个读写层。如果运行中的容器修改了现有的一个已存在的文件,那该文件将会从读写层下的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层以及在顶部的读写层的组合被称为Union FIle System(联合文件系统)。
为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。
2. 数据卷的特性
· 数据卷 可以在容器之间共享和重用
· 对数据卷的修改会立马生效
· 对数据卷的更新,不会影响镜像
· 数据卷 默认会一直存在,即使容器被删除
3. 数据卷相关操作
Usage: docker volume COMMANDManage volumesCommands:create Create a volumeinspect Display detailed information on one or more volumesls List volumesprune Remove all unused local volumesrm Remove one or more volumes
参考文献:http://www.cncsto.com/article/705
创建数据卷
123456Usage: docker volume create [OPTIONS] [VOLUME]Create a volumeOptions:
-d, --driver string Specify volume driver name (default
"local")
--label list Set metadata
for
a volume
-o, --opt map Set driver specific options (default map[])
查看所有数据卷
12345678Usage: docker volume
ls
[OPTIONS]List volumesAliases:
ls, listOptions:
-f, --filter filter Provide filter values (e.g.
'dangling=true')
--format
string Pretty-print volumes using a Go template
-q, --quiet Only display volume names
查看单一或多个数据卷详情
1234Usage: docker volume inspect [OPTIONS] VOLUME [VOLUME...]Display detailed information on one or
more
volumesOptions:
-f, --format
string Format the output using the given Go template
删除单一数据卷
123456Usage: docker volume
rm
[OPTIONS] VOLUME [VOLUME...]Remove one or
more
volumes. You cannot remove a volume that is
in
use by a container.Aliases:
rm, removeOptions:
-f, --force Force the removal of one or
more
volumes
删除所有闲置数据卷
12345Usage: docker volume prune [OPTIONS]Remove all unused
local
volumesOptions:
--filter filter Provide filter values (e.g.
'label=<label>')
-f, --force Do not prompt
for
confirmation
操作示例:
4. 数据卷使用
数据卷的使用,类似于 Linux 下对目录或文件进行 mount。
用户可以通过docker run的--volume/-v或--mount选项来创建带有数据卷的容器,但两个参数不能同时使用。
大体来说,--mount更加明确和冗长。最大的区别是-v语法将所有选项组合在一个字段中,而--mount语法将它们分离。对于新手来说建议使用--mount,因为更容易理解。
1234567Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]Run a
command
in
a new containerOptions:
--volume list Bind m
ount a
volume -
-volume-driver string Optional volume driver fo
r th
e container --
volumes-from list Mount volumes from the specified container(s) --m
ount mou
nt Att
ach a filesystem mou
nt to
the container
4.1 --volume使用详述
参数--volume(或简写为-v)只能创建bind mount。
命令格式:-v [[HOST-OPTIONS:]CONTAINER-DIR[:OPTIONS]]]HOST-OPTIONS:VOLUME_NAME(数据卷名称)ABSOLUTE-HOST-DIR(宿主机文件目录绝对路径)ABSOLUTE-HOST-FILE(宿主机文件绝对路径) (为空的情况下将挂载匿名数据卷)Options:rw 读写(默认值)ro 只读
4.1.1 根据数据卷名称进行挂载
1docker run -itd -v
VOLUME_NAME:CONTAINER-DIR IMAGE [COMMAND] [ARG...]
示例:
将数据卷 my_vol 挂载到容器的/data/docker/volume/my_vol 目录
1docker run -itd --name=vol1_ubuntu -v
my_vol:/data/docker/volume/my_vol
ubuntu
/bin/bash
注:如果数据卷my_vol 存在将直接进行挂载,如果不存在 docker 将先自动创建数据卷再进行挂载。
4.1.2 根据宿主机文件目录绝对路径进行挂载
1docker run -it -v
ABSOLUTE-HOST-DIR:CONTAINER-DIR IMAGE [COMMAND] [ARG...]
示例:
将宿主机文件目录 /opt/common/docker/volumes/my_vol2 挂载到容器的/data/docker/volume/my_vol 目录
1docker run -itd --name=vol2_ubuntu -v
/opt/common/docker/volumes/my_vol2:/data/docker/volume/my_vol
ubuntu
/bin/bash
注:宿主机的文件目录必须为绝对路径。
4.1.3 根据宿主机文件绝对路径进行挂载
1docker run -itd -v
VOLUME_NAME:CONTAINER-DIR IMAGE [COMMAND] [ARG...]
示例:
将宿主机文件 ~/.bash_history 挂载到容器的/.bash_history
1docker run -itd --name=vol3_ubuntu -v
~/.bash_history:/.bash_history ubuntu
/bin/bash
4.1.4 挂载匿名卷
-v 参数如果不加任何宿主机相关卷信息docker将创建一个匿名卷进行挂载
1docker run -itd -v
CONTAINER-DIR IMAGE [COMMAND] [ARG...]
示例:
挂载匿名卷到容器的/data/docker/volume/my_vol 目录
1docker run -itd --name=vol4_ubuntu -v
/data/docker/volume/my_vol
ubuntu
/bin/bash
4.1.5 -v综合运行示例如下:
123456docker run -itd --name=vol_ubuntu \-v
my_vol:/data/docker/volume/my_vol1:ro \-v
/opt/common/docker/volumes/my_vol2:/data/docker/volume/my_vol2:rw \-v
/opt/common/docker/volumes/my_vol3.txt:/data/docker/volume/my_vol3.txt \-v
/data/docker/volume/my_vol4
\ubuntu
/bin/bash
4.2 --mount 使用详述
--mount:由多个用逗号分隔的<key>=<value>键值对组成,键的顺序随意。
命令格式:--mount type=MOUNT-TYPE,<key>=<value>
对于--moun选项,目前Docker提供了三种不同类型的数据卷从宿主机挂载到容器中:volume,bind,tmpfs。
三种方式的示意图如下所示:
4.2.1 named mount
普通数据卷(默认即这种类型),Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;
--mount type=volume,source=<VOLUME-NAME>,destination=<CONTAINER-PATH>,volume-driver=<DRIVER-NAME>,volume-opt=<OPTION>=<VALUE>,readonly<key>=<value>说明:source:数据卷源路径,关键字可以是 source 或 src,如果无此参数docker将自动创建匿名卷挂载VOLUME-NAME:数据卷名称destination:数据卷目标路径,关键字可以是 destination 或 dst 或 targetCONTAINER-PATH:数据卷在容器内的挂载路径volume-driver:指定数据卷驱动程序,默认取 “local”DRIVER-NAME:驱动名称volume-opt:可选项,数据卷驱动程序传参选项OPTION:key值VALUE:value值readonly:可选项,设置数据卷以只读权限挂载到容器内,默认为可读写
代码示例:
1docker service create --mount
'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
--name myservice <IMAGE>
4.2.2bindmount
绑定数据卷,文件或目录挂载,意为着可以存储在宿主机系统的任意位置;
--mount type=bind,source=<HOST-PATH>,destination=<CONTAINER-PATH>,bind-propagation=<PG-TYPE>,readonly<key>=<value>说明:source:数据卷源路径,关键字可以是 source 或 src,且执行挂在前确保文件或文件目录存在否则会执行出错HOST-PATH:宿主机文件或目录的绝对路径destination:数据卷目标路径,关键字可以是 destination 或 dst 或 targetCONTAINER-PATH:数据卷在容器内的挂载路径bind-propagation:可选项,PG-TYPE:可选值rprivate, private, rshared, shared, rslave, slave.readonly:可选项,设置数据卷以只读权限挂载到容器内,默认为可读写即不加此参数
*注意:Dockerfile 中不支持这种用法,这是因为 Dockerfile 是为了移植和分享用的。然而,不同操作系统的路径格式不一样,所以目前还不能支持。
代码示例:
1docker run -d -it --name devtest --mount
type=bind,source="$(pwd)"/target,target=/app
--mount
type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave nginx:latest
4.2.2 tmpfs mount
临时数据卷,挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;
--mount type=tmpfs,destination=<CONTAINER-PATH>,tmpfs-size=<SIZE-VALUE>,tmpfs-mode=<MODE-VALUE>,readonly<key>=<value>说明:destination:数据卷目标路径,关键字可以是 destination 或 dst 或 targetCONTAINER-PATH:数据卷在容器内的挂载路径tmpfs-size:可选项,tmpfs装载的大小(以字节为单位),Linux中默认无限大。SIZE-VALUE:数值tmpfs-mode:可选项,tmpfs的八进制文件模式,Linux中的默认值是“1777”。MODE-VALUE:数值
注:这个功能只有在Linux上运行Docker时才可用。
代码示例:
1docker run -d -it --name tmptest --mount
type=tmpfs,destination=/app,tmpfs-size=1024,tmpfs-mode=1770 nginx:latest
4.3 -v 与 --mount的区别
(1)--mount可以支持创建集群服务(services)的数据卷,而-v不行。
(2)进行文件或目录的挂载,如果挂载前不存在 -v docker会自动创建,--mount 不会(会报错)。
4.4 补充说明
(1)(--mount基本包含了--volume的可选属性内容)官方建议使用--mount的方式,原文如下:
Even though there is no plan to deprecate--volume
, usage of--mount
is recommended.
(2)官方文档链接:
https://docs.docker.com/storage/volumes/
https://docs.docker.com/engine/reference/commandline/service_create/
方式三、Docker数据卷容器
数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载,如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
1. 数据卷容器的基本使用1.1 创建数据卷容器
创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata目录:
1docker run -it -v
/dbdata
--name db_data ubuntu
1.2 其他容器挂载
其他容器中使用 --volumes-from 来挂载dbdata容器中的数据卷
12docker run -it --volumes-from db_data --name db1 ubuntudocker run -it --volumes-from db_data --name db2 ubuntu
db1、db2通过db_data来共享了数据
2. 利用数据卷容器来备份、恢复、迁移数据卷
可以利用数据卷对其中的数据进行进行备份、恢复和迁移。
2.1 备份
首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从本地主机挂载当前到容器的 /backup 目录。命令如下:
1sudo
docker run --volumes-from dbdata -v
$(pwd):/backup
ubuntu
tar
cvf
/backup/backup.tar
/dbdata
容器启动后,使用了 tar 命令来将 dbdata 卷备份为本地的 /backup/backup.tar。
2.2 恢复
如果要恢复数据到一个容器,首先创建一个带有数据卷的容器 dbdata2。
1sudo
docker run -v
/dbdata
--name dbdata2 ubuntu
/bin/bash
然后创建另一个容器,挂载 dbdata2 的容器,并使用 untar 解压备份文件到挂载的容器卷中。
1sudo
docker run --volumes-from dbdata2 -v
$(pwd):/backup
busybox
tar
xvf
/backup/backup.tar
声明:博文内容纯属个人理解,有异议请点评
到此这篇关于docker容器与宿主机的数据交互方式总结的文章就介绍到这了