在已安装Docker的服务器上部署FastDFS(Tracker+Storage+Nginx),实现第三方服务器可正常上传文件+访问文件,核心解决Docker容器内网IP导致的第三方连接失败问题。
服务器:Linux系统(CentOS/Ubuntu),已安装Docker
镜像:delron/fastdfs(集成Tracker/Storage/Nginx,无需单独部署)
| 端口 | 用途 | 备注 |
|---|---|---|
| 22122 | Tracker通信端口 | 第三方上传文件时连接 |
| 23000 | Storage通信端口 | 第三方与Storage传输文件 |
| 8888 | Nginx文件访问端口 | 第三方通过HTTP访问文件 |
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(允许所有第三方访问)。
Bash
# 创建Tracker和Storage数据目录
mkdir -p /tmp/fastdfs/tracker
mkdir -p /tmp/fastdfs/storage
# 设置权限
chmod -R 777 /tmp/fastdfs
Bashdocker pull delron/fastdfs
Bashdocker run -d \ --name fastdfs-tracker \ --net=host \ -v /tmp/fastdfs/tracker:/var/fdfs \ delron/fastdfs tracker
关键参数:-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
Bash
# 查看容器是否正常运行
docker ps
# 正常输出应包含 fastdfs-tracker 和 fastdfs-storage,状态为Up
启动Storage容器时提示端口占用,或Nginx无法正常启动。
停止并删除原有Storage容器
Bash
docker stop fastdfs-storage
docker rm fastdfs-storage
重新启动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
开放新端口(如8889)
Bashfirewall-cmd --add-port=8889/tcp --permanent firewall-cmd --reload
java.net.UnknownHostException: 172.17.0.2第三方访问文件时,URL中包含Docker容器内网IP(172.17.0.2),无法解析。
Storage生成的文件访问URL使用了容器内网IP,而非宿主机IP。
进入Storage容器
Bash
docker exec -it fastdfs-storage /bin/bash
编辑storage.conf配置文件
Bashvi /etc/fdfs/storage.conf
添加/修改以下配置
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
编辑Nginx配置(确保监听所有地址)
Bashvi /usr/local/nginx/conf/nginx.conf
修改server块配置
Nginxserver { listen 8888; server_name <你的宿主机IP>; # 填宿主机IP或_ location ~/group[0-9]/ { ngx_fastdfs_module; } error_page 404 /404.html; }
重启容器内服务
Bash
# 重启Storage服务
/etc/init.d/fdfs_storaged restart
# 重启Nginx
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
退出并重启Storage容器
Bash
exit
docker restart fastdfs-storage
can't create connection to/172.17.0.2:23000第三方上传文件时,无法连接到Storage的23000端口,Tracker返回的是容器内网IP。
Storage向Tracker注册的是容器内网IP,Tracker给第三方返回了错误的连接地址。
方案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:构建自定义镜像(兜底方案)
创建Dockerfile
Bash
mkdir -p ~/fastdfs && cd ~/fastdfs
vi Dockerfile
写入镜像构建内容
DockerfileFROM 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
进入Tracker容器,执行监控命令,确认Storage节点IP为宿主机IP:
Bash
# 进入Tracker容器
docker exec -it fastdfs-tracker /bin/bash
# 执行监控命令
fdfs_monitor /etc/fdfs/client.conf
PlainGroup 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
进入Storage容器,上传测试文件:
Bash
docker exec -it fastdfs-storage /bin/bash
fdfs_upload_file /etc/fdfs/client.conf /usr/local/nginx/html/index.html
Plaingroup1/M00/00/00/wKhLg12xQ4SAXGQAAADo4hBZ8Xo399.html
拼接访问URL,在浏览器/第三方服务器执行curl命令:
Bash
# 端口替换为实际映射端口(如8888或8889)
curl http://<你的宿主机IP>:8889/group1/M00/00/00/wKhLg12xQ4SAXGQAAADo4hBZ8Xo399.html
返回HTML页面内容,说明文件访问正常。
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
Plainhttp://<宿主机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
端口必开:22122/23000/8888(或映射端口)必须在防火墙+安全组放行;
IP必对:Storage必须向Tracker注册宿主机IP,禁止使用容器内网IP(172.17.x.x);
配置核心:修改storage.conf的bind_addr和http.domain为宿主机IP,确保URL和连接地址正确;
验证关键:通过fdfs_monitor确认Storage节点IP和状态,通过curl验证文件访问。
(注:文档部分内容可能由 AI 生成)
本文作者:wucc
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-SA 许可协议。转载请注明出处!