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

注意这里的路径是你自己设置的,如果没有修改过我给的指令应该可以直接用。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值