2026-01-09
Java开发
0

目录

Docker 部署 FastDFS 实现第三方访问:问题排查与完整方案总结
Docker部署FastDFS供第三方访问 - 问题排查与完整方案总结
一、 部署目标
二、 环境准备与核心前提
1. 依赖环境
2. 必须开放的端口(防火墙+云安全组)
端口开放命令(CentOS为例)
云服务器安全组配置
3. 本地目录持久化(避免容器重启数据丢失)
三、 基础部署步骤
1. 拉取FastDFS镜像
2. 启动Tracker容器(主机网络模式)
3. 启动Storage容器(核心:指定宿主机IP)
4. 基础验证(容器运行状态)
四、 第三方访问核心问题与解决方案
问题1:宿主机8888端口被占用
现象
解决方案:端口映射(容器内8888→宿主机新端口)
现象
根源
解决方案:修改Storage配置,强制返回宿主机IP
现象
根源
解决方案:强制Storage向Tracker注册宿主机IP
1. 验证Storage节点注册(关键)
正常输出(关键信息)
2. 测试文件上传
正常输出
3. 测试文件访问
正常结果
六、 第三方客户端对接配置
1. Java客户端fdfs_client.conf配置
2. 访问URL拼接规则
七、 常见运维命令
八、 核心总结

Docker 部署 FastDFS 实现第三方访问:问题排查与完整方案总结

Docker部署FastDFS供第三方访问 - 问题排查与完整方案总结

一、 部署目标

在已安装Docker的服务器上部署FastDFS(Tracker+Storage+Nginx),实现第三方服务器可正常上传文件+访问文件,核心解决Docker容器内网IP导致的第三方连接失败问题。

二、 环境准备与核心前提

1. 依赖环境

  • 服务器:Linux系统(CentOS/Ubuntu),已安装Docker

  • 镜像:delron/fastdfs(集成Tracker/Storage/Nginx,无需单独部署)

2. 必须开放的端口(防火墙+云安全组)

端口用途备注
22122Tracker通信端口第三方上传文件时连接
23000Storage通信端口第三方与Storage传输文件
8888Nginx文件访问端口第三方通过HTTP访问文件

端口开放命令(CentOS为例)

Bash
# 开放端口 firewall-cmd --add-port=22122/tcp --permanent firewall-cmd --add-port=23000/tcp --permanent firewall-cmd --add-port=8888/tcp --permanent # 重载规则 firewall-cmd --reload # 验证端口 firewall-cmd --list-ports

云服务器安全组配置

添加入站规则,放行22122/23000/8888端口,来源设置为0.0.0.0/0(允许所有第三方访问)。

3. 本地目录持久化(避免容器重启数据丢失)

Bash
# 创建Tracker和Storage数据目录 mkdir -p /tmp/fastdfs/tracker mkdir -p /tmp/fastdfs/storage # 设置权限 chmod -R 777 /tmp/fastdfs

三、 基础部署步骤

1. 拉取FastDFS镜像

Bash
docker pull delron/fastdfs

2. 启动Tracker容器(主机网络模式)

Bash
docker run -d \ --name fastdfs-tracker \ --net=host \ -v /tmp/fastdfs/tracker:/var/fdfs \ delron/fastdfs tracker

3. 启动Storage容器(核心:指定宿主机IP)

关键参数-e IP=<宿主机IP> 强制Storage向Tracker注册宿主机IP,而非容器内网IP。

Bash
# 替换 <你的宿主机IP> 为实际IP(如192.168.7.48) docker run -d \ --name fastdfs-storage \ --net=host \ -v /tmp/fastdfs/storage:/var/fdfs \ -e TRACKER_SERVER=<你的宿主机IP>:22122 \ -e GROUP_NAME=group1 \ -e IP=<你的宿主机IP> \ delron/fastdfs storage

4. 基础验证(容器运行状态)

Bash
# 查看容器是否正常运行 docker ps # 正常输出应包含 fastdfs-tracker 和 fastdfs-storage,状态为Up

