docker部署fastdfs并在Django中集成

发布时间 2023-09-09 22:22:17作者: hkwJsxl

拉取Fastdfs镜像

docker pull delron/fastdfs

构建Tracker容器

是在Linux环境下,使用docker镜像构建tracker容器,用于启动跟踪服务器,起到调度的作用。

docker run -d --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker

实际操作Ubuntu使用下面一条命令可用。

在Mac或Windows操作系统环境下,network=host(容器与主机享受相同的network namespace)会失效,此时需要指定对应的端口映射。

docker run -d --name tracker -p 22122:22122 -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker

默认tracker是监听在22122端口的。

其中-v参数将本地的目录与容器中的/var/fdfs目录进行挂载。

这里可以看到tracker服务已经启动完成。

CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                                                                          NAMES
04276cc2eace   delron/fastdfs   "/usr/bin/start1.sh …"   17 seconds ago   Up 16 seconds   8080/tcp, 8888/tcp, 23000/tcp, 0.0.0.0:22122->22122/tcp, :::22122->22122/tcp   tracker

构建Storage容器

使用docker镜像构建storage容器,用于启动存储服务器,提供容量和备份服务。

在执行下面命令时特别需要提醒的时,对应的IP地址,需要修改为tracker服务的IP地址,由于是在同一台电脑上操作,这里使用本机的内网地址即可,22122是tracker对应的端口。

示例,下面命令需要替换IP地址。

docker run -d --network=host --name storage -e TRACKER_SERVER=ip:22122 -v /var/fdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage

替换IP地址之后对应Mac下的的具体执行操作:

docker run -d --name storage -p 8888:8888 -p 23000:23000 -e TRACKER_SERVER=47.120.38.34:22122 -v /var/fdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage

其中8888为Nginx对应的访问端口,23000是storage服务端口。

此时可查看docker的服务情况:

CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                                                                                                           NAMES
347c9932ed4c   delron/fastdfs   "/usr/bin/start1.sh …"   12 seconds ago   Up 12 seconds   8080/tcp, 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp, 22122/tcp, 0.0.0.0:23000->23000/tcp, :::23000->23000/tcp   storage
04276cc2eace   delron/fastdfs   "/usr/bin/start1.sh …"   5 minutes ago    Up 5 minutes    8080/tcp, 8888/tcp, 23000/tcp, 0.0.0.0:22122->22122/tcp, :::22122->22122/tcp                                    tracker

storage可能启动报错

root@iZf8z9b7gfn1gjsdnv7t56Z:/var/fdfs# docker logs storage 
ngx_http_fastdfs_set pid=8
try to start the storage node...
tail: cannot open '/var/fdfs/logs/storaged.log' for reading: No such file or directory
tail: no files remaining

报错解决:

# 原因:缺少目标文件
touch /var/fdfs/storage/logs/storaged.log

修改配置

经过上面的步骤,tracker和storage都启动完成。我们可以进入对应的docker容器查看一下默认的配置情况。

进入docker容器的命令为:

docker exec -ti storage bash

先进入storage,查看其对应配置文件中关于http访问的配置,配置文件在/etc/fdfs目录下的storage.conf。在最后一行可以看到如下配置:

# the port of the web server on this storage server
http.server_port=8888

也就是说,这个docker镜像中默认监听的是8888端口,当然此配置是可以修改的。如果修改为其他端口,对应的Nginx配置也需要修改。

那么Nginx配置在哪里呢?也在当前容器当中。Nginx配置文件的根目录为:

/usr/local/nginx/conf/

cat /usr/local/nginx/conf/nginx.conf

可以对其下的nginx.conf进行查看和修改。先来看一下默认配置:

server {
    listen       8888;
    server_name  localhost;
    location ~/group[0-9]/ {
        ngx_fastdfs_module;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root html;
    }
}

上面是关于server的配置,端口与storage的端口一一对应。如果需要修改时两个同步修改。

通过上面的操作你会发现默认FastDFS会需要开启8888、23000、22122端口,如果在Linux操作系统下,注意防火墙对对应端口的开放。

文件上传测试

在Django中集成。

  • 安装py3Fdfs
pip install py3Fdfs
  • 在django项目的settings文件中写入配置信息
# fastdfs
FASTDFS_CONF = {
    'host_tuple': ['%s' % SERVER_NAME, ],
    'connect_timeout': 30,
    'network_timeout': 60,
    'timeout': 30,
    'tracker_server': '%s:22122' % SERVER_NAME,
    'name': 'Tracker Pool',
    'port': 22122,
}
  • app下测试文件test.py
import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lg_shop.settings.dev')

from django.test import TestCase

from django.conf import settings
from fdfs_client.client import Fdfs_client

# 加载配置文件
client = Fdfs_client(settings.FASTDFS_CONF)
# 上传文件
rets = client.upload_by_filename(r"C:\Users\Administrator\Pictures\icon.jpg")
print(rets)

'''
	# 上传成功后的返回值
    {
        "Group name": "group1",  # 组名
        "Remote file_id": "group1/M00/00/00/rBEAA2TsEjKAfxYVAAAP8lLos1M446.jpg",  # 文件索引,可用于下载
        "Status": "Upload successed.",  # 文件上传结果反馈
        "Local file name": "C:\\Users\\Administrator\\Pictures\\icon.jpg",  # 文件上传全路径
        "Uploaded size": "3.99KB",  # 文件大小
        "Storage IP": "47.120.38.34"  # Storage地址
    }
    # 查看图片:地址+上面的Remote file_id
    http://47.120.38.34:8888/group1/M00/00/00/rBEAA2TsEjKAfxYVAAAP8lLos1M446.jpg
    # 有报错的话,看下报错信息就好,需要安装nginx

'''

批量上传本地文件

import os

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lg_shop.settings.dev')

from django.test import TestCase

from django.conf import settings

from fdfs_client.client import Fdfs_client

# 加载配置文件
client = Fdfs_client(settings.FASTDFS_CONF)
# 批量上传文件(ps:项目跟目录下的static/images)
images_path = os.path.join(settings.BASE_DIR.parent, "static\images")
for line in os.listdir(images_path):
    file_path = os.path.join(images_path, line)
    print(file_path)
    # 上传文件
    # rets = client.upload_by_filename(file_path)
    # print(rets)
    # 返回的`Remote file_id`写入数据库
    ...

自定义Django文件存储类

from django.core.files.storage import Storage
from django.conf import settings


class FastDFSStorage(Storage):
    """自定义文件存储类"""

    def __init__(self, fdfs_base_url=None):
        self.fdfs_base_url = fdfs_base_url or settings.FDFS_BASE_URL

    def _open(self, name, mode='rb'):
        pass

    def _save(self, name, content):
        pass

    def url(self, name):
        """
        返回文件的全路径
        :param name: 文件路径
        :return: ip+port+文件路径
        """
        return self.fdfs_base_url + name

配置文件:

DEFAULT_FILE_STORAGE = 'extension.fdfs_storage.FastDFSStorage'
FDFS_BASE_URL = 'http://%s:8888/' % SERVER_NAME