Docker Swarm持久化
1 简介
Docker Swarm持久化有bind、volume和NFS三种方式,bind和volume两种方式适合挂载单个宿主机,不适合集群;NFS适合集群服务,但需要安装NFS系统。
注意:Docker Swarm需要先安装集群。
由Docker Swarm构建的集群,使用filebrowser测试。
注意:使用搭建filebrowser集群过程中,会发现刷新一次就要登录一次,因为构建的集群中每个容器副本登录都是独立的,但是集群中设置了负载均衡,所以,每刷新一次访问的容器副本不一样,导致刷新一次会登录一次。
序号 | 主机名 | IP | 备注 |
---|---|---|---|
1 | master | 192.168.108.201 | |
2 | node1 | 192.168.108.201 |
2 使用bind方式
注意:Swarm使用bind挂载目录前,需要宿主机上的相应文件系统的数据路径必须存在。系统可以在全部节点都可以访问(如果只有1个副本,也可以在全部节点上访问)。
2.1 使用命令创建
在201和202两台宿主机系统上,创建以下目录和文件,为下面创建服务使用。
注意:⚠️ 下面的文件需要自己创建一个filebrowser容器,然后将其中的文件放到下面的目录中,因为自己创建的是空文件,容器加载过程中会出错。
--/home/filebrowser
----/srv
----/database.db
----/.filebrowser.json
创建集群,持久化使用--mount type=bind
参数,注意:此处的是2个副本,如果3个副本会出现(403)问题,因为是从容器中将配置复制过来的,所以出现403错误,如果不绑定配置文件,docker swarm自己配置不会出现上面的问题。
docker service create \
--name filebrowser \
--replicas 2 \
--publish 8080:80 \
--env PGID=$(id -g) \
--env PUID=$(id -u) \
--mount type=bind,src=/home/filebrowser/srv,dst=/srv \
--mount type=bind,src=/home/filebrowser/database.db,dst=/database.db \
--mount type=bind,src=/home/filebrowser/.filebrowser.json,dst=/.filebrowser.json \
filebrowser/filebrowser:latest
查看信息
# 查看swarm的服务
docker service ls
# 查看当前节点的服务
docker node ps
2.2 使用Docker Stack创建
docker-compose.yml
version: "3.7"
services:
filebrowser:
image: filebrowser/filebrowser:latest
hostname: filebrowser
ports:
- 8080:80
deploy:
mode: replicated
replicas: 2
volumes:
- /home/filebrowser/srv:/srv
- /home/filebrowser/database.db:/database.db
- /home/filebrowser/.filebrowser.json:/.filebrowser.json
执行命令
# 执行命令
docker stack deploy -c docker-compose.yml filebrowser-stack
# 查看服务
docker stack ls
# 列出stack中的任务
docker stack ps filebrowser-stack
# 删除
docker stack rm filebrowser-stack
# 查看服务日志
docker service logs filebrowser-stack_filebrowser
2.3 执行结果
使用账号登录filebrowse系统,从结果中可以看到,由于在上传数据时,上传到了不同的宿主机上,所以数据不一致。
3 使用volume方式
注意:使用volume方式创建的目录会被映射到宿主机的/var/lib/docker/volumes
下,可以设置挂载目录的权限。
3.1 使用命令创建
创建volume
也可以直接借用docker run的-v
参数设置数据卷,不在赘述。
# 创建数据卷
docker volume create volume_filebrowser
# 查看数据卷
docker volume ls
# 查看详情
docker volume inspect volume_filebrowser
# 删除卷
docker volume rm volume_filebrowser
# 清空所有无用数据卷,慎重操作
docker volume prune
使用volume持久化
注意:如果没有使用上面的命令创建volume,下面的命令会自动在宿主机上创建volume,上面的步骤可以省略。由于volume一般挂载的是目录,不挂载文件,所以此处没有挂载配置文件,不会出现上面的403错误。
docker service create \
--name filebrowser \
--replicas 3 \
--publish 8080:80 \
--env PGID=$(id -g) \
--env PUID=$(id -u) \
--mount type=volume,src=volume_filebrowser,dst=/srv \
filebrowser/filebrowser:latest
3.2 使用Docker Stack创建
docker-compose.yml
version: "3.7"
services:
filebrowser:
image: filebrowser/filebrowser:latest
hostname: filebrowser
ports:
- 8080:80
deploy:
mode: replicated
replicas: 3
volumes:
- volume_filebrowser:/srv
volumes:
volume_filebrowser:
driver: local
直接执行下面命令即可。
docker stack deploy -c docker-compose.yml filebrowser-stack
3.3 执行结果
4 使用nfs方式
4.1 创建nfs目录
注意:需要先安装nfs系统,然后在202节点上创建nfs目录
# 创建目录
mkdir -p /data/nfsdata
# 添加权限
chmod 777 /data/nfsdata
# 编辑文件
vim /etc/exports
# 添加以下内容
/data/nfsdata 192.168.108.*(rw,sync,no_subtree_check)
# 重启服务
systemctl restart nfs
# 查看共享目录
showmount -e 192.168.108.202
# 返回值如下,表示创建成功
Export list for 192.168.108.202:
/data/nfsdata 192.168.108.*
4.2 使用命令创建
创建volume
# 创建数据卷
docker volume create \
--name volume_filebrowser \
--opt "type=nfs" \
--opt "o=addr=192.168.108.202,rw" \
--opt "device=:/data/nfsdata"
使用volume持久化
注意:如果没有使用上面的命令创建volume,下面的命令会自动在宿主机上创建volume,上面的步骤可以省略。
docker service create \
--name filebrowser \
--replicas 3 \
--publish 8080:80 \
--env PGID=$(id -g) \
--env PUID=$(id -u) \
--mount type=volume,src=volume_filebrowser,dst=/srv \
filebrowser/filebrowser:latest
4.3 使用Docker Stack创建
docker-compose.yml
version: "3.7"
services:
filebrowser:
image: filebrowser/filebrowser:latest
hostname: filebrowser
ports:
- 8080:80
deploy:
mode: replicated
replicas: 3
volumes:
- volume_filebrowser:/srv
volumes:
volume_filebrowser:
driver: local
driver_opts:
type: "nfs"
o: "addr=192.168.108.202,rw"
device: ":/data/nfsdata"
直接执行下面命令即可。
docker stack deploy -c docker-compose.yml filebrowser-stack
4.4 执行结果
由于使用的是nfs,挂载的是同一个目录,所以两个系统的内容是相同的。