1. 程式人生 > >使用docker搭建FastDFS檔案系統

使用docker搭建FastDFS檔案系統

1.首先下載FastDFS檔案系統的docker映象

查詢映象

[[email protected] /]# docker search fastdfs

在這裡插入圖片描述

安裝映象

[[email protected] ~]# docker pull season/fastdfs
[[email protected] ~]# docker images

在這裡插入圖片描述


2.使用docker映象構建tracker容器(跟蹤伺服器,起到排程的作用):


         關閉防火牆

[[email protected] /]# systemctl stop firewalld

         這裡的防火牆也要關

進入編輯模式:
[[email protected] /]# vi /etc/sysconfig/selinux

         將SELINUX的值改成disabled,如下:
在這裡插入圖片描述

改完配置後重啟

[[email protected] /]# reboot

建立tracker容器

[[email protected] /]# docker run -ti -d --name trakcer -v ~/tracker_data:/fastdfs/tracker/data --net=host season/fastdfs tracker

Tracker伺服器的埠預設是22122,你可以檢視是否啟用埠

[[email protected] /]# netstat -aon | grep 22122

3.使用docker映象構建storage容器(儲存伺服器,提供容量和備份服務):

docker run -tid --name storage -v ~/storage_data:/fastdfs/storage/data -v ~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.115.130:22122 -e GROUP_NAME=group1 season/fastdfs storage

4.此時兩個服務都以啟動,進行服務的配置。
進入storage容器,到storage的配置檔案中配置http訪問的埠,配置檔案在fdfs_conf目錄下的storage.conf。

[[email protected] /]# docker exec -it storage bash
[email protected]:/# cd fdfs_conf
[email protected]:/fdfs_conf# more storage.conf

在這裡插入圖片描述
往下拉,你會發現storage容器的ip不是你linux的ip,如下:
在這裡插入圖片描述
接下來,退出storage容器,並將配置檔案拷貝一份出來:

[[email protected] ~]# docker cp storage:/fdfs_conf/storage.conf ~/
[[email protected] ~]# vi ~/storage.conf

在這裡插入圖片描述
將修改後的配置檔案拷貝到storagee的配置目錄下:

[[email protected] ~]# docker cp ~/storage.conf storage:/fdfs_conf/

重新啟動storage容器

[[email protected] ~]# docker stop storage
[[email protected] ~]# docker start storage

檢視tracker容器和storage容器的關聯

[[email protected] ~]# docker exec -it storage bash
[email protected]:/# cd fdfs_conf
[email protected]:/fdfs_conf# fdfs_monitor storage.conf

在這裡插入圖片描述


5.在docker模擬客戶端上傳檔案到storage容器
開啟一個客戶端

[[email protected] 00]# docker run -tid --name fdfs_sh --net=host season/fastdfs sh

更改配置檔案,因為之前已經改過一次了,所以現在直接拷貝

[[email protected] 00]# docker cp ~/storage.conf  fdfs_sh:/fdfs_conf/

建立一個txt檔案

[[email protected] 00]# docker exec -it fdfs_sh bash
[email protected]:/# echo hello>a.txt

進入fdfs_conf目錄,並將檔案上傳到storage容器

[email protected]:/# cd fdfs_conf
[email protected]:/fdfs_conf# fdfs_upload_file storage.conf /a.txt

/a.txt:指要上傳的檔案


上傳之後,根據返回的路徑去找a.txt

在這裡插入圖片描述
退出去檢視上傳的txt檔案

[[email protected] ~]# cd ~/store_path/data/00/00
[[email protected] 00]# ls

在這裡插入圖片描述
檢視是否和輸入的值是否相同

[[email protected] 00]# more wKhzg1wGsieAL-3RAAAABncc3SA337.txt


                                                                                                        java程式碼上傳檔案演示

參考網址:https://github.com/luhuiguo/fastdfs-client
1.建立模組 SPRINGCLOUD_FASTDFS
在這裡插入圖片描述
2.加入依賴

<!-- 下載jar包的私人倉庫 -->
<repositories>
		<repository>
			<id>sn</id>
			<name>sn</name>
			<url>https://oss.sonatype.org/content/repositories/releases/</url>
		</repository>
