容器化部署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件存儲服務。

FROM centos:7LABEL creator=tudou date="2024-06-02"ENV FASTDFS_PATH=/var/fastdfs \TZ=Asia/Shanghai \TRACKER_PORT= \STORAGE_PORT= \TRACKER_SERVER= \GROUP_NAME= #get all the dependences
RUN yum install -y git wget zip unzip gcc make \perl openssl openssl-devel pcre pcre-devel zlib zlib-devel libevent libevent-devel \&& yum clean all \&& mkdir -p ${FASTDFS_PATH}/filesRUN git clone --branch V1.0.36 --depth 1 https://github.com/happyfish100/libfastcommon.git ${FASTDFS_PATH}/libfastcommon \&& cd ${FASTDFS_PATH}/libfastcommon \&& ./make.sh \&& ./make.sh install \&& rm -rf ${FASTDFS_PATH}/libfastcommonRUN git clone --branch V5.11 --depth 1 https://github.com/happyfish100/fastdfs.git ${FASTDFS_PATH}/fastdfs \&& cd ${FASTDFS_PATH}/fastdfs  \&& ./make.sh \&& ./make.sh install \&& cp -r  conf/*.* /etc/fdfs/ \&& rm -rf ${FASTDFS_PATH}/fastdfs RUN git clone --branch V1.20 https://github.com/happyfish100/fastdfs-nginx-module.git /usr/local/fastdfs-nginx-module \&& cp /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so \&& sed -i "s@/usr/local/include@/usr/include/fastdfs /usr/include/fastcommon@g" /usr/local/fastdfs-nginx-module/src/config \&& cd ${FASTDFS_PATH} \&& wget https://nginx.org/download/nginx-1.18.0.tar.gz \&& tar -xzvf nginx-1.18.0.tar.gz \&& cd nginx-1.18.0 \&& ./configure --prefix=/usr/local/nginx --add-module=/usr/local/fastdfs-nginx-module/src \&& make \&& make install \&& cp /usr/local/fastdfs-nginx-module/src/mod_fastdfs.conf  /etc/fdfs/ \&& rm -rf ${FASTDFS_PATH}/nginx-1.18.0* WORKDIR ${FASTDFS_PATH}# 啟動腳本 start.sh
RUN cat > /usr/bin/start.sh <<-EOF
#!/bin/bashcd \$(dirname \$0)# start.sh trackerd 
# start.sh storaged# # 自定義環境變量初始化,若無自定義環境變量,則直接跳過使用配置文件的默認值
function init_config(){if [[ -n \${STORAGE_PORT} ]];thensed -i "s|^port=.*$|port=\${STORAGE_PORT}|g" /etc/fdfs/storage.conffiif [[ -n \${TRACKER_PORT} ]];thensed -i "s|^port=.*$|port=\${TRACKER_PORT}|g" /etc/fdfs/tracker.conffiif [[ -n \${GROUP_NAME} ]];thensed -i "s|group_name=.*$|group_name=\${GROUP_NAME}|g" /etc/fdfs/storage.confsed -i "s|group_name=.*$|group_name=\${GROUP_NAME}|g" /etc/fdfs/mod_fastdfs.confsed -i "s|url_have_group_name =.*$|url_have_group_name = true|g" /etc/fdfs/mod_fastdfs.conffiif [[ -n \${TRACKER_SERVER} ]];thensed -i "s|tracker_server=.*$|tracker_server=\${TRACKER_SERVER}|g" /etc/fdfs/storage.confsed -i "s|tracker_server=.*$|tracker_server=\${TRACKER_SERVER}|g" /etc/fdfs/client.confsed -i "s|tracker_server=.*$|tracker_server=\${TRACKER_SERVER}|g" /etc/fdfs/mod_fastdfs.conffised -i "s|base_path=.*$|base_path=\${FASTDFS_PATH}|g" /etc/fdfs/tracker.confsed -i "s|base_path=.*$|base_path=\${FASTDFS_PATH}|g" /etc/fdfs/storage.confsed -i "s|base_path=.*$|base_path=\${FASTDFS_PATH}|g" /etc/fdfs/client.confsed -i "s|base_path=.*$|base_path=\${FASTDFS_PATH}|g" /etc/fdfs/mod_fastdfs.conf
}init_configcase \$1 intrackerd)echo "start trackerd ..."fdfs_trackerd /etc/fdfs/tracker.conf start  && tail -f ${FASTDFS_PATH}/logs/trackerd.log;;storaged)sed -i "s|store_path0.*$|store_path0=\${FASTDFS_PATH}/files|g" /etc/fdfs/storage.confsed -i "s|store_path0.*$|store_path0=\${FASTDFS_PATH}/files|g" /etc/fdfs/mod_fastdfs.confecho "start storaged ..."fdfs_storaged /etc/fdfs/storage.conf start \&& /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf \&& tail -f ${FASTDFS_PATH}/logs/storaged.log;;*)echo "USAGE sh $0 [ trackerd|storaged ]"exit 1;;
esacEOF
# 啟動腳本 start.sh# 默認fastdfs端口
EXPOSE 22122 23000 8080 8888 80RUN chmod a+x /usr/bin/start.sh ENTRYPOINT ["/usr/bin/start.sh"]
CMD ["trackerd"]
#CMD ["storaged"]
# 構建 fdfs 應用鏡像# docker build -t fdfs:v1.0 -f dockerfile . --no-cachedocker build -t fdfs:v1.0 -f dockerfile . 

