赞
踩
默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。很多情况下我需要数据持续化保存.
Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定
这样在容器启动后,容器内会自动创建/home/data的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
ps:路径为绝对路径
[root@au opt]# docker run -d --name=dor -v /opt/dataSource:/home/data yjgithub/dor
容器: yjgithub/dor
宿主机绝对路径:/opt/dataSource
容器绝对路径:/home/data
docker inspect $containerId
[root@au opt]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1249319e10ca yjgithub/dor "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp dor
[root@au opt]#docker inspect 1249319e10ca
"Mounts": [
{
"Type": "bind",
"Source": "/opt/dataSource",
"Destination": "/home/data",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
ps:
1.容器销毁了,在宿主机上新建的挂载目录不会消失
2.如果宿主机目录存在,在运行容器时也会映射到容器中
3.宿主机目录数据,在运行容器时也会同步
4.挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”,
4.1 设置selinux永久关闭
修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。
4.2 以特权方式启动容器 指定--privileged参数
[root@au opt]# docker run -d --name=dor --privileged=true -v /opt/dataSource:/home/data yjgithub/dor
如果要在容器之间共享数据,最好是使用 data container。这种 container 中不会跑应用,而只是挂载一个卷
创建一个 data container:
[root@au opt]#docker create -v /opt/dataSource/share:/dbdata --name dbstore yjgithub/dor /bin/true
使用这个 volume
[root@au opt]#docker run -d -P --name web --volumes-from dbstore yjgithub/dor
[root@au share]# docker inspect web
"Mounts": [
{
"Type": "bind",
"Source": "/opt/dataSource/share",
"Destination": "/dbdata",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
结果还是一样的,即将 au 对应的主机上的目录挂载给容器内的 /volume 目录。
这种做法,能想到的好处就是容器件共用数据
感觉上两种做法都是一样的,何不直接用第一种? 如果还有更好的做法或者其他场景,可以一起讨论下.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。