docker 安装 FastDFS
1.查找Docker Hub上的redis镜像
docker search fastdfs
2.拉取镜像
docker pull delron/fastdfs
3.查看镜像
docker images
4.使用docker镜像构建tracker容器(跟踪服务器,起到调度的作用)
docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs -v /etc/localtime:/etc/localtime delron/fastdfs tracker
5.使用docker镜像构建storage容器(存储服务器,提供容量和备份服务)
docker run -dti --network=host --name storage -e TRACKER_SERVER=192.168.56.1:22122 -v /var/fdfs/storage:/var/fdfs -v /etc/localtime:/etc/localtime delron/fastdfs storage
TRACKER_SERVER=本机的ip地址:22122 本机ip地址不要使用127.0.0.1
进入storage容器,到storage的配置文件中配置http访问的端口,配置文件在/etc/fdfs目录下的storage.conf
默认端口是8888,也可以不进行更改。
如果重启后无法启动的会,可能是报下面错误了,手动创建 vi /var/fdfs/logs/storaged.log 文件即可
tail: cannot open ‘/var/fdfs/logs/storaged.log’ for reading: No such file or directory
6.配置nginx
进入storage,配置nginx,在/usr/local/nginx目录下,修改nginx.conf文件,默认配置不修改也可以
7.测试上传文件
7.1手动测试
将一张照片(test.png)放置在/var/fdfs/storage目录下,进入storage容器,进入/var/fdfs目录,运行下面命令
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf test.png
此时将该图片已上传至文件系统,并在执行该语句后返回图片存储的uri:
通过url访问http://ip:8888/group1/M00/00/00/CgACD1z7SEuAXrIqAA1eBLGVLow043.png,即可查看到图片
7.2代码测试
7.2.1 创建maven工程,导入pom依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java -->
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
7.2.2 在classpath:config下创建fastdfs-client.properties文件
配置:
fastdfs.connect_timeout_in_seconds = 5 #http连接超时时间
fastdfs.network_timeout_in_seconds = 30 #tracker与storage网络通信超时时间
fastdfs.charset = UTF-8 #字符编码
fastdfs.tracker_servers = 192.168.145.131:22122 #tracker服务器地址,多个地址中间用英文逗号分隔
文件上传代码:
public void testUpload(){
try {
ClientGlobal.initByProperties("config/fastdfs-client.properties");
System.out.println("network_timeout="+ClientGlobal.g_network_timeout+"ms");
System.out.println("charset="+ClientGlobal.g_charset);
// 创建客户端
TrackerClient tc = new TrackerClient();
// 连接trackerserver
TrackerServer ts = tc.getConnection();
if(ts == null){
System.out.println("getConnection return null");
return;
}
// 获取一个storage server
StorageServer ss = tc.getStoreStorage(ts);
if(ss == null){
System.out.println("getStoreStorage return null");
}
//创建一个storage存储客户端
StorageClient1 sc1 = new StorageClient1(ts, ss);
String item = "F:\\浏览器下载\\4.jpg";
String fileid;
fileid = sc1.upload_file1(item, "jpg", null);
System.out.println(fileid);
}catch (Exception e){
e.printStackTrace();
}
}
文件下载代码:
public void testDownload(){
try {
//加载fastdfs-client.properties配置文件
ClientGlobal.initByProperties("/config/fastdfs-client.properties");
//定义TrackerClient,用于请求TrackerServer
TrackerClient trackerClient = new TrackerClient();
//连接tracker
TrackerServer trackerServer = trackerClient.getConnection();
//获取Stroage
StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
//创建stroageClient
StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
//下载文件
//文件id
String fileId = "group1/M00/00/00/rBoOH16BnMGAIS7SAAtiLusUdPs308.jpg";
byte[] bytes = storageClient1.download_file1(fileId);
//使用输出流保存文件
FileOutputStream fileOutputStream = new FileOutputStream(new File("d:/4.jpg"));
fileOutputStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
}
8.开放端口
firewall-cmd --zone=public --permanent --add-port=8888/tcp
firewall-cmd --zone=public --permanent --add-port=22122/tcp
firewall-cmd --zone=public --permanent --add-port=23000/tcp
重启防火墙
systemctl restart firewalld
9.开启启动容器
docker update --restart=always tracker
docker update --restart=always storage
10.常见问题
storage 无法启动
运行 docker container start storage 无法启动,进行如下操作即可:
可以删除/var/fdfs/storage/data目录下的fdfs_storaged.pid 文件,然后重新运行storage。