Django-FDFS配置

FDFS配置

1.下载和安装FDFS

1.1.直接用下载好的安装包。执行里面的两条sudo命令指令

1.2.检查Docker CE是否安装正确

sudo docker run hello-world

1.3.为了避免每次命令都输入sudo,可以设置用户权限,注意执行后须注销重新登录

sudo usermod -a -G docker $USER

2. 启动与停止

2.1.安装完成Docker后,默认已经启动了docker服务,如需手动控制docker服务的启停,可执行如下命令

# 启动docker
sudo service docker start
​
# 停止docker
sudo service docker stop
​
# 重启docker
sudo service docker restart

3. Docker镜像操作

3.1.列出镜像

docker image ls
  • REPOSITORY:镜像所在的仓库名称

  • TAG:镜像标签

  • IMAGEID:镜像ID

  • CREATED:镜像的创建日期(不是获取该镜像的日期)

  • SIZE:镜像大小

3.2.拉取镜像

# 要想获取某个镜像,我们可以使用pull命令,从仓库中拉取镜像到本地,如 
docker image pull library/hello-world  # 库名/镜像名称
sudo docker image pull library/ubuntu  

3.3.删除镜像

# docker image rm 镜像名或镜像id
docker image rm hello-world

4. Docker 容器操作

4.1.创建容器

# docker run [option] 镜像名 [向启动容器中传入的命令]
"""
常用可选参数说明:
-i 表示以“交互模式”运行容器
-t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
--name 为创建的容器命名
-v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。
-d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
-p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射
-e 为容器设置环境变量
--network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同
"""

4.2.交互式容器

# 例如,创建一个交互式容器,并命名为myubuntu
# docker run -it --name=创建的容器名字 通过那个镜像来创建 /bin/bash
​
docker run -it --name=myubuntu ubuntu /bin/bash

4.3.查看那些容器运行

# 查看当前运行的容器
sudo docker container ls
# 查看所有容器
sudo docker container ls --all

4.4.守护式容器,创建一个守护式容器:如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。在容器内部exit退出时,容器也不会停止。

# 加-d
sudo docker run -dit --name=myubuntu2 ubuntu  

4.5.进入已运行的容器

# docker exec -it 容器名或容器id 进入后执行的第一个命令
# sudo docker exec it 镜像名 镜像在的位置
sudo docker exec -it myubuntu2 /bin/bash

4.6.停止与启动容器

# 停止一个已经在运行的容器
docker container stop 容器名或容器id
​
# 启动一个已经停止的容器
docker container start 容器名或容器id
​
# kill掉一个已经在运行的容器
docker container kill 容器名或容器id

4.7.删除容器

docker container rm 容器名或容器id

5. 将容器保存为镜像

docker commit 容器名 镜像名

例如,把镜像myubuntu2里面的mysql给别人使用
1.先进入镜像,sudo docker exec -it myubuntu2 /bin/bash
2.然后在里面安装mysql:apt-get install mysql 
3.然后退出来,exit
4.sudo docker commit myubuntu2 ubuntu_with_mysql
5. sudo docker image ls # 查看一下,是否有该镜像

6. 镜像备份与迁移

# 我们可以通过save命令将镜像打包成文件,拷贝给别人使用
# docker save -o 保存的文件名 镜像名
docker save -o ./ubuntu.tar ubuntu
​
# 在拿到镜像文件后,可以通过load方法,将镜像加载到本地
docker load -i ./ubuntu.tar
​
# 删除镜像
sudo docker image rm ubuntu_with_mysql:latest

Docker的指令

1)镜像

命令 说明
docker image pull 组名/镜像名称 从仓库拉取镜像
docker image ls 查看本地所有镜像
docker image rm 镜像名称/镜像ID 删除指定镜像

2)容器

命令 说明
docker run [-option] 镜像 [向启动容器中传入的命令] 使用镜像创建容器
docker exec -it 容器名或容器id 进入后执行的第一个命令 进入指定容器
docker container ls 查询所有启动的容器
docker container ls --all 查询所有容器
docker container start 容器名称 启动指定容器
docker container stop 容器名称 停止指定容器
docker container rm 容器名称 删除指定容器

3)其他

命令 说明
docker commit 容器名 镜像名 将容器保存为镜像
docker save -o 保存的文件名 镜像名 将镜像打包为文件
docker load -i ./ubuntu.tar 将镜像加载到本地

使用Docker安装FastDFS

1. 获取镜像

# 获取镜像可以通过下载
docker image pull delron/fastdfs
​
# 也可以直接加载下载好的
docker load -i 文件路径/下载好的压缩文件

2. 运行tracker

执行如下命令开启tracker 服务

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

执行如下命令查看tracker是否运行起来

docker container ls

如果想停止tracker服务,可以执行如下命令

docker container stop tracker

停止后,重新运行tracker,可以执行如下命令

docker container start tracker

3. 运行storage

执行如下命令开启storage服务

docker run -dti --network=host --name storage -e TRACKER_SERVER=10.211.55.5:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage  
  • TRACKER_SERVER=本机的ip地址:22122 本机ip地址不要使用127.0.0.1

  • 我们将fastDFS storage运行目录映射到本机的/var/fdfs/storage目录中

执行如下命令查看storage是否运行起来

docker container ls

如果想停止storage服务,可以执行如下命令

docker container stop storage

停止后,重新运行storage,可以执行如下命令

docker container start storage