三、docker 啟動fdfs服務

# 容器啟動 trackerd 服務,并且自定義環境變量值,可不指定環境變量值docker run -itd --name trackerd -e TRACKER_PORT=22122 -e TRACKER_SERVER=192.168.159.132:22122 -p 22122:22122   fdfs:v1.0 trackerd# 容器啟動 storaged 服務,并且自定義環境變量值,可不指定環境變量值docker run -itd --name storage -e STORAGE_PORT=23000 -e TRACKER_SERVER=192.168.159.132:22122 -p 23000:23000   fdfs:v1.0 storaged

# 分別查看容器應用的日志docker logs trackerddocker logs storage

四、k8s部署fdfs服務

1、fdfs部署文件

?????????由于storage存儲是各自獨立的,所以要使用有狀態部署。tracker是透明無狀態的,可以使用無狀態負載deploy部署,也可以使用有狀態負載StatefulSet部署。
# kubectl apply -f fdfs.yaml -n fdfs# fdfs 配置文件
---
kind: ConfigMap
apiVersion: v1
metadata:name: fdfs-confignamespace: fdfsannotations:kubesphere.io/creator: admin
data:mod_fastdfs.conf: |-base_path=/var/fastdfstracker_server=tracker-svc:22122storage_server_port=23000group_name=group1url_have_group_name = truestore_path_count=1store_path0=/var/fastdfs/filesgroup_count = 1# 在末尾增加組的具體信息 [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/var/fastdfs/files[group2] group_name=group2 storage_server_port=23000 store_path_count=1 store_path0=/var/fastdfs/filesnginx.conf: |-user root;worker_processes  2;events {worker_connections  65535;use epoll;}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       80;server_name  localhost;charset utf-8;server_tokens off;location ~group[0-9]/M00 {root /var/fastdfs/files/data;ngx_fastdfs_module;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}}storage.conf: |-group_name=group1port=23000base_path=/var/fastdfsstore_path_count=1store_path0=/var/fastdfs/filestracker_server=tracker-svc:22122http.server_port=80tracker.conf: |-disabled=falseport=22122base_path=/var/fastdfshttp.server_port=80---# kubectl apply -f fdfs-trackerd.yaml -n fdfs
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: fdfs-trackerdname: fdfs-trackerdnamespace: fdfs
spec:replicas: 1selector:matchLabels:app: fdfs-trackerdstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: fdfs-trackerdspec:containers:- args:- trackerdcommand:- /usr/bin/start.shimage: swr.cn-south-1.myhuaweicloud.com/tudou/fastdfs:latestimagePullPolicy: IfNotPresentname: trackerdports:- containerPort: 22122name: http-0protocol: TCP- containerPort: 8080name: http-1protocol: TCPresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /etc/fdfs/tracker.confname: volume-b8e30ireadOnly: truesubPath: tracker.confdnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}serviceAccount: defaultserviceAccountName: defaultterminationGracePeriodSeconds: 30volumes:- configMap:defaultMode: 420name: fdfs-configname: volume-b8e30i
---
---
apiVersion: v1
kind: Service
metadata:labels:app: fdfs-trackerdname: fdfs-trackerdnamespace: fdfs
spec:ports:- name: port-1port: 22122protocol: TCPtargetPort: 22122- name: port-2port: 8080protocol: TCPtargetPort: 8080selector:app: fdfs-trackerdtype: ClusterIP
---# kubectl apply -f fdfs-storaged.yaml -n fdfs
---
apiVersion: apps/v1
kind: StatefulSet
metadata:labels:app: fdfs-storagedname: fdfs-storagednamespace: fdfs
spec:podManagementPolicy: OrderedReadyreplicas: 2revisionHistoryLimit: 10selector:matchLabels:app: fdfs-storagedserviceName: fdfs-storagedtemplate:metadata:labels:app: fdfs-storagedspec:containers:- args:- storagedcommand:- /usr/bin/start.shimage: swr.cn-south-1.myhuaweicloud.com/tudou/fastdfs:latestimagePullPolicy: IfNotPresentname: storageports:- containerPort: 23000name: http-0protocol: TCP- containerPort: 8888name: http-1protocol: TCP- containerPort: 80name: http-2protocol: TCPresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /etc/fdfs/storage.confname: volume-ssmj62readOnly: truesubPath: storage.conf- mountPath: /etc/fdfs/mod_fastdfs.confname: volume-zlknkzreadOnly: truesubPath: mod_fastdfs.conf- mountPath: /usr/local/nginx/conf/nginx.confname: volume-q4ylwbreadOnly: truesubPath: nginx.conf- mountPath: /var/fastdfsname: fdfs-storage-datadnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}serviceAccount: defaultserviceAccountName: defaultterminationGracePeriodSeconds: 30volumes:- configMap:defaultMode: 420name: fdfs-configname: volume-ssmj62- configMap:defaultMode: 420name: fdfs-configname: volume-zlknkz- configMap:defaultMode: 420name: fdfs-configname: volume-q4ylwbupdateStrategy:rollingUpdate:partition: 0type: RollingUpdatevolumeClaimTemplates:- apiVersion: v1kind: PersistentVolumeClaimmetadata:name: fdfs-storage-dataspec:accessModes:- ReadWriteOnceresources:requests:storage: 120GistorageClassName: localvolumeMode: Filesystem
---
---
apiVersion: v1
kind: Service
metadata:labels:app: fdfs-storagedname: fdfs-storagednamespace: fdfs
spec:clusterIP: NoneclusterIPs:- NoneinternalTrafficPolicy: ClusteripFamilies:- IPv4ipFamilyPolicy: SingleStackports:- name: http-0port: 23000protocol: TCPtargetPort: 23000- name: http-1port: 8888protocol: TCPtargetPort: 8888- name: http-2port: 80protocol: TCPtargetPort: 80selector:app: fdfs-storagedsessionAffinity: Nonetype: ClusterIP
---

