### 创建镜像

参考：
https://github.com/qbanxiaoli/fastdfs/blob/master/Dockerfile
https://github.com/ygqygq2/fastdfs-nginx/blob/master/Dockerfile

# docker build -t lyj/fastdfs:6.09-alpine .
# docker save  a3f007114480 -o  /data/docker_images/lyj-fastdfs-6.09-alpine.tar
# docker load -i /data/docker_images/lyj-fastdfs-6.09-alpine.tar && docker tag  a3f007114480  lyj/fastdfs:6.09-alpine

# docker build -t lyj/fastdfs:6.08-alpine .
# docker save  646a2c0265ca -o  /data/docker_images/lyj-fastdfs-6.08-alpine.tar
# docker load -i /data/docker_images/lyj-fastdfs-6.08-alpine.tar && docker tag  646a2c0265ca  lyj/fastdfs:6.08-alpine

备注：可以使用centos基础镜像。

### 一、tracker 部署

实现互备，两台tracker就够了，生产环境中注意更换端口

>[danger]推荐使用 setting_conf.sh.sh 来设置配置文件的参数，打开改脚本，修改tracker\storage的主要参数

```bash
1、创建宿主机挂载目录
# mkdir -p /data/docker/fastdfs/tracker/{conf,data}   #conf为tracker配置文件目录，data为tracker基础数据存储目录

2、tracker 配置文件
+ 我挂载的配置文件目录，将部署操作说明书\fastdfs-conf\conf中的所有配置文件上传到服务器，tracker只用到tracker.conf和storage_ids.conf，其他文件不用管。

+ 使用 ID 取代 ip，作为storage server的标识，强烈建议使用此方式，例如方便今后的迁移。use_storage_id = false 改为true， 并在storage_ids.conf填写所有storage的id、所属组名，ip

+ 为了安全，可限定连接到此tracker的ip 范围，默认是allow_hosts = *

+ reserved_storage_space storage为系统其他应用留的空间，可以用绝对值（10 G或10240 M）或者百分比（V4开始支持百分比方式），网友说“最小阀值不要设置2%(有坑），设置5%可以”。
  ## 同组中只要有一台服务器达到这个标准了，就不能上传文件了
  ## no unit for byte(B) 不加单位默认是byte，例如2G=2147483648byte，reserved_storage_space = 2147483648byte
  ## 经实践6.08版本配置百分比可以；绝对值不加单位默认byte可以；绝对值加单位报错（v6.0.9中修复了） ERROR - file: shared_func.c, line: 2449, unkown byte unit:  MB, input string: 10240 MB 
  ## 预留空间配置为绝对值，数值和单位之间不能有空格。

...请阅读参数说明，调优其他参数

3、启动tracker容器
# docker run -d --net=host  --restart=always --name=tracker  \
-v /etc/localtime:/etc/localtime \
-v /data/docker/fastdfs/tracker/data:/data/fastdfs_data \
-v /data/docker/fastdfs/tracker/conf:/etc/fdfs \
-d lyj/fastdfs:6.09-alpine tracker


docker run -d --net=host  --restart=always --name=ttmp  \
-d lyj/fastdfs:6.09-alpine tracker

4、防火墙中打开tracker端口（默认的22122），生产环境中注意更换端口
# firewall-cmd --zone=public --add-port=22122/tcp --permanent
# firewall-cmd --reload

```

>去除注释和空行：egrep -v "#|^$" /data/docker/fastdfs/tracker/conf/fdfs/tracker.conf >/data/docker/fastdfs/tracker/conf/fdfs/tracker.conf.bak

### 二、storage 部署

+ fastdfs 约定：`同组内的storage server端口必须一致，建议挂载存储目录个数、路径要相同`

+ 为了互相备份，一个group内有两台storage即可

+ fastdfs 镜像 已封装了 nginx\fastdfs扩展模块 作为web服务，向外提供http文件访问

```bash
1、创建宿主机挂载目录
# mkdir -p /data/docker/fastdfs/storage/{conf,metadata,nginx_conf,nginx_conf.d}     #conf存放storge配置文件，metadata为storage基础数据
# mkdir -p /data/docker/fastdfs/upload/{path0,path1,path2,path3} #存储上传的文件,当有多块硬盘时，挂载到相应目录上即可 /data/fastdfs/upload/path0~n
```

>[danger]推荐使用 conf_setting.sh 来设置配置文件的参数

