docker构建fastdfs镜像及使用说明

docker构建fastdfs镜像及使用说明

别null了 2,761 2022-08-30

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文件只是用于构建好的镜像使用时挂载目录
    image-1661841526295

  • 从fastdfs-nginx-module源码包中提取mod_fastdfs.conf
    image-1662286887324

  • 从nginx源码包中提取配置文件
    image-1661842003724

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;
    }
}

image-1662709404102

说明:group1 为 nginx 服务 FastDFS 的分组名称,M00 是 FastDFS 自动生成编号,对应 store_path0,如果 FastDFS 定义store_path1,这里就是 M01;配置支持 group0-group9,以及 M00-M99

3.编写 Dockerfile 和启动脚本

3.1 Dockerfile

由于 centos 已停止更新,centos7 也将在2024年停止维护。推荐使用 rockylinuxubuntu 进行构建

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 所在目录结构
image-1661845886099

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

启动前需将以下修改好的配置文件上传到宿主机
image-1661846324573

  • 参数说明:
    -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是否正常

  1. 进入容器
docker exec -it fastdfs /bin/bash
  1. 使用monitor查看tracker和storage服务状态
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

# 如果只是查看状态,可以不进入容器
docker exec -i fastdfs /usr/bin/fdfs_monitor /etc/fdfs/storage.conf

如果显示是Active,则表示正常
image-1661849583296
3. 随便上传一张图片到宿主机所挂载的目录下,然后上传

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /home/fastdfs/test.png

image-1661849741462

测试是否可以正常访问
image-1661849703797

.
.
.
写在最后:
附-所有修改好的配置文件

附-打包好的镜像


# Docker # FastDFS