五、外部服務訪問

? ? ? ? 當外部服務需要訪問fdfs時,需要將服務的 22122和服務的 80 端口暴露。可以將這兩個端口對應的服務創建NodePort類型的服務來實現端口暴露。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22173.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22173.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22173.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

速盾:cdn技術詳解

CDN&#xff08;Content Delivery Network&#xff0c;內容分發網絡&#xff09;是一種基于分布式架構的網絡技術&#xff0c;通過將內容緩存到離用戶較近的服務器上&#xff0c;從而提升網站的訪問速度和可靠性。本文將詳細介紹CDN技術的原理和工作流程。 CDN技術的原理是將網…

h5相機功能

h5相機功能 利用vant input file <template><div class"mb10"><divv-for"(item, index) in info.imgList":key"index"class"imgItem f32 mr20"click"preview(item, index)"><img :src"doFileUrl…

<sa8650>QCX Usecase 使用詳解—如何在管道中添加多個 IPE 實例

<sa8650>QCX Usecase 使用詳解—如何在管道中添加多個 IPE 實例 一、前言二、UsecaseSRV添加新格式三、更新usecase.xml四、定義 IPE 的新實例五、添加新鏈接六、QCarcam測試XML一、前言 本節說明在使用Usecase/Pipeline XML 中添加多個 IPE 實例所需的更改。以下示例解釋了…