四、 第三方访问核心问题与解决方案

问题1:宿主机8888端口被占用

现象

启动Storage容器时提示端口占用,或Nginx无法正常启动。

解决方案:端口映射(容器内8888→宿主机新端口)

  1. 停止并删除原有Storage容器

    Bash
    docker stop fastdfs-storage docker rm fastdfs-storage
  2. 重新启动Storage容器(映射到新端口,如8889)

    Bash
    docker run -d \ --name fastdfs-storage \ -p 23000:23000 \ -p 8889:8888 \ # 宿主机8889端口映射到容器内8888 -v /tmp/fastdfs/storage:/var/fdfs \ -e TRACKER_SERVER=<你的宿主机IP>:22122 \ -e GROUP_NAME=group1 \ -e IP=<你的宿主机IP> \ delron/fastdfs storage
  3. 开放新端口(如8889)

    Bash
    firewall-cmd --add-port=8889/tcp --permanent firewall-cmd --reload

问题2:java.net.UnknownHostException: 172.17.0.2

现象

第三方访问文件时,URL中包含Docker容器内网IP(172.17.0.2),无法解析。

根源

Storage生成的文件访问URL使用了容器内网IP,而非宿主机IP。

解决方案:修改Storage配置,强制返回宿主机IP

  1. 进入Storage容器

    Bash
    docker exec -it fastdfs-storage /bin/bash
  2. 编辑storage.conf配置文件

    Bash
    vi /etc/fdfs/storage.conf
  3. 添加/修改以下配置

    TOML
    # 绑定宿主机IP bind_addr = <你的宿主机IP> # 不绑定客户端IP(避免使用容器IP) client_bind = 0 # HTTP访问域名(宿主机IP) http.domain = <你的宿主机IP> # HTTP服务端口(容器内Nginx端口,默认8888) http.server_port = 8888 # Tracker地址 tracker_server = <你的宿主机IP>:22122
  4. 编辑Nginx配置(确保监听所有地址)

    Bash
    vi /usr/local/nginx/conf/nginx.conf

    修改server块配置

    Nginx
    server { listen 8888; server_name <你的宿主机IP>; # 填宿主机IP或_ location ~/group[0-9]/ { ngx_fastdfs_module; } error_page 404 /404.html; }
  5. 重启容器内服务

    Bash
    # 重启Storage服务 /etc/init.d/fdfs_storaged restart # 重启Nginx /usr/local/nginx/sbin/nginx -s stop /usr/local/nginx/sbin/nginx
  6. 退出并重启Storage容器

    Bash
    exit docker restart fastdfs-storage

问题3:can't create connection to/172.17.0.2:23000

现象

第三方上传文件时,无法连接到Storage的23000端口,Tracker返回的是容器内网IP。

根源

Storage向Tracker注册的是容器内网IP,Tracker给第三方返回了错误的连接地址。

解决方案:强制Storage向Tracker注册宿主机IP

  1. 方案1:修改启动脚本(推荐)

    • 进入Storage容器,编辑启动脚本

      Bash
      docker exec -it fastdfs-storage /bin/bash vi /usr/bin/start.sh
    • 替换脚本中Storage配置部分,强制指定IP

      Bash
      # 替换原有if [ -n "$IP" ]代码块为以下内容 sed -i "s|^tracker_server=.*$|tracker_server=<你的宿主机IP>:22122|g" /etc/fdfs/storage.conf sed -i "s|^bind_addr=.*$|bind_addr=<你的宿主机IP>|g" /etc/fdfs/storage.conf sed -i "s|^client_bind=.*$|client_bind=0|g" /etc/fdfs/storage.conf sed -i "s|^http.domain=.*$|http.domain=<你的宿主机IP>|g" /etc/fdfs/storage.conf
    • 保存退出,重启容器

      Bash
      exit docker restart fastdfs-storage
  2. 方案2:构建自定义镜像(兜底方案)

    • 创建Dockerfile

      Bash
      mkdir -p ~/fastdfs && cd ~/fastdfs vi Dockerfile
    • 写入镜像构建内容

      Dockerfile
      FROM delron/fastdfs:latest # 强制修改storage.conf RUN sed -i "s|^bind_addr=.*$|bind_addr=<你的宿主机IP>|g" /etc/fdfs/storage.conf && \ sed -i "s|^client_bind=.*$|client_bind=0|g" /etc/fdfs/storage.conf && \ sed -i "s|^tracker_server=.*$|tracker_server=<你的宿主机IP>:22122|g" /etc/fdfs/storage.conf && \ sed -i "s|^http.domain=.*$|http.domain=<你的宿主机IP>|g" /etc/fdfs/storage.conf CMD ["/usr/bin/start.sh"]
    • 构建并启动镜像

      Bash
      docker build -t my-fastdfs:latest . docker stop fastdfs-storage && docker rm fastdfs-storage docker run -d \ --name fastdfs-storage \ --net=host \ -v /tmp/fastdfs/storage:/var/fdfs \ my-fastdfs:latest storage

五、 验证部署结果

1. 验证Storage节点注册(关键)

进入Tracker容器,执行监控命令,确认Storage节点IP为宿主机IP:

Bash
# 进入Tracker容器 docker exec -it fastdfs-tracker /bin/bash # 执行监控命令 fdfs_monitor /etc/fdfs/client.conf

正常输出(关键信息)

Plain
Group 1: group name = group1 storage server count = 1 Storage 1: id = <你的宿主机IP> ip_addr = <你的宿主机IP> # 必须是宿主机IP,非172.17.0.2 port = 23000 status = ACTIVE # 状态为ACTIVE

2. 测试文件上传

进入Storage容器,上传测试文件:

Bash
docker exec -it fastdfs-storage /bin/bash fdfs_upload_file /etc/fdfs/client.conf /usr/local/nginx/html/index.html

正常输出

Plain
group1/M00/00/00/wKhLg12xQ4SAXGQAAADo4hBZ8Xo399.html

3. 测试文件访问

拼接访问URL,在浏览器/第三方服务器执行curl命令:

Bash
# 端口替换为实际映射端口(如8888或8889) curl http://<你的宿主机IP>:8889/group1/M00/00/00/wKhLg12xQ4SAXGQAAADo4hBZ8Xo399.html

正常结果

返回HTML页面内容,说明文件访问正常。

六、 第三方客户端对接配置

1. Java客户端fdfs_client.conf配置

TOML
# Tracker服务器地址(宿主机IP) tracker_server = <你的宿主机IP>:22122 # 连接超时时间 connect_timeout = 30 # 网络超时时间 network_timeout = 60 # 字符集 charset = UTF-8 # HTTP访问端口(映射后的端口,如8889) http.tracker_http_port = 8889 http.anti_steal_token = no http.secret_key = FastDFS1234567890

2. 访问URL拼接规则

Plain
http://<宿主机IP>:<映射端口>/<文件上传返回路径>

七、 常见运维命令

Bash
# 重启容器 docker restart fastdfs-tracker fastdfs-storage # 查看容器日志 docker logs -f fastdfs-tracker docker logs -f fastdfs-storage # 停止容器 docker stop fastdfs-tracker fastdfs-storage # 删除容器(数据已持久化,可安全删除) docker rm fastdfs-tracker fastdfs-storage

八、 核心总结

  1. 端口必开:22122/23000/8888(或映射端口)必须在防火墙+安全组放行;

  2. IP必对:Storage必须向Tracker注册宿主机IP,禁止使用容器内网IP(172.17.x.x);

  3. 配置核心:修改storage.confbind_addrhttp.domain为宿主机IP,确保URL和连接地址正确;

  4. 验证关键:通过fdfs_monitor确认Storage节点IP和状态,通过curl验证文件访问。

(注:文档部分内容可能由 AI 生成)

本文作者:wucc

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-SA 许可协议。转载请注明出处!