1.修改hosts

将文件服务器的IP映射到自定义域名,因为Storage Server的配置文件storage.confTacker Server的配置文件client.conf都需要去配置Tracker Server所在的服务器地址。加入Tarcker Server所在服务器的IP发生变化,就只需要修改所有服务器上的/etc/hosts即可。

192.168.110.133是我宿主机的IP,www.quincy-fastdfs.com是我自定义的域名。接下来将会将这个IP域名的映射添加到所有提供服务的节点(例如所有的Tracker ServerStorage Server节点)以及需要访问服务的节点(例如虚拟机外的物理主机)所在服务器(容器)内的hosts映射表上。

所有容器在创建时必须使用--add-host参数指定自定义的域名与IP之间的映射。若在容器启动后修改/etc/hosts,仅本次启动有效,重启就还原。

到达容器内的的TCP包的源地址都是docker0网桥的IP(即127.0.0.1),当Storage Server注册到Tracker Server时就会出现问题,因为Tracker Server会根据TCP的表头数据中的源地址确认Storage Server的IP,所以在宿主机增加NAT的转发规则

# 在宿主机上查看IP
ifconifg

# 在宿主机上修改hosts
sudo vim /etc/hosts

# 添加路由规则
# 172.17.0.3位Tracker Server所在容器的IP
# 192.168.110.133位宿主机的IP
# 当Tracker Server搭建在真是的物理机上无需添加一下规则
# 有多少台Storage Server就需要添加多少条以下规则,只需要改变终点IP,源IP都是Docker所在宿主机的IP
# 当宿主机IP发生变化时,也需要更重新改路由规则
sudo iptables -t nat -A POSTROUTING -p tcp -m tcp -d 172.17.0.3 --dport 22122 -j SNAT --to 192.168.110.133

iptables –[A|I 链] [-i|o 网络接口] [-p 协议] [-s 来源ip/网域] [-d 目标ip/网域] –j[ACCEPT|DROP]

参数作用
-P设置默认策略:iptables -P INPUT (DROP|ACCEPT)
-F清空规则链
-L查看规则链
-A在规则链的末尾加入新规则
-I num在规则链的头部加入新规则
-D num删除某一条规则
-s匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
-d匹配目标地址
-i 网卡名称匹配从这块网卡流入的数据
-o 网卡名称匹配从这块网卡流出的数据
-p匹配协议,如tcp,udp,icmp
–dport num匹配目标端口号
–sport num匹配来源端口号

img

img

参考链接:
https://www.zsythink.net/archives/1199/

​https://www.cnblogs.com/whych/p/9147900.html

http://www.choupangxia.com/2020/07/23/docker-fastdfs-storage-ip/

https://blog.csdn.net/chj_1224365967/article/details/109206131

# 需要访问的服务的节点
# Window的shosts所在目录
C:\Windows\System32\drivers\etc\hosts
# Linux的hosts所在目录
/etc/hosts

image-20220403124002063

2.在宿主机上创建FastDFS存放数据的挂载目录

挂载目录的目的时候方便宿主机以挂载目录为中介访问容器内的文件。

在FastDFS容器创建成功后

  • trackerstorage会根据在base_pathtrackerbase_path默认容器路径为/fastdfs/trackerstoragebase_path默认路径为/fastdfs/storage)的目录下自动创建datalogs两个目录。data用于存储分组信息和存储服务列表,logs用于存储日志文件。
  • storage的配置文件storage.conf中可以通过配置base_path0storagebase_path0默认路径为/fastdfs/store_path)指定storage具体文件的存储路径,否则base_path0将会直接使用base_path的存储路径做为具体文件的存储路径。

需要注意的是,容器挂载到宿主机的目录下的数据不会随着容器的删除而删除,因为这部分数据已经做了持久化,若需要删除需要手动rm -rf