使用Spring Boot和MybatisPlus的Java CRM客戶關系管理系統源碼

項目名稱&#xff1a;CRM客戶關系管理系統 功能模塊及描述&#xff1a; 一、待辦事項 今日需聯系客戶&#xff1a;顯示當日需跟進的客戶列表&#xff0c;支持查詢和篩選。 分配給我的線索&#xff1a;管理分配給用戶的線索&#xff0c;包括線索列表和查詢功能。 分配給我的客…

導彈研究中常用坐標系及坐標系之間的變換

在導彈飛行控制過程中&#xff0c;需要時刻掌握導彈的飛行狀態 &#xff08;速度、位置、姿態角等&#xff09;&#xff0c;這就有賴于描述導彈飛行狀態的坐標系。除了大地坐標系和地心大地直角坐標系外&#xff0c;導彈常用的坐標系還有很多&#xff0c;合理而恰當地選擇參考系…

golang調用外部程序包os/exec中的 Command和CommandContext 函數創建的Cmd對象的區別

在go語言中&#xff0c;我們可以通過os/exec包中的Command和CommandContext 函數創建對應的外部程序執行Cmd對象&#xff0c; 這2個函數創建的cmd命令執行對象是有區別的&#xff0c;CommandContext創建的對象可以攜帶上下文&#xff0c;這個主要用于我們通過cancel函數給對應的…

37【透視】兩點透視

1 兩點透視比較合適表現物體的結構 用兩點透視繪制比較小的、箱子之類的物體 2 一點透視和兩點透視的共存關系

【Binaryen】partiallyPrecompute函數梳理

在Binaryen中有一個優化名為Precompute&#xff0c;作用是進行一些提前計算&#xff0c;類似于LLVM中的常量折疊類似的操作。 涉及的提交文件在此。 首先放一下全部的代碼&#xff1a; // To partially precompute selects we walk up the stack from them, like this://// …

vs - vs2013/vs2019工程文件的區別

文章目錄 vs - vs2013/vs2019工程文件的區別概述筆記sln文件的區別VisualStudioVersion vcxproj文件的區別ToolsVersionPlatformToolset 備注更方便的方法END vs - vs2013/vs2019工程文件的區別 概述 為了避免安裝UCRT的問題&#xff0c;想將手頭的vs2019工程降級為vs2013工程…

VLM MobileVLM 部署筆記

目錄 模型是自動下載的 在1060顯卡上能跑 LLaMA Meta MobileVLM V2 MobileLLaMA-1.4B 調錯 開源項目地址&#xff1a; GitHub - Meituan-AutoML/MobileVLM: Strong and Open Vision Language Assistant for Mobile Devices 模型是自動下載的 路徑&#xff1a; C:\User…

解決Mac ~/.bash_profile 配置的環境變量重啟終端后失效問題

在Mac系統中&#xff0c;配置環境變量通常是在~/.bash_profile文件中進行。然而&#xff0c;有時會遇到配置的環境變量在重啟終端后失效的問題。 解決辦法&#xff1a; 在~/.zshrc文件最后或最前面&#xff0c;增加一行 source ~/.bash_profile

