最近小白需要使用fastDFS,就想用docker搭建一个DFS环境,方便快捷。又开始了踩坑之旅……
搜索一下现有docker镜像
[root@lixiaobai~]# docker search fastdfs
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
season/fastdfs FastDFS 49
luhuiguo/fastdfs FastDFS is an open source high performance d… 22 [OK]
morunchang/fastdfs A FastDFS image 15
ygqygq2/fastdfs-nginx 整合了nginx的fastdfs 11 [OK]
delron/fastdfs 6
使用第一个
docker pull season/fastdfs
创建相应目录结构
cd ~
mkdir fastDfsData
cd fastDfsData
mkdir storage
mkdir store_path
mkdir tracker
准备工作完毕 开始踩坑 以下是错误示范 先别忙着操作(没踩前不知道o(╥﹏╥)o)
启动tracker,storage
docker run -d --name fastdfs-tracker -p 22122:22122 -p 23000:23000 -v ~/fastDfsData/tracker:/fastdfs/tracker/data --net=host season/fastdfs tracker
docker run -d --name fastdfs-storage -v ~/fastDfsData/storage:/fastdfs/storage/data -v ~/fastDfsData/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER=your-ip:22122 season/fastdfs storage
坑一: --host=net 使用这个模式 -p 开放的端口会不起作用 容器启用默认开放的端口 22122
查看日志docker logs -f fastdfs-storage 连接不上 本机的 your_ip:22122
查了一些资料 有说 阿里云的IP没备案不能用……我用备过案的IP,此处省略1000次,依然不行。
坑二:于是放弃 不使用--net=host 如下
docker run -d --name fastdfs-tracker -p 22122:22122 -p 23000:23000 -v ~/fastDfsData/tracker:/fastdfs/tracker/data season/fastdfs tracker
docker run -d --name fastdfs-storage -v ~/fastDfsData/storage:/fastdfs/storage/data -v ~/fastDfsData/store_path:/fastdfs/store_path -e TRACKER_SERVER=your_ip:22122 season/fastdfs storage
(如果你没听话照着做了要删现有的容器 此处省略 docker stop, docker rm镜像操作)
查看日志 docker logs -f fastdfs-storage 发现 连不上 your_ip:22122 这回试试 docker inspect fastdfs-storage
查看桥接模式下 分配的IP
把这个IP设置为配置文件的tracker_server 重启 发现storage连接成功。 总算好了
于是在本地用代码测试上传文件。失败。
本地机器 连不上 storage 端口23000的容器内网络。于是我把代码部署到阿里云 再测,可以上传成功。
但是本地上传不成功 难道到这里就放弃了吗……
不行!
反思一下:通过 这几次的测试,1.连不上storage,2.配上了容器桥接的ip地址连上了 却不能公网访问。
于是小白有个大胆的想法:存储23000端口 应该在storage上开放。有了下面的配置
这个是亲测成功的,可以尝试了!
docker run -d --name fastdfs-tracker -p 22122:22122 -v ~/fastDfsData/tracker:/fastdfs/tracker/data season/fastdfs tracker
docker run -d --name fastdfs-storage -p 23000:23000 -v ~/fastDfsData/storage:/fastdfs/storage/data -v ~/fastDfsData/store_path:/fastdfs/store_path -e TRACKER_SERVER=your_ip:22122 season/fastdfs storage
(如果你又没听话照着做了要删现有的容器 此处省略 docker stop, docker rm镜像操作)
这次发现不用把storage改成桥接的IP地址 直接用公网地址 也能连接成功了 本地代码测试 文件可以正常上传。
查看日志 连接成功 激动 ^.^
INFO - file: tracker_client_thread.c, line: 308, successfully connect to tracker server your_ip:22122, as a tracker client
文章末尾:假设你会编写代码 测试文件上传,如果不会我也不会贴代码。^_^
但是可以给点建议:使用Spring Initializr 创建一个带web组件的项目 加入 dfs依赖
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>fastdfs-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
配置yml文件
fdfs:
connect-timeout: 10000
tracker-list: your_ip:22122
so-timeout: 3000
spring:
servlet:
multipart:
max-file-size: 10485760
测试代码
@Autowired
private FastFileStorageClient storageClient;
@PostMapping("/test")
public String upload(@RequestParam("file") MultipartFile file) throws IOException {
String extension = FilenameUtils.getExtension(file.getOriginalFilename());
StorePath sp = storageClient.uploadFile("group1",file.getInputStream(),file.getSize(),extension);
System.out.println(sp.getGroup());
System.out.println(sp.getPath());
}
页面
<form method="post" enctype="multipart/form-data" action="test">
文件<input type="file" name="file">
<input type="submit" value="上传">
</form>
好了,小白踩坑不定期,欢迎下次收看。探索路上,一起前行……
O(∩_∩)O~