赞
踩
docker 数据卷呈现给docker容器的一个形式就是目录,该目录支持多个容器间共享,修改不会影响到镜像。便于数据共享和重用
1、当创建一个容器的时候,容器运行,数据能不能持久化?
2、如果能够持久化,数据存储在哪?由于docker是隔离的,数据能不能存储在容器外?
3、如果部署很多容器,每次都需要进入容器中进行配置嘛?能不能外部进行配置
docker 数据卷呈现给docker容器的一个形式就是目录,该目录支持多个容器间共享,修改不会影响到镜像。使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统。
Volume的作用
docker run
用来创建容器,可以在使用改命令时添加-v
参数,就可以创建并挂载一个到多个数据卷到当前运行的容器中,
-v
的作用是将宿主机的一个目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共享一个目录,如果本地路径不存在,Docker也会自动创建。
docker run -p 8080:80 -d --name nginx01 -v /home/test:/home/test nginx
意思是: 我们创建了一个名称为nginx01的容器,将本机的9999端口映射到容器中nginx服务器的默认web访问端口80下,创建一个数据卷,并挂载到容器的/home/test目录下(注意:如果不存在会自动创建)。
我们可以通过docker inspect指令找到Volume在主机上的存储位置
docker inspect nginx01
测试:往容器卷写入数据,查看linux主机是否,会自动同步共享
# 容器中
root@dda40c3f4e1a:/home/test# touch nginxVolumn.txt
root@dda40c3f4e1a:/home/test# ls
nginxVolumn.txt
#主机中
[root@VM-8-9-centos test]# ls
nginxVolumn.txt
# 容器数据卷 数据同步成功!
测试:当容器关闭的时候,linux往docker数据卷中写入数据,数据是否同步
# 关闭容器 [root@VM-8-9-centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dda40c3f4e1a nginx "/docker-entrypoint.…" 12 minutes ago Up 12 minutes 0.0.0.0:9999->80/tcp, :::9999->80/tcp nginx01 [root@VM-8-9-centos ~]# docker stop nginx01 # linux往数据卷写入数据 [root@VM-8-9-centos test]# vim nginxVolumn.txt linux update in container close. # 开启容器 查看数据卷 [root@VM-8-9-centos ~]# docker start nginx01 nginx01 [root@VM-8-9-centos ~]# docker exec -it nginx01 /bin/bash root@dda40c3f4e1a:/# cd /home/test/ root@dda40c3f4e1a:/home/test# ls nginxVolumn.txt root@dda40c3f4e1a:/home/test# cat nginxVolumn.txt linux update in container close. # 即使容器关闭,该容器数据卷依旧存在 , linux往容器数据卷写入数据成功!
挂载的数据卷默认为可读写权限,除非外部文件系统做了特殊限制,在docker run
的时候也可以执行为只读
权限
[root@VM-8-9-centos ~]# docker run -d -p 9999:80 --name nginx02 -v /home/authority:/home/authority:ro nginx
# 容器中
root@e1ae8ee5c387:/home/authority# touch authority.txt
touch: cannot touch 'authority.txt': Read-only file system
# linxu中
[root@VM-8-9-centos authority]# touch authority.txt
[root@VM-8-9-centos authority]# ls
authority.txt
ro: 的意义在于,规定 容器对/home/authority 数据卷 只拥有readonly的权限
但是 linux跟跟容器共享的数据卷/home/authority 是拥有可读可写的权限。
想让所有的容器都可以共享宿主机的/home/hostFile.txt
,从而只需要改变宿主机的文件源就能够影响到所有的容器。
[root@VM-8-9-centos home]# docker run -it -d --name nginx03 -v /home/hostFile.txt:/home/hostFile.txt:ro nginx
数据卷容器: 在多个容器中共享数据的容器(实际上就是共享一个目录)
如果需要在多个容器间共享数据,并希望永久保存这些数据,最好的方式是使用数据卷容器,类似于一个提供网络文件共享服务的NFS服务器。
数据卷容器创建方法跟普通容器一样,只需要指定宿主机的一个文件夹作为数据卷即可,使用docker create
命令创建但不启动数据卷容器:
# 通过宿主机的文件目录 创建 数据卷容器
# 创建一个数据卷容器 [root@VM-8-9-centos ~]# docker create -v /home/shareDirecotry --name shareDataVolumnContainer centos /bin/true 4092c64c2bf26fa1de45e46ff8d0c023f77a82f251d54d44d30078d71fdce82a # 查看运行的容器 [root@VM-8-9-centos ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c694a1581c35 nginx "/docker-entrypoint.…" 47 minutes ago Up 47 minutes 80/tcp nginx03 # 查看全部容器 [root@VM-8-9-centos ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # 共享的数据卷容器 4092c64c2bf2 centos "/bin/true" 13 seconds ago Created shareDataVolumnContainer c694a1581c35 nginx "/docker-entrypoint.…" 47 minutes ago Up 47 minutes 80/tcp nginx03 e1ae8ee5c387 nginx "/docker-entrypoint.…" About an hour ago Exited (0) 51 minutes ago nginx02 dda40c3f4e1a nginx "/docker-entrypoint.…" About an hour ago Exited (0) About an hour ago nginx01 dca312adb8a9 centos "/bin/bash" 5 hours ago Exited (0) 5 hours ago centos1 c4930882a1f1 d716ed54947b "catalina.sh run" 25 hours ago Exited (143) 2 hours ago tomcat0 # 创建多个容器 共享数据卷容器 [root@VM-8-9-centos ~]# docker run -it -d --volumes-from shareDataVolumnContainer --name site1 nginx 9733bec6d7e6b860c5a6d39e229053faa94e48f59a9e843fb913def5e6f0e676 [root@VM-8-9-centos ~]# docker run -it -d --volumes-from shareDataVolumnContainer --name site2 nginx 3926c6f338065c0e0764a576b286c3831821d34f1a919bdb5d3de6bd9979d303 --volumes-from : 指定共享的数据卷容器
可以看到容器site1 在共享数据卷容器中创建了 site1.txt
容器site2 在共享数据卷容器中可以共享数据site1.txt
注意:此时linux主机是不能共享shareDirectory的
**我们对数据卷容器中的数据进行备份,**备份方法:
1.创建一个新的容器
2.挂载数据卷容器
3.挂载宿主机本地目录作为数据卷
4.将数据卷容器的内容备份到宿主机本地目录挂载的数据卷中
5.完成备份操作后容器销毁
请按照上述步骤对数据卷容器shiyanloudb中的数据进行备份:
# 创建备份目录
mkdir /tmp/backup
# 创建备份容器
docker run --rm --volumes-from shiyanloudb -v /tmp/backup:/backup ubuntu tar cvf /backup/shiyanloudb.tar /shiyanloudata
使用VOLUME指令向容器添加volume
VOLUME /data
多个时VOLUME ["/data1","/data2"]
这种情况和第一个中情况docker run -v /data是一样的。注意,dockerfile中使用volume是不能和第二种方法那样挂载宿主机中指定的文件夹。这时为了保证Dockerfile的可移植性,因为不能保证所有的宿主机都有对应的文件夹。
需要注意的是,在Dockerfile中使用VOLUME指令后,如果尝试对这个volume进行修改,这些修改指令都不会生效,比如下面例子,尝试添加一个文件,并修改文件并改变文件所有权限
FROM test/mycent:v1.0
RUN useradd foo
VOLUME /data
RUN touch /data/x
RUN chown -R foo:foo /data
通过该Dockerfile创建镜像并启动容器后,该容器中存在用户foo,并且能看到在/data挂载的volume,但是/data文件夹的所有者并没有被改变为foo,而且/data下也没有/data/x文件。但是如果顺序反过来,先建文件,先授权,再挂载volume,那就得到期待的结果。
1.启动一个nginx 容器
语法格式:
-v 容器内路径!
[root@VM-8-9-centos ~]# docker run -d -p 9999:80 --name anonymousMount -v /etc/nginx nginx
2.查看所有 volume 的情况
docker volume ls
该容器中数据卷会对应宿主机实际目录,通过docker inspect containerID
查看
docker inspect anonymousMount # 一般都位于/var/lib/docker/volumes/ 下 "Mounts": [ { "Type": "volume", "Name": "9677f2ed4e4cd6ef93254f34faabbb037b37b0a46e4221bd411911b7c2715442", "Source": "/var/lib/docker/volumes/9677f2ed4e4cd6ef93254f34faabbb037b37b0a46e4221bd411911b7c2715442/_data", "Destination": "/etc/nginx", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
3.这里发现,这种就是匿名挂载,在 -v 的时候只加容器内路径,没有加容器外路径!
1.重新启动一个nginx 容器
语法格式:
-v 卷名:容器内路径
注:卷名前面不加路径/
docker run -d -P --name nginx02 -v slotMount:/etc/nginx nginx
2.查看所有 volume 的情况
docker volume ls
DRIVER VOLUME NAME
local 4dcdd5b0a408438d90683df372cbc31f0fc48497c4252f61cf9d9c2a03747c01
local slotMount
3.查看具名卷的信息
docker volume inspect slotMount
[
{
"CreatedAt": "2021-01-27T15:54:14+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有docker容器内的卷,没有指定目录的情况下,都保存在“/var/lib/docker/volumes/xxx/_data”目录下。 # xxx为启动容器时设置的卷名
# 进入具名挂载的目录查看卷内的数据,可以看到nginx的配置文件存在!
[root@yang ~]# cd /var/lib/docker/volumes/slotMount/_data/
[root@yang _data]# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
!!!具名挂载可以方便找到一个卷,大多数情况下,推荐使用【具名挂载】
-v 容器内路径 # 匿名挂载 /var/lib/docker/volumes 生成对应挂载目录
-v 卷名:容器内路径 # 具名挂载 /var/lib/docker/volumes 生成对应挂载目录
-v / 宿主机目录:容器内目录 # 指定路径挂载
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。