SARscape雷達圖像處理軟件簡介

合成孔徑雷達&#xff08;SAR&#xff09;擁有獨特的技術魅力和優勢&#xff0c;漸成為國際上的研究熱點之一&#xff0c;其應用領域越來越廣泛。SAR數據可以全天候對研究區域進行量測、分析以及獲取目標信息。高級雷達圖像處理工具SARscape&#xff0c;能讓您輕松將原始SAR數據…

Leetcode 第 131 場雙周賽題解

Leetcode 第 131 場雙周賽題解 Leetcode 第 131 場雙周賽題解題目1&#xff1a;3158. 求出出現兩次數字的 XOR 值思路代碼復雜度分析 題目2&#xff1a;3159. 查詢數組中元素的出現位置思路代碼復雜度分析 題目3&#xff1a;3160. 所有球里面不同顏色的數目思路代碼復雜度分析 …

AI 時代,產品經理該如何進化

前言 傳統的互聯網業務或者游戲業務&#xff0c;產品或者業務輸出需求&#xff0c;技術人員只需要指哪打哪就好了。而人工智能發展到當下這個尷尬的階段&#xff0c;仿佛它能干很多事&#xff0c;但是真把它往業務里擱就發現&#xff0c;這個叛逆的小東西不一定勝任的了這些有…

AI大模型學習筆記之四:生成式人工智能是如何工作的?

OpenAI 發布 ChatGPT 已經1年多了&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;也已經廣為人知&#xff0c;我們常常津津樂道于 ChatGPT 和 Claude 這樣的人工智能系統能夠神奇地生成文本與我們對話&#xff0c;并且能夠記憶上下文情境。 GPT-4多模態分析對話 Midj…

數字機頂盒、顯示器方案DCDC芯片OC5816 2A,18V同步降壓DC-DC

概述 OC5816 是一款 2A 的高集成度、高效率同步整流降壓轉換器。在一個相當寬的輸出電流負載范圍內&#xff0c;OC5816 可以高效工作。 OC5816 的兩種工作模式&#xff0c;固定頻率PWM 峰值電流控制和輕載 PFM 開關模式&#xff0c;允許系統高效工作在一個相當寬的輸出電流…

i 人 聊 天 手 冊(e人禁止入內)

在之前的讀書筆記-《蔡康永的說話之道》中&#xff0c;作者給大家分享了很多具體的要點&#xff0c;其更偏向于戰術層面&#xff0c;我更想要的是一個類似聊天手冊的東西&#xff0c;就讓我自己來總結下吧。 雖然在 MBTI 中&#xff0c;按照獲取能量的方式定義了 i 人、e 人&a…

【面試干貨】如何選擇MySQL數據庫存儲引擎(MyISAM 或 InnoDB)

【面試干貨】如何選擇MySQL數據庫存儲引擎(MyISAM 或 InnoDB&#xff09; &#x1f496;The Begin&#x1f496;點點關注&#xff0c;收藏不迷路&#x1f496; MySQL數據庫存儲引擎是一個 關鍵 的考慮因素。MySQL提供了多種存儲引擎&#xff0c;其中最常用的是 MyISAM 和 InnoD…

封裝一個頁面自適應方法

封裝一個頁面自適應方法 在 Vue 中&#xff0c;你可以封裝一個頁面自適應的方法來根據屏幕大小動態調整頁面的布局和樣式。以下是一個示例代碼&#xff1a; export const getPageSize () > {const { innerWidth, innerHeight } window;const width innerWidth > 192…

攻防世界---misc---a_good_idea

1、下載附件得到一張圖片&#xff0c;winhex分析&#xff0c;發現有壓縮包 2、在kali中用普通用戶對jpg進行binwalk 3、得到兩張圖片和一個文本&#xff0c;查看文本信息&#xff1a;提示試著找到像素的秘密 4、提到像素就想到了Stegsolve這個工具&#xff0c;將這兩張圖片用該…