virtualbox虚拟机docker安装fastdfs以及python调用
一、介绍
由于在实际操作过程中遇到了很多问题,因此写本贴供和我情况类似的朋友参考,希望能够对你有用。
1.安装环境
- 时间:2022/4/2
- 环境:主机win10,虚拟机工具virtualbox,虚拟机操作系统centos7,docker版本20.0.2
- 虚拟机与主机连接方式:桥接
- 容器网络连接方式:host
2.python环境
- 虚拟环境:anaconda
- python版本:3.8
- 工具库:py3fdfs2.2.0
二、安装fastdfs
1.获取fastdfs镜像
docker pull delron/fastdfs
采用这个镜像是因为功能齐全,还集成了nginx,方便使用。如果不想用这个镜像,可以通过
docker search fastdfs
查找可以使用的fastdfs镜像,当然使用其他的镜像会遇到的坑我就不知道了。
2.创建并运行tracker容器
docker run -d --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
参数解释:
- -d后台运行,可换成-itd交互式后台运行;
- –network选择容器连接的网络,docker初始有host和bridge两种网络,其中bridge是默认选项,两者区别请自行查找别的文章(ps:推荐使用host,用bridge原则来说也可以,但是之前看到有文章说逻辑复杂且需要修改东西,有时间的小伙伴可以尝试一下);
- –name容器命名;
- -v 物理目录:容器目录,用来将物理目录(可自行设置)与容器目录绑定,如果没有设置那么docker会随机分配一个物理目录与容器目录绑定,目录可以查找到;
- delron/fastdfs 选择的容器使用的镜像;
- tracker镜像中执行的命令,这应该是个脚本或者什么的具体没有深究,最终效果是利用该镜像创建一个tracker服务;
3.创建并运行storage容器
docker run -d --network=host --name storage -e TRACKER_SERVER=tracker的ip:22122 -v /var/fdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage
参数解释:
- -e设置环境变量;
4.修改storage和nginx配置文件
别的教程提到了很多,这里不是我的文章重点,默认nginx代理8888端口,我没有选择修改。如果端口冲突可自行查找解决方案。
三、测试fastdfs
这里我们首先通过fastdfs自带的客户端进行上传文件。
1.进入storage容器内部
docker exec -it storage /bin/bash
2.调用fastdfs客户端
echo 'hello fastdfs' > /test.txt
cat /test
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /test.txt
3.获取文件
这里我们拿着获取到的文件路径,通过访问nginx代理的服务,即可获取到文件。
http:your_server_ip:8888/group1/M00/00/00/CgEeMWJIAtKAdWtHAAAADplm3rU386.txt
四、通过python调用fastdfs
1.下载py3fdfs库
pip install py3fdfs
2.配置文件
#这里我的只有两个参数,是因为我下载的2.2.0配置文件解析只解析这两个参数,别的没用上
connect_timeout=30
tracker_server = 10.1.30.49:22122
3.调用接口
from fdfs_client.client import get_tracker_conf, Fdfs_client
tracker_conf = get_tracker_conf('./fastfdfs_client.conf')
client = Fdfs_client(tracker_conf)
#文件上传
result = client.upload_by_filename('./static/1.txt')
print(result)
#文件下载
result = client.download_to_file('./test.txt', b'group1/M00/00/00/CgEeMWJGmAKAVv3tAAAADplm3rU765.txt')
print(result)
#文件删除
result = client.delete_file(b'group1/M00/00/00/CgEeMWJGmAKAVv3tAAAADplm3rU765.txt')
print(result)
#列出所有的group信息
result = client.list_all_groups()
print(result)
上传效果图
下载效果图
五、遇到的问题
1.虚拟机内部可以访问文件,主机无法访问
- 问题描述:通过wget可以在虚拟机中获取到文件,但是通过主机访问就无法获取。
- 解决方案:可以尝试虚拟机ping主机,如果主机ping不通,那么就是防火墙的问题,关闭主机防火墙即可。测试阶段最好确保虚拟机对应端口或者防火墙关闭,避免这种问题怀疑软件本身或者兼容性出现的问题。
- 题外话,最初怀疑是容器使用host网络的问题,毕竟之前docker部署的bridge网络下的容器主机都能正常访问和运行。事实证明确实可以通过设置为bridge访问文件。但是最终的后果是通过python调用fastdfs时出现了很多问题,这些问题大概率是因为bridge内部网络运行模式,遇到此类问题的小伙伴也可以考虑这个问题。
2.py3fdfsv2下载失败
- 问题描述:下载py3fdfsv2会报错,类似于编码不符合条件这种的。
- 解决方案:py3fdfsv2是最新版本的库,我们可以使用py3fdfs,这样就不会报错。
3. 配置文件编码问题
- 问题描述:调用get_tracker_conf(’./fastfdfs_client.conf’)函数失败,出现类似gbk codec类似的报错
- 解决方案:通过debug的方式,找到了该函数位于client.py中,同时调用了read()函数
进一步查看发现util.py中read()函数打开文件没有设置编码,不设置编码默认按照gbk编码读取自然出现问题,因为我的conf文件采用utf-8编码。因此修改这里的代码,添加一个编码即可。
4.使用bridge模式的tracker和storage时,python调用接口报错
这个问题没有解决,不太懂,最好就按照host模式连接容器就好了。网上有教程,不知道能不能解决,没有尝试过。
5.storage重启失败
- 问题描述:storage容器关闭后重启失败
- 解决方案:这个主要是因为storage文件中记录的fdfs_storaged.pid与tracker记录的fdfs_storaged.pid不一致导致的,将storage容器中的pid文件删除可以解决这个问题。由于之前我们创建容器时将物理目录与容器目录绑定在一起,因此我们可以直接操作物理目录。
rm -rf /var/fdfs/storage/data/fdfs_storaged.pid
注意这里的路径是你自己设置的,如果没有修改过我给的指令应该可以直接用。