• 容器化部署fastdfs文件存储


    目录

    一、软件信息

    二、构建fastdfs镜像

    三、docker 启动fdfs服务

    四、k8s部署fdfs服务

    1、fdfs部署文件

    五、外部服务访问

    一、软件信息

    1. fastdfs版本:fastdfs:V5.11

    2. libfastcommon版本: V1.0.36

    3. fastdfs-nginx-module版本:V1.20

    4. nginx版本:1.18.0

    二、构建fastdfs镜像

            为了减少操作了文件数,我是直接把启动文件和dockerfile写一起了,也可以把启动脚本 start.sh 单独于dockerfile;然后在构建镜像的时候把启动文件 COPY 到镜像里。

            以下是包括了启动文件为一起的dockerfile构建文件。直接使用该dockerfile即可完成镜像构建。然后按照自己的实际情况来修改配置文件和挂载,即可完成容器化运行fastdfs件存储服务。

    1. FROM centos:7
    2. LABEL creator=tudou date="2024-06-02"
    3. ENV FASTDFS_PATH=/var/fastdfs \
    4. TZ=Asia/Shanghai \
    5. TRACKER_PORT= \
    6. STORAGE_PORT= \
    7. TRACKER_SERVER= \
    8. GROUP_NAME=
    9. #get all the dependences
    10. RUN yum install -y git wget zip unzip gcc make \
    11. perl openssl openssl-devel pcre pcre-devel zlib zlib-devel libevent libevent-devel \
    12. && yum clean all \
    13. && mkdir -p ${FASTDFS_PATH}/files
    14. RUN git clone --branch V1.0.36 --depth 1 https://github.com/happyfish100/libfastcommon.git ${FASTDFS_PATH}/libfastcommon \
    15. && cd ${FASTDFS_PATH}/libfastcommon \
    16. && ./make.sh \
    17. && ./make.sh install \
    18. && rm -rf ${FASTDFS_PATH}/libfastcommon
    19. RUN git clone --branch V5.11 --depth 1 https://github.com/happyfish100/fastdfs.git ${FASTDFS_PATH}/fastdfs \
    20. && cd ${FASTDFS_PATH}/fastdfs \
    21. && ./make.sh \
    22. && ./make.sh install \
    23. && cp -r conf/*.* /etc/fdfs/ \
    24. && rm -rf ${FASTDFS_PATH}/fastdfs
    25. RUN git clone --branch V1.20 https://github.com/happyfish100/fastdfs-nginx-module.git /usr/local/fastdfs-nginx-module \
    26. && cp /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so \
    27. && sed -i "s@/usr/local/include@/usr/include/fastdfs /usr/include/fastcommon@g" /usr/local/fastdfs-nginx-module/src/config \
    28. && cd ${FASTDFS_PATH} \
    29. && wget https://nginx.org/download/nginx-1.18.0.tar.gz \
    30. && tar -xzvf nginx-1.18.0.tar.gz \
    31. && cd nginx-1.18.0 \
    32. && ./configure --prefix=/usr/local/nginx --add-module=/usr/local/fastdfs-nginx-module/src \
    33. && make \
    34. && make install \
    35. && cp /usr/local/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ \
    36. && rm -rf ${FASTDFS_PATH}/nginx-1.18.0*
    37. WORKDIR ${FASTDFS_PATH}
    38. # 启动脚本 start.sh
    39. RUN cat > /usr/bin/start.sh <<-EOF
    40. #!/bin/bash
    41. cd \$(dirname \$0)
    42. # start.sh trackerd
    43. # start.sh storaged
    44. # # 自定义环境变量初始化,若无自定义环境变量,则直接跳过使用配置文件的默认值
    45. function init_config(){
    46. if [[ -n \${STORAGE_PORT} ]];then
    47. sed -i "s|^port=.*$|port=\${STORAGE_PORT}|g" /etc/fdfs/storage.conf
    48. fi
    49. if [[ -n \${TRACKER_PORT} ]];then
    50. sed -i "s|^port=.*$|port=\${TRACKER_PORT}|g" /etc/fdfs/tracker.conf
    51. fi
    52. if [[ -n \${GROUP_NAME} ]];then
    53. sed -i "s|group_name=.*$|group_name=\${GROUP_NAME}|g" /etc/fdfs/storage.conf
    54. sed -i "s|group_name=.*$|group_name=\${GROUP_NAME}|g" /etc/fdfs/mod_fastdfs.conf
    55. sed -i "s|url_have_group_name =.*$|url_have_group_name = true|g" /etc/fdfs/mod_fastdfs.conf
    56. fi
    57. if [[ -n \${TRACKER_SERVER} ]];then
    58. sed -i "s|tracker_server=.*$|tracker_server=\${TRACKER_SERVER}|g" /etc/fdfs/storage.conf
    59. sed -i "s|tracker_server=.*$|tracker_server=\${TRACKER_SERVER}|g" /etc/fdfs/client.conf
    60. sed -i "s|tracker_server=.*$|tracker_server=\${TRACKER_SERVER}|g" /etc/fdfs/mod_fastdfs.conf
    61. fi
    62. sed -i "s|base_path=.*$|base_path=\${FASTDFS_PATH}|g" /etc/fdfs/tracker.conf
    63. sed -i "s|base_path=.*$|base_path=\${FASTDFS_PATH}|g" /etc/fdfs/storage.conf
    64. sed -i "s|base_path=.*$|base_path=\${FASTDFS_PATH}|g" /etc/fdfs/client.conf
    65. sed -i "s|base_path=.*$|base_path=\${FASTDFS_PATH}|g" /etc/fdfs/mod_fastdfs.conf
    66. }
    67. init_config
    68. case \$1 in
    69. trackerd)
    70. echo "start trackerd ..."
    71. fdfs_trackerd /etc/fdfs/tracker.conf start && tail -f ${FASTDFS_PATH}/logs/trackerd.log
    72. ;;
    73. storaged)
    74. sed -i "s|store_path0.*$|store_path0=\${FASTDFS_PATH}/files|g" /etc/fdfs/storage.conf
    75. sed -i "s|store_path0.*$|store_path0=\${FASTDFS_PATH}/files|g" /etc/fdfs/mod_fastdfs.conf
    76. echo "start storaged ..."
    77. fdfs_storaged /etc/fdfs/storage.conf start \
    78. && /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf \
    79. && tail -f ${FASTDFS_PATH}/logs/storaged.log
    80. ;;
    81. *)
    82. echo "USAGE sh $0 [ trackerd|storaged ]"
    83. exit 1
    84. ;;
    85. esac
    86. EOF
    87. # 启动脚本 start.sh
    88. # 默认fastdfs端口
    89. EXPOSE 22122 23000 8888 80
    90. RUN chmod a+x /usr/bin/start.sh
    91. ENTRYPOINT ["/usr/bin/start.sh"]
    92. CMD ["trackerd"]
    93. #CMD ["storaged"]
    1. # 构建 fdfs 应用镜像
    2. # docker build -t fdfs:v1.0 -f dockerfile . --no-cache
    3. docker build -t fdfs:v1.0 -f dockerfile .

    三、docker 启动fdfs服务

    1. # 容器启动 trackerd 服务,并且自定义环境变量值,可不指定环境变量值
    2. docker run -itd --name trackerd -e TRACKER_PORT=22122 -e TRACKER_SERVER=192.168.159.132:22122 -p 22122:22122 fdfs:v1.0 trackerd
    3. # 容器启动 storaged 服务,并且自定义环境变量值,可不指定环境变量值
    4. docker run -itd --name storage -e STORAGE_PORT=23000 -e TRACKER_SERVER=192.168.159.132:22122 -p 23000:23000 fdfs:v1.0 storaged

    1. # 分别查看容器应用的日志
    2. docker logs trackerd
    3. docker logs storage

    四、k8s部署fdfs服务

    1、配置文件

    1.  tracker服务需要修改的配置文件是:tracker.conf,其他文件默认但不能删。
    2. storage服务需要修改的配置文件有: storage.conf、mod_fastdfs.conf 以及安装在storage端的 nginx配置文件 nginx.conf。需要给storage的数据目录做软链接,要不然,有可能无法通过nginx访问 文件,其他配置保持默认即可,但不能删。
    3. client.conf 配置文件不是必须的,可放在任何服务端。
    1. # 配置文件
    2. ---
    3. kind: ConfigMap
    4. apiVersion: v1
    5. metadata:
    6. name: fdfs-config
    7. namespace: fdfs
    8. annotations:
    9. kubesphere.io/creator: admin
    10. kubesphere.io/description: client.conf 可以不挂载。
    11. data:
    12. client.conf: |-
    13. connect_timeout=30
    14. network_timeout=60
    15. base_path=/var/fastdfs
    16. tracker_server=tracker-svc:22122
    17. log_level=info
    18. use_connection_pool = false
    19. connection_pool_max_idle_time = 3600
    20. load_fdfs_parameters_from_tracker=false
    21. use_storage_id = false
    22. storage_ids_filename = storage_ids.conf
    23. http.tracker_server_port=8080
    24. mod_fastdfs.conf: |-
    25. connect_timeout=2
    26. network_timeout=30
    27. base_path=/var/fastdfs/files
    28. load_fdfs_parameters_from_tracker=true
    29. storage_sync_file_max_delay = 86400
    30. use_storage_id = false
    31. storage_ids_filename = storage_ids.conf
    32. tracker_server=tracker-svc:22122
    33. storage_server_port=23000
    34. group_name=group1
    35. url_have_group_name = true
    36. store_path_count=1
    37. store_path0=/var/fastdfs/files
    38. log_level=info
    39. log_filename=
    40. response_mode=proxy
    41. if_alias_prefix=
    42. flv_support = true
    43. flv_extension = flv
    44. group_count = 1
    45. [group1]
    46. group_name=group1
    47. storage_server_port=23000
    48. store_path_count=1
    49. store_path0=/var/fastdfs/files
    50. #[group2]
    51. #group_name=group2
    52. #storage_server_port=23000
    53. #store_path_count=2
    54. #store_path0=/var/fastdfs/files
    55. #store_path1=/var/fastdfs/files1
    56. nginx.conf: |
    57. user root;
    58. worker_processes 2;
    59. events {
    60. worker_connections 65535;
    61. use epoll;
    62. }
    63. http {
    64. include mime.types;
    65. default_type application/octet-stream;
    66. sendfile on;
    67. keepalive_timeout 65;
    68. charset utf-8;
    69. server_tokens off;
    70. server {
    71. listen 80;
    72. server_name localhost;
    73. location / {
    74. root html;
    75. index index.html index.htm;
    76. }
    77. error_page 500 502 503 504 /50x.html;
    78. location = /50x.html {
    79. root html;
    80. }
    81. }
    82. server {
    83. listen 8888;
    84. server_name localhost;
    85. location ~/group[1-2]/M00 {
    86. root /data/fastdfs/store/data;
    87. # storage 服务要创建软连接: ln -s /var/fastdfs/files/data /data/fastdfs/files/data/M00
    88. ngx_fastdfs_module;
    89. }
    90. error_page 500 502 503 504 /50x.html;
    91. location = /50x.html {
    92. root html;
    93. }
    94. }
    95. }
    96. storage.conf: |-
    97. disabled=false
    98. group_name=group1
    99. bind_addr=
    100. client_bind=true
    101. port=23000
    102. connect_timeout=30
    103. network_timeout=60
    104. heart_beat_interval=30
    105. stat_report_interval=60
    106. base_path=/var/fastdfs/files
    107. max_connections=256
    108. buff_size = 256KB
    109. accept_threads=1
    110. work_threads=4
    111. disk_rw_separated = true
    112. disk_reader_threads = 1
    113. disk_writer_threads = 1
    114. sync_wait_msec=50
    115. sync_interval=0
    116. sync_start_time=00:00
    117. sync_end_time=23:59
    118. write_mark_file_freq=500
    119. store_path_count=1
    120. store_path0=/var/fastdfs/files
    121. subdir_count_per_path=256
    122. tracker_server=tracker-svc:22122
    123. log_level=info
    124. run_by_group=
    125. run_by_user=
    126. allow_hosts=*
    127. file_distribute_path_mode=0
    128. file_distribute_rotate_count=100
    129. fsync_after_written_bytes=0
    130. sync_log_buff_interval=10
    131. sync_binlog_buff_interval=10
    132. sync_stat_file_interval=300
    133. thread_stack_size=512KB
    134. upload_priority=10
    135. if_alias_prefix=
    136. check_file_duplicate=0
    137. file_signature_method=hash
    138. key_namespace=FastDFS
    139. keep_alive=0
    140. use_access_log = false
    141. rotate_access_log = false
    142. access_log_rotate_time=00:00
    143. rotate_error_log = false
    144. error_log_rotate_time=00:00
    145. rotate_access_log_size = 0
    146. rotate_error_log_size = 0
    147. log_file_keep_days = 0
    148. file_sync_skip_invalid_record=false
    149. use_connection_pool = false
    150. connection_pool_max_idle_time = 3600
    151. http.domain_name=
    152. http.server_port=8888
    153. tracker.conf: |-
    154. disabled=false
    155. bind_addr=
    156. port=22122
    157. connect_timeout=30
    158. network_timeout=60
    159. base_path=/var/fastdfs
    160. max_connections=256
    161. accept_threads=1
    162. work_threads=4
    163. min_buff_size = 8KB
    164. max_buff_size = 128KB
    165. store_lookup=2
    166. store_group=group2
    167. store_server=0
    168. store_path=0
    169. download_server=0
    170. reserved_storage_space = 10%
    171. log_level=info
    172. run_by_group=
    173. run_by_user=
    174. allow_hosts=*
    175. sync_log_buff_interval = 10
    176. check_active_interval = 120
    177. thread_stack_size = 64KB
    178. storage_ip_changed_auto_adjust = true
    179. storage_sync_file_max_delay = 86400
    180. storage_sync_file_max_time = 300
    181. use_trunk_file = false
    182. slot_min_size = 256
    183. slot_max_size = 16MB
    184. trunk_file_size = 64MB
    185. trunk_create_file_advance = false
    186. trunk_create_file_time_base = 02:00
    187. trunk_create_file_interval = 86400
    188. trunk_create_file_space_threshold = 20G
    189. trunk_init_check_occupying = false
    190. trunk_init_reload_from_binlog = false
    191. trunk_compress_binlog_min_interval = 0
    192. use_storage_id = false
    193. storage_ids_filename = storage_ids.conf
    194. id_type_in_filename = ip
    195. store_slave_file_use_link = false
    196. rotate_error_log = false
    197. error_log_rotate_time=00:00
    198. rotate_error_log_size = 0
    199. log_file_keep_days = 0
    200. use_connection_pool = false
    201. connection_pool_max_idle_time = 3600
    202. http.server_port=8080
    203. http.check_alive_interval=30
    204. http.check_alive_type=tcp
    205. http.check_alive_uri=/status.html
    206. ---

    2、fdfs部署文件

             由于storage存储是各自独立的,所以要使用有状态部署。tracker是透明无状态的,可以使用无状态负载deploy部署,也可以使用有状态负载StatefulSet部署。
    1. # kubectl apply -f fdfs-trackerd.yaml -n fdfs
    2. ---
    3. apiVersion: apps/v1
    4. kind: Deployment
    5. metadata:
    6. labels:
    7. app: fdfs-trackerd
    8. name: fdfs-trackerd
    9. namespace: fdfs
    10. spec:
    11. replicas: 1
    12. selector:
    13. matchLabels:
    14. app: fdfs-trackerd
    15. strategy:
    16. rollingUpdate:
    17. maxSurge: 25%
    18. maxUnavailable: 25%
    19. type: RollingUpdate
    20. template:
    21. metadata:
    22. labels:
    23. app: fdfs-trackerd
    24. spec:
    25. containers:
    26. - args:
    27. - trackerd
    28. command:
    29. - /usr/bin/start.sh
    30. image: swr.cn-south-1.myhuaweicloud.com/tudou/fastdfs:latest
    31. imagePullPolicy: IfNotPresent
    32. name: trackerd
    33. ports:
    34. - containerPort: 22122
    35. name: http-0
    36. protocol: TCP
    37. - containerPort: 8080
    38. name: http-1
    39. protocol: TCP
    40. resources: {}
    41. terminationMessagePath: /dev/termination-log
    42. terminationMessagePolicy: File
    43. volumeMounts:
    44. - mountPath: /etc/fdfs/tracker.conf
    45. name: volume-b8e30i
    46. readOnly: true
    47. subPath: tracker.conf
    48. dnsPolicy: ClusterFirst
    49. restartPolicy: Always
    50. schedulerName: default-scheduler
    51. securityContext: {}
    52. serviceAccount: default
    53. serviceAccountName: default
    54. terminationGracePeriodSeconds: 30
    55. volumes:
    56. - configMap:
    57. defaultMode: 420
    58. name: fdfs-config
    59. name: volume-b8e30i
    60. ---
    61. ---
    62. apiVersion: v1
    63. kind: Service
    64. metadata:
    65. labels:
    66. app: fdfs-trackerd
    67. name: fdfs-trackerd
    68. namespace: fdfs
    69. spec:
    70. ports:
    71. - name: port-1
    72. port: 22122
    73. protocol: TCP
    74. targetPort: 22122
    75. - name: port-2
    76. port: 8080
    77. protocol: TCP
    78. targetPort: 8080
    79. selector:
    80. app: fdfs-trackerd
    81. type: ClusterIP
    82. ---
    83. # kubectl apply -f fdfs-storaged.yaml -n fdfs
    84. ---
    85. apiVersion: apps/v1
    86. kind: StatefulSet
    87. metadata:
    88. labels:
    89. app: fdfs-storaged
    90. name: fdfs-storaged
    91. namespace: fdfs
    92. spec:
    93. podManagementPolicy: OrderedReady
    94. replicas: 2
    95. revisionHistoryLimit: 10
    96. selector:
    97. matchLabels:
    98. app: fdfs-storaged
    99. serviceName: fdfs-storaged
    100. template:
    101. metadata:
    102. labels:
    103. app: fdfs-storaged
    104. spec:
    105. containers:
    106. - args:
    107. - storaged
    108. command:
    109. - /usr/bin/start.sh
    110. image: swr.cn-south-1.myhuaweicloud.com/tudou/fastdfs:latest
    111. imagePullPolicy: IfNotPresent
    112. name: storage
    113. ports:
    114. - containerPort: 23000
    115. name: http-0
    116. protocol: TCP
    117. - containerPort: 8888
    118. name: http-1
    119. protocol: TCP
    120. - containerPort: 80
    121. name: http-2
    122. protocol: TCP
    123. resources: {}
    124. terminationMessagePath: /dev/termination-log
    125. terminationMessagePolicy: File
    126. volumeMounts:
    127. - mountPath: /etc/fdfs/storage.conf
    128. name: volume-ssmj62
    129. readOnly: true
    130. subPath: storage.conf
    131. - mountPath: /etc/fdfs/mod_fastdfs.conf
    132. name: volume-zlknkz
    133. readOnly: true
    134. subPath: mod_fastdfs.conf
    135. - mountPath: /usr/local/nginx/conf/nginx.conf
    136. name: volume-q4ylwb
    137. readOnly: true
    138. subPath: nginx.conf
    139. - mountPath: /var/fastdfs
    140. name: fdfs-storage-data
    141. dnsPolicy: ClusterFirst
    142. restartPolicy: Always
    143. schedulerName: default-scheduler
    144. securityContext: {}
    145. serviceAccount: default
    146. serviceAccountName: default
    147. terminationGracePeriodSeconds: 30
    148. volumes:
    149. - configMap:
    150. defaultMode: 420
    151. name: fdfs-config
    152. name: volume-ssmj62
    153. - configMap:
    154. defaultMode: 420
    155. name: fdfs-config
    156. name: volume-zlknkz
    157. - configMap:
    158. defaultMode: 420
    159. name: fdfs-config
    160. name: volume-q4ylwb
    161. updateStrategy:
    162. rollingUpdate:
    163. partition: 0
    164. type: RollingUpdate
    165. volumeClaimTemplates:
    166. - apiVersion: v1
    167. kind: PersistentVolumeClaim
    168. metadata:
    169. name: fdfs-storage-data
    170. spec:
    171. accessModes:
    172. - ReadWriteOnce
    173. resources:
    174. requests:
    175. storage: 120Gi
    176. storageClassName: local
    177. volumeMode: Filesystem
    178. ---
    179. ---
    180. apiVersion: v1
    181. kind: Service
    182. metadata:
    183. labels:
    184. app: fdfs-storaged
    185. name: fdfs-storaged
    186. namespace: fdfs
    187. spec:
    188. clusterIP: None
    189. clusterIPs:
    190. - None
    191. internalTrafficPolicy: Cluster
    192. ipFamilies:
    193. - IPv4
    194. ipFamilyPolicy: SingleStack
    195. ports:
    196. - name: http-0
    197. port: 23000
    198. protocol: TCP
    199. targetPort: 23000
    200. - name: http-1
    201. port: 8888
    202. protocol: TCP
    203. targetPort: 8888
    204. - name: http-2
    205. port: 80
    206. protocol: TCP
    207. targetPort: 80
    208. selector:
    209. app: fdfs-storaged
    210. sessionAffinity: None
    211. type: ClusterIP
    212. ---

    五、外部服务访问

            当外部服务需要访问fdfs时,需要将服务的 22122和服务的 80 端口暴露。可以将这两个端口对应的服务创建NodePort类型的服务来实现端口暴露。

  • 相关阅读:
    聚焦AI丨车企如何用AI服务争夺市场话语权
    齐博X1-栏目的终极方法get_sort
    【sgDragMoveTile】自定义组件:拖拽瓦片图、地图、大图,滚动条对应同步滚动
    什么是无人机倾斜摄影?无人机倾斜摄影测量测绘中的应用有哪些?
    Linux find
    【SA8295P 源码分析 (三)】108 - QNX AIS Camera 如何在各个环节 Dump 摄像头Raw Data(含代码追踪分析全过程)
    在进行自动化测试,遇到验证码的问题,怎么办?
    c++ 泛型编程之类模板
    selenium.chrome怎么写扩展拦截或转发请求?
    哈希函数与哈希一致性
  • 原文地址:https://blog.csdn.net/weixin_44770684/article/details/139421414