</repositories> 
	
	<dependencies>
		<!-- 整合mysql -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<!-- mysql驅動 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<!-- 整合springmvc -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 連線fastdfs檔案系統 -->
		<dependency>
			<groupId>com.luhuiguo</groupId>
			<artifactId>fastdfs-spring-boot-starter</artifactId>
			<version>0.2.0</version>
		</dependency>
	</dependencies>

3.新增資原始檔 application.yml

server: 
  port: 8899
fdfs: 
# 連線Tracker伺服器超時時間
  connect-timeout: 10000
# storage伺服器響應的超時時間
  so-timeout: 3000
#  trakcer伺服器的數量
  tracker-list: 
   - 192.168.115.131:22122
spring: 
  datasource: 
    url: jdbc:mysql://localhost/m1dn
    password: ps123456
    username: root
    driver-class-name: com.mysql.jdbc.Driver
# 上傳檔案的最大的大小
  http: 
    multipart: 
      max-file-size: 10000000

4.模擬一個檔案上傳
     1.上傳(上傳到storage服務的同時,拷貝一份資料到資料庫裡)
              upload.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 
	上傳的方式是post
	enctype的格式必須是:multipart/form-data
 -->
	<form action="myUpload" method="post" enctype="multipart/form-data">
		檔案:<input type="file" name="myFile">
		<input type="submit" value="上傳">
	</form>
</body>
</html>

              建立一個UploadController.java (控制層)

@RestController
public class UploadController {
	
	@Autowired
	 private FastFileStorageClient storageClient;
	
	@Autowired
	JdbcTemplate jdbcTemplate;
	
	// MultipartFile是用來接收上傳的檔案
	// myFile的名字必須和上傳的表單的名字一樣
	@PostMapping("myUpload")
	public String upload(MultipartFile myFile) throws IOException {
		// myFile.getOriginalFilename():取到檔案的名字
		// FilenameUtils.getExtension(""):取到一個檔案的字尾名
		String extension = FilenameUtils.getExtension(myFile.getOriginalFilename());
		
		// group1:指storage伺服器的組名
		// myFile.getInputStream():指這個檔案中的輸入流
		// myFile.getSize():檔案的大小
		// 這一行是通過storageClient將檔案傳到storage容器
		StorePath uploadFile = storageClient.uploadFile("group1", myFile.getInputStream(), myFile.getSize(), extension);

		// 上傳資料庫
		String sql = "insert into file(filename,groupname,filepath) values(?,?,?)";
		jdbcTemplate.update(sql, myFile.getOriginalFilename(), uploadFile.getGroup(), uploadFile.getPath());
		
		// 返回它在storage容器的的路徑
		return uploadFile.getFullPath();
	}
}

我的資料庫
在這裡插入圖片描述
瀏覽器上傳檔案
在這裡插入圖片描述
點選上傳後
在這裡插入圖片描述
進入docker檢視

[[email protected] ~]# cd store_path/data/00/00

在這裡插入圖片描述


    2.下載(根據資料庫裡面的id確定storage伺服器中下載的檔案)
              download.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 這裡傳資料庫裡的id -->
<a href="fdownload/4">下載</a>
</body>
</html>

控制層

@GetMapping("/fdownload/{id}")
	public void download(@PathVariable String id, HttpServletResponse response) throws IOException {

		List query = jdbcTemplate.query("select * from file where fileid=" + id, new ColumnMapRowMapper());
		Map map = (Map) query.get(0);
		String filename = URLEncoder.encode(map.get("filename").toString(), "utf-8"); // 解決中文檔名下載後亂碼的問題
		// 告訴瀏覽器 下載的檔名
		response.setHeader("Content-Disposition", "attachment; filename=" + filename + "");
		String groupName = map.get("groupName").toString();
		String filepath = map.get("filepath").toString();
		// 將檔案的內容輸出到瀏覽器 fastdfs
		byte[] downloadFile = storageClient.downloadFile(groupName, filepath);
		response.getOutputStream().write(downloadFile);
	}