```bash
2、配置文件我挂载的是目录，因此将fastdfs-conf\的所有配置文件上传到服务器
用到的配置文件：storage.conf（storage配置文件），mod_fastdfs.conf（http文件访问的扩展模块的配置文件），nginx_conf/nginx.conf 与 nginx_conf.d/default.conf（nginx的配置文件）

配置文件需要调整的主要参数:
1. storage.conf
	group_name = group1                         # 指定storage所属组	
	base_path = /data/fastdfs_data         # Storage 基础数据和日志的存储目录	
	store_path_count = 1                      # 上传文件存放目录的个数
	store_path0 = /data/fastdfs/upload/path0  # 逐一配置 store_path_count 个路径，索引号基于 0。
	tracker_server = 172.16.100.90:22122       # tracker_server 的列表 ，有多个时，每个 tracker server 写一行
	allow_hosts = *                                          ## 允许连接本storage server的IP地址列表，为了安全期间，可以设置。
2. mod_fastdfs.conf
	tracker_server = 172.16.100.90:22122   # tracker服务器的IP地址以及端口号，多个时，每个tracker server写一行
	storage_server_port = 23000               # 本地storage的端口号，fastdfs约定"同组下的storage端口必须一致"
	group_name = group1                       # 本地storage的组名
	url_have_group_name = true            # url中是否有group名，默认是false，这个参数必须正确设置，否则文件不能被下载到
	store_path_count = 1                       # 本地storage的存储路径个数，必须和storage.conf中的配置一样
	store_path0 = /data/fastdfs/upload/path0         #本地storage的存储路径，必须和storage.conf中的配置一样

	## 如果在此存储服务器上支持多组时，有几组就设置几组。单组为0.
	## 通常一台机器运行一个storage就行，没有必要运行多个group的storage，因为stroage本身支持多存储目录的
                ## 使用docker 一个容器运行一个storage，此处就不用管了
	group_count = 0
	#[group1]
	#group_name=group1
	#storage_server_port=23000
	#store_path_count=1
	#store_path0=/data/fastdfs/upload/path0
```
```bash
3. http.conf     当需要开启token时，更改此文件
4. mime.types    资源的媒体类型，当文件的后缀在此文件中找不到时，需要添加。
5. client.conf   当需要使用fastdfs自带的客户端时，更改此文件
	tracker_server = 172.16.100.90:22122
6. nginx_conf.d/default.conf
        # 将http文件访问请求反向代理给扩展模块
        location ~/group[0-9]/ {
              ngx_fastdfs_module;
        }

#        location ~ /group1/M00 {
#              alias  /data/fastdfs/upload/path0;
#              ngx_fastdfs_module;
#        }


```
```bash
3、启动 storage 容器
# docker run -d --net=host --restart always --name=storage1_1 \
--privileged=true \
-v /etc/localtime:/etc/localtime \
-v /data/docker/fastdfs/storage/metadata:/data/fastdfs_data \
-v /data/docker/fastdfs/storage/conf:/etc/fdfs \
-v /data/docker/fastdfs/upload:/data/fastdfs/upload \
-v /data/docker/fastdfs/storage/nginx_conf/nginx.conf:/usr/local/nginx/conf/nginx.conf  \
-v /data/docker/fastdfs/storage/nginx_conf.d:/usr/local/nginx/conf.d  \
-d lyj/fastdfs:6.09-alpine storage

防火墙中打开storage服务端口（默认的23000，生产环境中注意更换端口），nginx的端口9088
# firewall-cmd --zone=public --add-port=23000/tcp --permanent
# firewall-cmd --zone=public --add-port=9088/tcp --permanent
# firewall-cmd --reload

4、 查看下集群运行状态
# docker exec -it storage1_1 sh
# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf

文件访问：http://172.16.100.90:9088/group1/M00/00/00/oYYBAGMi4zGAYNoxABY-esN9nNw502.jpg
``` 

文件上传demo《E:\gitplace\springboot-fastdfs》

5、nginx 日期定期切分和过期清理
生产环境中一般会在storage nginx前再加一层代理，我这里设置access_log off; 不记录日志了，调试时可以打开。

...

6、http 文件访问 负载入口高可用
nginx + keepalived
nginx反向代理storage文件的配置:《E:\工具箱\08. docker\3.docker_container_install\nginx\（lvs-webpage-api-oss）default.conf》

7、扩展，增加storage
  1. 若使用了storage_ids.conf，则需要修改所有的tracker的storage_ids.conf，填写一行 storage id，注意奥"要重启tracker才能生效"。
  2. storage 部署，见上面。

8、使用shell脚本调client 删除历史文件