注意:如果无法重新运行,可以删除/var/fdfs/storage/data目录下的fdfs_storaged.pid 文件,然后重新运行storage。

 

FastDFS客户端与自定义文件存储系统

1.安装

安装下载好的fdfs_client-py-master.zip到虚拟环境中
# 网不行的情况下载好的文件,找到该文件,断开网按照这个方法安装
pip install fdfs_client-py-master.zip  
pip install mutagen
pip install requests

2.使用

使用FastDFS客户端,需要有配置文件。我们在meiduo_mall/utils目录下新建fastdfs目录,将提供给大家的client.conf配置文件放到这个目录中。

需要修改一下client.conf配置文件

base_path=FastDFS客户端存放日志文件的目录
tracker_server=运行tracker服务的机器ip:22122

上传文件需要先创建fdfs_client.client.Fdfs_client的对象,并指明配置文件,如

from fdfs_client.client import Fdfs_client
client = Fdfs_client('meiduo_mall/utils/fastdfs/client.conf')

通过创建的客户端对象执行上传文件的方法

client.upload_by_filename(文件名)
或
client.upload_by_buffer(文件bytes数据)

如:

>>> ret = client.upload_by_filename('/Users/delron/Desktop/1.png')
getting connection
<fdfs_client.connection.Connection object at 0x1098d4cc0>
<fdfs_client.fdfs_protol.Tracker_header object at 0x1098d4908>
>>> ret
{'Group name': 'group1', 'Remote file_id': 'group1/M00/00/02/CtM3BVr-k6SACjAIAAJctR1ennA809.png', 'Status': 'Upload successed.', 'Local file name': '/Users/delron/Desktop/1.png', 'Uploaded size': '151.00KB', 'Storage IP': '10.211.55.5'}
>>>
  • Remote file_id 即为FastDFS保存的文件的路径

3. 自定义Django文件存储系统

Django自带文件存储系统,但是默认文件存储在本地,在本项目中,我们需要将文件保存到FastDFS服务器上,所以需要自定义文件存储系统。

自定义文件存储系统的方法如下:

1)需要继承自django.core.files.storage.Storage,如

from django.core.files.storage import Storage
​
class FastDFSStorage(Storage):
    ...

2)支持Django不带任何参数来实例化存储类,也就是说任何设置都应该从django.conf.settings中获取

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

class FastDFSStorage(Storage):
    def __init__(self, base_url=None, client_conf=None):
        if base_url is None:
            base_url = settings.FDFS_URL
        self.base_url = base_url
        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf


3)存储类中必须实现_open()_save()方法,以及任何后续使用中可能用到的其他方法。

  • _open(name, mode='rb')

    被Storage.open()调用,在打开文件时被使用。

  • _save(name, content)

    被Storage.save()调用,name是传入的文件名,content是Django接收到的文件内容,该方法需要将content文件内容保存。

    Django会将该方法的返回值保存到数据库中对应的文件字段,也就是说该方法应该返回要保存在数据库中的文件名称信息。

  • exists(name)

    如果名为name的文件在文件系统中存在,则返回True,否则返回False。

  • url(name)

    返回文件的完整访问URL

  • delete(name)

    删除name的文件

  • listdir(path)

    列出指定路径的内容

  • size(name)

    返回name文件的总大小

    注意,并不是这些方法全部都要实现,可以省略用不到的方法。

4)需要为存储类添加django.utils.deconstruct.deconstructible装饰器

我们在meiduo_mall/utils/fastdfs目录中创建fdfs_storage.py文件,实现可以使用FastDFS存储文件的存储类如下

from django.conf import settings
from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client
​
​
@deconstructible
class FastDFSStorage(Storage):
    def __init__(self, base_url=None, client_conf=None):
        """
        初始化
        :param base_url: 用于构造图片完整路径使用,图片服务器的域名
        :param client_conf: FastDFS客户端配置文件的路径
        """
        if base_url is None:
            base_url = settings.FDFS_URL
        self.base_url = base_url
        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf
​
    def _save(self, name, content):
        """
        在FastDFS中保存文件
        :param name: 传入的文件名
        :param content: 文件内容
        :return: 保存到数据库中的FastDFS的文件名
        """
        client = Fdfs_client(self.client_conf)
        ret = client.upload_by_buffer(content.read())
        if ret.get("Status") != "Upload successed.":
            raise Exception("upload file failed")
        file_name = ret.get("Remote file_id")
        return file_name
​
    def url(self, name):
        """
        返回文件的完整URL路径
        :param name: 数据库中保存的文件名
        :return: 完整的URL
        """
        return self.base_url + name
​
    def exists(self, name):
        """
        判断文件是否存在,FastDFS可以自行解决文件的重名问题
        所以此处返回False,告诉Django上传的都是新文件
        :param name:  文件名
        :return: False
        """
        return False

4. 在Django配置中设置自定义文件存储类

在settings/dev.py文件中添加设置

# django文件存储
DEFAULT_FILE_STORAGE = 'meiduo_mall.utils.fastdfs.fdfs_storage.FastDFSStorage'
​
# FastDFS
FDFS_URL = 'http://image.meiduo.site:8888/'  
FDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'utils/fastdfs/client.conf')

5. 添加image域名

在/etc/hosts中添加访问FastDFS storage服务器的域名

127.0.0.1   image.meiduo.site

访问部署好的图片:ip地址:8888/+Remote file_id (图片的地址)

 

没有更多推荐了,返回首页