sudo rm -rf /usr/local/server/
# 以下创建的三个目录均在宿主机上,通过docker挂载的方式将对应容器内的指定目录映射到以下三个目录上
sudo \
mkdir -p /usr/local/server/fastdfs/tracker \
mkdir -p /usr/local/server/fastdfs/storage \
mkdir -p /usr/local/server/fastdfs/store_path \
mkdir -p /usr/local/server/fastdfs/nginx
# (base_path的目录结构)以tacker server为例
${base_path}
  |__data
  |   |__storage_groups.dat:存储分组信息
  |   |__storage_servers.dat:存储服务器列表
  |__logs
  |   |__trackerd.log: tracker server 日志文件

3.创建tracker容器(跟踪服务器容器)

镜像采用season/fastdfs:1.2 不要用lastest, 因为lastest不包含nginx服务,其他fasdfs镜像均没有season的精简。

season/fastdfs:1.2知识代表fastdfs这个镜像文件的版本是1.2,并非说明FastDFSV1.2版本。

所有容器在创建时必须使用--add-host参数指定自定义的域名与IP之间的映射。若在容器启动后修改/etc/hosts,仅本次启动有效,重启就还原。

**nginx.conflisten 80端口值是要与/etc/fdfs/storage.conf 中的http.server_port=80 相对应。**如果/etc/fdfs/storage.conf 中的http.server_port改成其它端口,则需要将两者统一。

sudo docker run \
-id \
--name tracker \
-p 22122:22122 \
--restart=always \
--net bridge \
--add-host www.quincy-fastdfs.com:192.168.110.133  \
-v /usr/local/server/fastdfs/tracker:/fastdfs/tracker \
-v /etc/localtime:/etc/localtime \
season/fastdfs:1.2 tracker

image-20220403134820895

# 进入tracker容器
sudo docker exec -it tracker bash

#查看FastDFS版本
fdfs_test

# 退出tracker容器
exit

image-20220403162416886

4.创建storage容器(存储服务器容器)

sudo docker run \
-id \
--name storage \
-p 23000:23000 \
--restart=always \
--net bridge \
--add-host www.quincy-fastdfs.com:192.168.110.133  \
-v /usr/local/server/fastdfs/storage:/fastdfs/storage \
-v /usr/local/server/fastdfs/store_path:/fastdfs/store_path \
-v /etc/localtime:/etc/localtime \
-e GROUP_NAME="group1" \
-e TRACKER_SERVER="www.quincy-fastdfs.com:22122" \
season/fastdfs:1.2 storage

配置文件storage.conf默认将数据保存在容器内的base_path0=/fastdfs/store_path/的路径下,如果base_path0的值为空,则默认将存储数据保存在base_path=/fastdfs/storage

(选做)如果需要更改数据存储(区别data目录存储的分组信息和存储服务列表,这里说的数据存储是指用户上传的文件数据)路径,只需要修改base_path0,随后重启trackerstorage即可。

(选做)切记修改配置文件成功后,要先清除storage默认初始化的数据目录/fastdfs/store_path,然后在容器内手动创建base_path0,最后**分别进入trackerstorage的终端重启服务。**如果只重启storage,而tracker关于storage的配置文件没有刷新,可能会出现找不到storage的数据存储目录的情况。

(选做)storage重启后理论上会根据新的配置文件在新设置的base_path0目录下重新mkdir存储数据的两级目录(每级目录中默认创建256个子目录)。如果storage的日志没有输出这部分的内容,就算服务都启动成功,在tracker的客户端中上传文件大概率会出错。

这里我采用保持默认的base_path0=/fastdfs/store_path/data存放storage的存储上传文件的数据,所以选做步骤并没有经过验证

5.修改client.conf配置文件

# 进入tracker节点终端
sudo docker exec -it tracker bash

# 在容器中将tracker下的client.conf复制到挂载目录下
cp /etc/fdfs/client.conf /fastdfs/tracker/

# 退出容器
exit

# 在宿主机中修改配置文件client.conf(增加Tracker Server的地址和端口)
sudo vim /usr/local/server/fastdfs/tracker/client.conf

# 再次从宿主机中进入容器终端
sudo docker exec -it tracker bash

# 在容器中将处于挂载目录下的配置文件client.conf拷贝并覆盖/etc/fdfs/client.conf下的配置文件
mv -f /fastdfs/tracker/client.conf /etc/fdfs/client.conf

