Docker Swarm(四)Volume 数据(挂载)持久化
前言
为了获得最佳的性能和可移植性,应该避免将重要数据直接写入容器的可写层,而应使用数据卷或绑定挂载。
可以为集群中的服务创建两种类型的挂载,数据卷挂载(volume mounts)或绑定挂载(bind mounts)。
无论使用哪种类型的挂载,在创建服务时使用 --mount 标志进行配置,或者在更新服务时使用 --mount-add 或 --mount-rm 标志。如果不指定一个类型,默认类型是数据卷挂载。
注:tmpfs mount 仅可用于独立容器,不能在 Docker Swarm Service 中使用,故此处不介绍。
一、数据卷挂载
数据卷是在主机上的持久化存储,即使容器删除,也不会影响数据卷。
使用 docker volume create 命令创建一个volume:
docker volume create --name cwxvolume
使用 docker volume ls 命令查看volume列表:
docker volume ls
创建服务时使用创建好的volume挂载目录:
docker service create --name masl -e TZ="Asia/Shanghai" --network mrp_net --mount type=volume,src=cwxvolume,dst=/home/mppay/logs/masl --replicas 2 -p 8081:8080 172.16.99.2:40305/masl:dev-yc-34
参数src写成
source
也可以;dst表示容器内的路径,也可以写成destination
使用 docker service ps 命令查看服务情况:
docker service ps masl
发现分别在 manager-node 和 node1 节点上都创建了 masl 任务。
登陆 manager-node 服务器,使用 docker ps -a 命令查看容器运行情况:
docker ps -a
再使用 docker exec 进入容器:
docker exec -ti f820be6cf958 /bin/bash
发现,在容器内部的 /home/mppay/logs/masl 目录下有一个 masl.log文件,然后输入exit命令退出容器。
使用 docker volume inspect 命令查看挂载详细信息
docker volume inspect cwxvolume
进入上面指定的目录:
cd /var/lib/docker/volumes/cwxvolume/_data
ls
发现宿主机上也有这个文件。
二、绑定挂载
绑定挂载是调度程序为该任务部署容器时主机的文件系统路径,Docker 将路径挂载到容器中。在 Swarm 为任务初始化容器之前,该文件系统路径必须存在。
使用以下命令创建服务:
docker service create --name masl -e TZ="Asia/Shanghai" --network mrp_net --mount type=bind,source=/usr/local/tomcal_masl/logs,destination=/home/mppay/logs/masl --replicas 2 -p 8081:8080 172.16.99.2:40305/masl:dev-yc-34
其中,参数destination表示容器里面的路径,
source
表示本地硬盘路径
重要:虽然绑定挂载能用,但是也有可能导致一些问题:
1) 如果你挂载了一个主机路径到你的服务容器中,那么这个路径必须存在于 Swarm 集群中的每一个节点。Docker Swarm 调度器会把容器调度到任何满足资源可用性和满足你特定约束、位置偏好的节点上。
2) 如果运行中的容器变得不健康或者不可用,那么 Docker Swarm 调度器可能会随时重新安排它。
3) 主机绑定挂载是完全不可移植的。当你使用绑定挂载时,不能保证你的应用在开发中的运行方式与在生产中的运行方式相同。
总结
1) 挂载volume后,宿主机和容器之间就可以通过volume进行双向实时同步.
2) 如果replicas是多份,则每个节点宿主机上都会有一个volume路径,即每个节点宿主机的
/var/lib/docker/volumes/cwxvolume/_data
和分布到它上面的
容器里的/home/mppay/logs/masl
进行实时同步.