1.准备fastdfs安装所需文件
文件名 | 文件说明 | 本次安装版本 |
---|---|---|
libfastcommon | 从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库 | 1.0.59 |
fastdfs | FastDFS 源码,包含 tracker 和 storage 服务 | 6.0.8 |
fastdfs-nginx-module | FastDFS 与 Nginx 关联模块,实现访问和下载文件 | 1.22 |
nginx | 使文件能够通过http访问 | 1.22.0 |
2.提取和修改配置文件
-
从fastdfs源码包中提取如下配置文件,其中http.conf、mime.types、storage_ids.conf不用修改,此外storage_ids.conf文件只是用于构建好的镜像使用时挂载目录
-
从fastdfs-nginx-module源码包中提取mod_fastdfs.conf
-
从nginx源码包中提取配置文件
2.1 修改 tracker.conf
这里只修改base_path
# 禁用配置文件(默认为 false,表示启用配置文件)
disabled=false
# Tracker 服务端口(默认为 22122)
port=22122
# 存储日志和数据的根目录
base_path=/home/fastdfs
2.2 修改 storage.conf
这里只修改base_path、store_path0、tracker_server
# 启用配置文件(默认为 false,表示启用配置文件)
disabled=false
# Storage 服务端口(默认为 23000)
port=23000
# 数据和日志文件存储根目录
base_path=/home/fastdfs
# 存储路径,访问时路径为 M00
# store_path1 则为 M01,以此递增到 M99(如果配置了多个存储目录的话,这里只指定 1 个)
store_path0=/home/fastdfs
# Tracker 服务器 IP 地址和端口,单机搭建时也不要写 127.0.0.1
# tracker_server 可以多次出现,如果有多个,则配置多个
tracker_server=com.ikingtech.ch116221:22122
2.3 修改 client.conf
# 存储日志文件的基本路径
base_path=/home/fastdfs
# Tracker 服务器 IP 地址与端口号
tracker_server=com.ikingtech.ch116221:22122
2.4 修改 mod_fastdfs.conf
# Tracker 服务器IP和端口修改
tracker_server=com.ikingtech.ch116221:22122
# url 中是否包含 group 名称,改为 true,包含 group
url_have_group_name = true
# 配置 Storage 信息,修改 store_path0 的信息
store_path0=/home/fastdfs
2.5 修改 nginx.conf
新增 8888 端口 server 节点,如图所示:
server {
listen 8888;
server_name localhost;
location ~/group[0-9]/M[0-9][0-9]/ {
ngx_fastdfs_module;
}
}
说明:group1 为 nginx 服务 FastDFS 的分组名称,M00 是 FastDFS 自动生成编号,对应 store_path0,如果 FastDFS 定义store_path1,这里就是 M01;配置支持 group0-group9,以及 M00-M99
3.编写 Dockerfile 和启动脚本
3.1 Dockerfile
由于 centos 已停止更新,centos7 也将在2024年停止维护。推荐使用 rockylinux 和 ubuntu 进行构建
3.1.1 基于 CentOS 7 构建
# 基础镜像
FROM centos:7
# 添加配置文件
ADD conf/storage.conf /etc/fdfs/
ADD conf/tracker.conf /etc/fdfs/
ADD conf/client.conf /etc/fdfs/
ADD conf/nginx.conf /etc/fdfs/
ADD conf/mod_fastdfs.conf /etc/fdfs/
ADD conf/http.conf /etc/fdfs/
ADD conf/mime.types /etc/fdfs/
ADD fastdfs.sh /usr/bin/
# 源文件版本号
ARG LIB_VERSION=1.0.59
ARG FDFS_VERSION=6.08
ARG FDFS_NGX_VERSION=1.22
ARG NGX_VERSION=1.22.0
# 添加源文件
ADD source/libfastcommon-${LIB_VERSION}.tar.gz /usr/local/src/
ADD source/fastdfs-${FDFS_VERSION}.tar.gz /usr/local/src/
ADD source/fastdfs-nginx-module-${FDFS_NGX_VERSION}.tar.gz /usr/local/src/
ADD source/nginx-${NGX_VERSION}.tar.gz /usr/local/src/
# 构建镜像时运行的指令
RUN yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel \
&& mkdir -p /home/fastdfs/ \
&& cd /usr/local/src/libfastcommon-${LIB_VERSION}/ \
&& ./make.sh && ./make.sh install \
&& cd ../fastdfs-${FDFS_VERSION}/ \
&& ./make.sh && ./make.sh install \
&& cd ../nginx-${NGX_VERSION}/ \
&& ./configure --add-module=/usr/local/src/fastdfs-nginx-module-${FDFS_NGX_VERSION}/src/ \
&& make && make install \
&& chmod +x /usr/bin/fastdfs.sh \
&& rm -rf /usr/local/src/*
# 挂载数据卷,容器启动时未指定数据卷,会自动挂载到匿名卷
VOLUME ["/etc/fdfs"]
# 声明端口, 容器启动时如果使用随机端口映射会自动映射以下端口
EXPOSE 22122 23000 8888
ENTRYPOINT ["/usr/bin/fastdfs.sh"]
3.1.2 基于 RockyLinux 9 构建
# 基础镜像
FROM rockylinux:9
# 添加配置文件
ADD conf/storage.conf /etc/fdfs/
ADD conf/tracker.conf /etc/fdfs/
ADD conf/client.conf /etc/fdfs/
ADD conf/nginx.conf /etc/fdfs/
ADD conf/mod_fastdfs.conf /etc/fdfs/
ADD conf/http.conf /etc/fdfs/
ADD conf/mime.types /etc/fdfs/
ADD fastdfs.sh /usr/bin/
# 源文件版本号
ARG LIB_VERSION=1.0.59
ARG FDFS_VERSION=6.08
ARG FDFS_NGX_VERSION=1.22
ARG NGX_VERSION=1.22.0
# 添加源文件
ADD source/libfastcommon-${LIB_VERSION}.tar.gz /usr/local/src/
ADD source/fastdfs-${FDFS_VERSION}.tar.gz /usr/local/src/
ADD source/fastdfs-nginx-module-${FDFS_NGX_VERSION}.tar.gz /usr/local/src/
ADD source/nginx-${NGX_VERSION}.tar.gz /usr/local/src/
# 构建镜像时运行的指令
RUN yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel \
&& mkdir -p /home/fastdfs/ \
&& cd /usr/local/src/libfastcommon-${LIB_VERSION}/ \
&& ./make.sh && ./make.sh install \
&& cd ../fastdfs-${FDFS_VERSION}/ \
&& ./make.sh && ./make.sh install \
&& cd ../nginx-${NGX_VERSION}/ \
&& ./configure --add-module=/usr/local/src/fastdfs-nginx-module-${FDFS_NGX_VERSION}/src/ \
&& make && make install \
&& chmod +x /usr/bin/fastdfs.sh \
&& rm -rf /usr/local/src/*
# 挂载数据卷,容器启动时未指定数据卷,会自动挂载到匿名卷
VOLUME ["/etc/fdfs"]
# 声明端口, 容器启动时如果使用随机端口映射会自动映射以下端口
EXPOSE 22122 23000 8888
ENTRYPOINT ["/usr/bin/fastdfs.sh"]
3.1.2 基于 Ubuntu 22.04 构建
# 基础镜像
FROM ubuntu:22.04
# 添加配置文件
ADD conf/storage.conf /etc/fdfs/
ADD conf/tracker.conf /etc/fdfs/
ADD conf/client.conf /etc/fdfs/
ADD conf/nginx.conf /etc/fdfs/
ADD conf/mod_fastdfs.conf /etc/fdfs/
ADD conf/http.conf /etc/fdfs/
ADD conf/mime.types /etc/fdfs/
ADD fastdfs.sh /usr/bin/
# 源文件版本号
ARG LIB_VERSION=1.0.59
ARG FDFS_VERSION=6.08
ARG FDFS_NGX_VERSION=1.22
ARG NGX_VERSION=1.22.0
# 添加源文件
ADD source/libfastcommon-${LIB_VERSION}.tar.gz /usr/local/src/
ADD source/fastdfs-${FDFS_VERSION}.tar.gz /usr/local/src/
ADD source/fastdfs-nginx-module-${FDFS_NGX_VERSION}.tar.gz /usr/local/src/
ADD source/nginx-${NGX_VERSION}.tar.gz /usr/local/src/
# 构建镜像时运行的指令
RUN apt update \
&& apt install -y ca-certificates \
&& sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list \
&& sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list \
&& apt update \
&& apt install -y build-essential libxml2 libxml2-dev libxslt-dev openssl libpcre3 libpcre3-dev libgeoip-dev libgd-dev \
&& mkdir -p /home/fastdfs/ \
&& cd /usr/local/src/libfastcommon-${LIB_VERSION}/ \
&& ./make.sh && ./make.sh install \
&& cd ../fastdfs-${FDFS_VERSION}/ \
&& ./make.sh && ./make.sh install \
&& cd ../nginx-${NGX_VERSION}/ \
&& ./configure --add-module=/usr/local/src/fastdfs-nginx-module-${FDFS_NGX_VERSION}/src/ \
&& make && make install \
&& chmod +x /usr/bin/fastdfs.sh \
&& rm -rf /usr/local/src/*
# 挂载数据卷,容器启动时未指定数据卷,会自动挂载到匿名卷
VOLUME ["/etc/fdfs"]
# 声明端口, 容器启动时如果使用随机端口映射会自动映射以下端口
EXPOSE 22122 23000 8888
ENTRYPOINT ["/usr/bin/fastdfs.sh"]
3.2 fastdfs.sh(启动脚本)
#!/bin/bash
new_val=$FASTDFS_IPADDR
old="com.ikingtech.ch116221"
sed -i "s/$old/$new_val/g" /etc/fdfs/client.conf
sed -i "s/$old/$new_val/g" /etc/fdfs/storage.conf
sed -i "s/$old/$new_val/g" /etc/fdfs/mod_fastdfs.conf
:<<!
cat /etc/fdfs/client.conf > /etc/fdfs/client.conf.bak
cat /etc/fdfs/storage.conf > /etc/fdfs/storage.conf.bak
cat /etc/fdfs/mod_fastdfs.conf > /etc/fdfs/mod_fastdfs.conf.bak
mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
!
cp /etc/fdfs/nginx.conf /usr/local/nginx/conf
echo "start trackerd"
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
echo "start storage"
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
echo "start nginx"
/usr/local/nginx/sbin/nginx
:<<!
echo "fdfs monitor"
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
!
tail -f /dev/null
4.构建fastdfs镜像
关于高版本 gcc 编译安装 fastdfs-nginx-module 报错问题,可以查看我另一篇文章:解决 fastdfs-nginx-module 编译报错问题
# 下载基础镜像,随便一个都可以,推荐 rocky 和 ubuntu
docker pull centos:7
docker pull rockylinux:9
docker pull ubuntu:22.04
# 打开Dockerfile所在目录,构建fastdfs镜像
docker build -t fastdfs:6.0.8 .
Dockerfile 所在目录结构
5.镜像使用说明
- 启动命令
# 创建目录,用于挂载配置文件和数据
mkdir -p /opt/docker/fastdfs/conf
# 如果是使用我打包好的镜像,则需要先将镜像包上传至服务器,然后导入镜像
docker load -i /opt/docker/fastdfs-docker-image-6.0.8.tar.gz
# 启动命令
docker run -itd --restart=unless-stopped --name fastdfs \
-p 22122:22122 -p 23000:23000 -p 8888:80 \
-v /opt/docker/fastdfs:/home/fastdfs \
-v /opt/docker/fastdfs/conf:/etc/fdfs \
-e FASTDFS_IPADDR=192.168.32.166 \
fastdfs:6.0.8
# 如果要外部主机可以上传文件,要改用宿主机网络
docker run -itd --restart=unless-stopped --name=fastdfs --net=host \
-v /opt/docker/fastdfs:/home/fastdfs \
-v /opt/docker/fastdfs/conf:/etc/fdfs/ \
-e FASTDFS_IPADDR=192.168.32.166 \
rocky/fastdfs:6.0.8
启动前需将以下修改好的配置文件上传到宿主机
-
参数说明:
-p 22122:22122 # tracker服务端口
-p 23000:23000 # storage服务端口
-p 8888:80 # 文件访问端口
-v /opt/docker/fastdfs:/home/fastdfs # 数据和日志目录,data和logs文件夹会自动创建
-v /opt/docker/fastdfs/conf:/etc/fdfs # 配置文件目录
-e FASTDFS_IPADDR=192.168.32.166 # 宿主机ip,用于重写配置文件 -
检查fastdfs是否正常
- 进入容器
docker exec -it fastdfs /bin/bash
- 使用monitor查看tracker和storage服务状态
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
# 如果只是查看状态,可以不进入容器
docker exec -i fastdfs /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
如果显示是Active,则表示正常
3. 随便上传一张图片到宿主机所挂载的目录下,然后上传
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /home/fastdfs/test.png
测试是否可以正常访问
.
.
.
写在最后:
附-所有修改好的配置文件
附-打包好的镜像
- 百度网盘(提取码: rj84)
- 阿里云盘(提取码:a99n)
阿里云盘暂不支持分享压缩包,这里分享的是exe自解压程序,下载后双击、然后选择解压目录即可获取镜像包