# 在容器中输出日志文件,检查是否成功修改文件
cat /etc/fdfs/client.conf

# 返回宿主机
exit

# 如果前面没有添加路由规则则需要执行该步骤,否则可以跳过
# 添加路由规则
# 到达容器内的的TCP包的源地址都是docker0网桥的IP(即127.0.0.1),当Storage Server注册到Tracker Server时就会出现问题,因为Tracker Server会根据TCP的表头数据中的源地址确认Storage Server的IP,所以在宿主机中增加NAT的转发规则
sudo iptables -t nat -A POSTROUTING -p tcp -m tcp -d 172.17.0.3 --dport 22122 -j SNAT --to 192.168.110.133

# 再次从宿主机中进入容器终端
sudo docker exec -it tracker bash

# 重新启动连接客户端
fdfs_monitor /etc/fdfs/client.conf

image-20220403163811051

[2022-04-03 18:08:14] DEBUG - base_path=/fastdfs/client, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0

server_count=1, server_index=0

tracker server is 192.168.110.133:22122

group count: 1

Group 1:
group name = group1
disk total space = 10015 MB
disk free space = 2947 MB
trunk free space = 0 MB
storage server count = 1
active server count = 1
storage server port = 23000
storage HTTP port = 8888
store path count = 1
subdir count per path = 256
current write server index = 0
current trunk file id = 0

        Storage 1:
                id = 192.168.110.133
                ip_addr = 192.168.110.133 (www.quincy-fastdfs.com)  ACTIVE
                http domain = 
                version = 4.08
                join time = 2022-04-03 18:05:38
                up time = 2022-04-03 18:05:38
                total storage = 10015 MB
                free storage = 2947 MB
                upload priority = 10
                store_path_count = 1
                subdir_count_per_path = 256
                storage_port = 23000
                storage_http_port = 8888
                current_write_path = 0
                source storage id= 
                if_trunk_server= 0
                total_upload_count = 0
                success_upload_count = 0
                total_append_count = 0
                success_append_count = 0
                total_modify_count = 0
                success_modify_count = 0
                total_truncate_count = 0
                success_truncate_count = 0
                total_set_meta_count = 0
                success_set_meta_count = 0
                total_delete_count = 0
                success_delete_count = 0
                total_download_count = 0
                success_download_count = 0
                total_get_meta_count = 0
                success_get_meta_count = 0
                total_create_link_count = 0
                success_create_link_count = 0
                total_delete_link_count = 0
                success_delete_link_count = 0
                total_upload_bytes = 0
                success_upload_bytes = 0
                total_append_bytes = 0
                success_append_bytes = 0
                total_modify_bytes = 0
                success_modify_bytes = 0
                stotal_download_bytes = 0
                success_download_bytes = 0
                total_sync_in_bytes = 0
                success_sync_in_bytes = 0
                total_sync_out_bytes = 0
                success_sync_out_bytes = 0
                total_file_open_count = 0
                success_file_open_count = 0
                total_file_read_count = 0
                success_file_read_count = 0
                total_file_write_count = 0
                success_file_write_count = 0
                last_heart_beat_time = 2022-04-03 18:08:12
                last_source_update = 1970-01-01 08:00:00
                last_sync_update = 1970-01-01 08:00:00
                last_synced_timestamp = 1970-01-01 08:00:00 

6.文件上传测试

# 从宿主机中进入tracker终端
sudo docker exec -it tracker bash

# 在根目录创建一个txt文件
echo "niceyoo" > niceyoo.txt

# 通过 fdfs_upload_file 命令将 niceyoo.txt 文件上传至服务器
fdfs_upload_file /etc/fdfs/client.conf niceyoo.txt

文件上传成功,在FastDFS分布式文件系统中的路径位group1/M00/00/00/rBEABGJJcquAC3VRAAAACBfWGpM964.txt,如下图。

image-20220403181132243

7.配置Nginx

FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储, 但是同组存储服务器之间需要进行文件复制, 有同步延迟的问题。

假设 Tracker 服务器将文件上传到了 192.168.51.128,上传成功后文件 ID已经返回给客户端。

此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.51.129,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.51.129 上取文件,就会出现文件无法访问的错误。

而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。

参考链接:https://www.cnblogs.com/chiangchou/p/fastdfs.html#_label1_5

season/fastdfs:1.2已经包含了nginx,并且nginx已经添加了fastdfs-nginx-module-master/src模块。

# 本质上tracker、storage和fastdfs-nginx都是同一份镜像文件,知识创建不同容器时使用不同的配置文件,以提供相应的服务,所以可以直接在storage中查看已经安装的nginx版本
# 在storage中查看nginx版本
nginx -V

image-20220403183558070

# 在宿主机中登录超级用户
su root

# 从宿主机中进入容器终端
sudo docker exec -it storage bash

# 将容器storage中的nginx.conf配置文件复制到挂载目录
cp /etc/nginx/conf/nginx.conf /fastdfs/storage

# 退出容器
exit

# 在宿主机中查看挂载目录
ls -l /usr/local/server/fastdfs/storage

# 在宿主机中修改配置文件nginx.conf
sudo vim /usr/local/server/fastdfs/storage/nginx.conf

# 在宿主机中将配置文件nginx.conf移动到nginx挂载目录
sudo mv -f /usr/local/server/fastdfs/storage/nginx.conf /usr/local/server/fastdfs/nginx

在80端口下添加ngx_fastdfs_module模块。

location / {
            root  /fastdfs/store_path/data;
            ngx_fastdfs_module;
        }

image-20220403203232201

创建nginx容器,将主机的/usr/local/server/fastdfs/nginx挂载到nginx容器上。

注意需要替换Tracker Server的IP地址。

必须将storage的文件存储目录所对应的宿主机挂载目录(这里storage用于真正存储文件数据的宿主机目录为/usr/local/server/fastdfs/store_path)也同时挂载到fastdfs_nginx容器内部的/fastdfs/store_path之下,只有这样fastdfs-nginx-module 在重定向文件链接到源服务器取文件时才能够真正访问storage的文件存储目录。

既要区分fastdfs_nginx容器与storage容器的/fastdfs/store_path从容器的角度是独立的,又要认清两者都挂载到宿主机同一个目录之下,所以本质上访问的是同一份数据文件。

在创建fastdfs_nginx容器时必须将宿主机配置好的nginx.conf文件直接挂载到容器内部的/etc/nginx/conf/nginx.conf文件之上,只有这样容器启动的时候使用的配置文件才是经过修改的。

sudo docker run \
-id \
--name fastdfs_nginx \
-p 8888:80 \
--restart=always \
--net bridge \
--add-host www.quincy-fastdfs.com:192.168.110.133  \
-v /usr/local/server/fastdfs/store_path:/fastdfs/store_path \
-v /usr/local/server/fastdfs/nginx/nginx.conf:/etc/nginx/conf/nginx.conf \
-v /etc/localtime:/etc/localtime \
-e TRACKER_SERVER="www.quincy-fastdfs.com:22122"  \
season/fastdfs:1.2 nginx

需要注意的是,在根目录下的/nginx-1.8.0是nginx的源码,不是已经编译并安装到Ubantu系统上的组件。进过编译并安装的nginx组件位于/etc/nginx目录下。

image-20220403000653722

nginx -t # 验证配置文件;无法验证其它文件的情况
nginx -s reload # 重新加载;可以重启其它文件启动的情况
nginx -s stop # 快速停止
nginx -s quit # 正常停止
nginx -V # 查看版本
nginx -c conf/web01.conf # 使用另一个配置文件

image-20220331021623272

8.尝试使用Web访问上传的文件

# 在同一局域网的浏览器中访问
http://192.168.110.133:8888/group1/M00/00/00/rBEABGJJcquAC3VRAAAACBfWGpM964.txt

# 在没有配置好hosts映射的终端中访问
curl -i http://192.168.110.133:8888/group1/M00/00/00/rBEABGJJcquAC3VRAAAACBfWGpM964.txt

# 在配置好hosts映射的终端中访问
curl -i http://www.quincy-fastdfs.com:8888/group1/M00/00/00/rBEABGJJcquAC3VRAAAACBfWGpM964.txt

image-20220403211405955

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