最近公司業務需求,須要搭建文件服務器,通過各類諮詢和搜索,決定使用FastDFS。那FastDFS有什麼優勢呢?linux
FastDFS是用c語言編寫的一款開源的分佈式文件系統。FastDFS爲互聯網量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集羣提供文件上傳、下載等服務。nginx
更詳細的你們能夠參考:來自ityouknow的文章: 點擊查看git
爲了更方便地集成到現有服務裏,咱們須要一個能夠一鍵運行的docker鏡像,可是網絡上找了不少,有的把libfastcommon分離了,有的配置繁瑣,都沒有很好整合或者不知足業務需求。所以,接下來咱們一步一步來寫這個dockerfile來實現一鍵運行。github
若是你比較懶,直接run下面的鏡像就能夠:docker
docker run -d annoak/fastdfs:latest \
-p 8888:8888 \
-p 22122:22122 \
-e TZ=Asia/Shanghai \
-v /data/fdfs:/var/local/fdfs \
--restart=always
複製代碼
若是須要自定義端口bash
docker run -d annoak/fastdfs:latest \
-p 8888:8888 \
-p 22122:22122 \
-e TZ=Asia/Shanghai \
-e NGINX_PORT=8888 \
-e FDFS_PORT=22122 \
-v /data/fdfs:/var/local/fdfs \
--restart=always
複製代碼
若是須要自定義HOST服務器
docker run -d annoak/fastdfs:latest \
-p 8888:8888 \
-p 22122:22122 \
-e TZ=Asia/Shanghai \
-e NET_VAR=eth0 \
-v /data/fdfs:/var/local/fdfs \
--restart=always
複製代碼
docker run -d annoak/fastdfs:latest \
-p 8888:8888 \
-p 22122:22122 \
-e TZ=Asia/Shanghai \
-e HOST_IP=xxx.xxx.xxx.xxx \
-v /data/fdfs:/var/local/fdfs \
--restart=always
複製代碼
若是不想映射端口直接使用宿主機網絡:網絡
docker run -d annoak/fastdfs:latest \
--net=host \
-e TZ=Asia/Shanghai \
-v /data/fdfs:/var/local/fdfs \
--restart=always
複製代碼
若是須要自定義nginx版本app
docker run -d annoak/fastdfs:latest \
--net=host \
-e TZ=Asia/Shanghai \
-e NGINX_VERSION=1.17.0 \
-v /data/fdfs:/var/local/fdfs \
--restart=always
複製代碼
若是你使用的是docker-compose負載均衡
services:
fastdfs:
image: annoak/fastdfs:latest
container_name: my-fastdfs
environment:
- TZ=Asia/Shanghai
- NGINX_PORT=8888
- FDFS_PORT=22122
- HOST_IP=192.168.198.107
- NET_VAR=eth0
volumes:
- /data/fdfs:/var/local/fdfs
#ports:# 若是用host網絡,無需映射
# - "8888:8888"
# - "22122:22122"
# 把root權限帶進去
privileged: true
network_mode: "host"
restart: always
複製代碼
若是你想知道它是怎麼來的,請繼續往下看:
第1步,固然是建立一個dockerfile文件,而後去看看咱們須要用的軟件版本。
依賴版本:libfastcommon和fastdfs的版本爲master分支,nginx默認1.17.0,你懂的。
具體版本查看:
libfastcommon: 點擊跳轉
fastdfs: 點擊跳轉
nginx: 點擊跳轉
第2步,咱們須要選擇一個環境,嗯,咱們選擇最小的Linux -> alpine,如今dockerfile是這樣的:
FROM alpine:3.7
複製代碼
# 工做目錄
ENV HOME=/root/fastdfs \
# nginx版本
NGINX_VERSION=1.17.0 \
# nginx端口默認值
NGINX_PORT=8888 \
# IP所在網絡默認值
NET_VAR=eth0 \
# fastdfs端口默認值
FDFS_PORT=22122
複製代碼
# 建立目錄
RUN mkdir -p ${HOME}
# 升級軟件包
RUN apk update
# 安裝必要的軟件,加上--virtual .mybuilds,
RUN apk add --no-cache --virtual .mybuilds \
bash \
gcc \
make \
linux-headers \
curl \
gnupg \
gd-dev \
pcre-dev \
zlib-dev \
libc-dev \
libxslt-dev \
openssl-dev \
geoip-dev
複製代碼
爲何要加--virtual .mybuilds,它是什麼? 當您安裝軟件包時,這些軟件包不會添加到全局軟件包中。並且能夠很容易地恢復。好比我須要gcc來編譯程序,可是一旦程序被編譯,我就再也不須要gcc了。
# 下載、安裝libfastcommon
RUN cd ${HOME}/ \
&& curl -fSL https://github.com/happyfish100/libfastcommon/archive/master.tar.gz -o fastcommon.tar.gz \
&& tar zxf fastcommon.tar.gz \
&& cd ${HOME}/libfastcommon-master/ \
&& ./make.sh \
&& ./make.sh install
複製代碼
# 下載、安裝fastdfs
RUN cd ${HOME}/ \
&& curl -fSL https://github.com/happyfish100/fastdfs/archive/master.tar.gz -o fastfs.tar.gz \
&& tar zxf fastfs.tar.gz \
&& cd ${HOME}/fastdfs-master/ \
&& ./make.sh \
&& ./make.sh install
複製代碼
# 配置fastdfs
RUN cd /etc/fdfs/ \
&& cp storage.conf.sample storage.conf \
&& sed -i "s|/home/yuqing/fastdfs|/var/local/fdfs/storage|g" /etc/fdfs/storage.conf \
&& cp tracker.conf.sample tracker.conf \
&& sed -i "s|/home/yuqing/fastdfs|/var/local/fdfs/tracker|g" /etc/fdfs/tracker.conf \
&& cp client.conf.sample client.conf \
&& sed -i "s|/home/yuqing/fastdfs|/var/local/fdfs/storage|g" /etc/fdfs/client.conf
複製代碼
# 下載nginx插件
RUN cd ${HOME}/ \
&& curl -fSL https://github.com/happyfish100/fastdfs-nginx-module/archive/master.tar.gz -o nginx-module.tar.gz \
&& tar zxf nginx-module.tar.gz
# 下載nginx
RUN cd ${HOME}/ \
&& curl -fSL http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz -o nginx-${NGINX_VERSION}.tar.gz \
&& tar zxf nginx-${NGINX_VERSION}.tar.gz
複製代碼
# 將nginx和fastdfs的nginx插件編譯
RUN cd ${HOME} \
&& chmod u+x ${HOME}/fastdfs-nginx-module-master/src/config \
&& cd nginx-${NGINX_VERSION} \
&& ./configure --add-module=${HOME}/fastdfs-nginx-module-master/src \
&& make && make install
複製代碼
這時候,你大概會報錯:No such file or directory #include "common_define.h" 這很致命,怎麼解決呢?
咱們須要改一下源碼裏的fastdfs-nginx-module-master/src/config文件 在dockerfile同目錄下,新建一個文件:config,寫入以下配置:
ngx_addon_name=ngx_http_fastdfs_module
if test -n "${ngx_module_link}"; then
ngx_module_type=HTTP
ngx_module_name=$ngx_addon_name
ngx_module_incs="/usr/local/include"
ngx_module_libs="-lfastcommon -lfdfsclient"
ngx_module_srcs="$ngx_addon_dir/ngx_http_fastdfs_module.c"
ngx_module_deps=
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
. auto/module
else
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/local/include"
CORE_LIBS="$CORE_LIBS -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
fi
複製代碼
而後在dockerfile中編譯那段以前,添加
# 修復編譯找不到 #include "common_define.h"的致命問題
ADD ./config ${HOME}/fastdfs-nginx-module-master/src
複製代碼
# 配置nginx和fastdfs環境,配置nginx
RUN cp ${HOME}/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/ \
&& sed -i "s|^store_path0.*$|store_path0=/var/local/fdfs/storage|g" /etc/fdfs/mod_fastdfs.conf \
&& sed -i "s|^url_have_group_name=.*$|url_have_group_name=true|g" /etc/fdfs/mod_fastdfs.conf \
&& cd ${HOME}/fastdfs-master/conf/ \
&& cp http.conf mime.types anti-steal.jpg /etc/fdfs/ \
&& echo -e "events {\n\ worker_connections 1024;\n\ }\n\ http {\n\ include mime.types;\n\ default_type application/octet-stream;\n\ server {\n\ listen \$NGINX_PORT;\n\ server_name localhost;\n\ location ~ /group[0-9]/M00 {\n\ ngx_fastdfs_module;\n\ }\n\ }\n\ }">/usr/local/nginx/conf/nginx.conf
複製代碼
第11步,咱們很接近成功了,先清理下咱們不會再用到的文件和軟件
# 清理臨時軟件和文件
RUN rm -rf ${HOME}/*
RUN apk del .mybuilds
RUN apk add bash pcre-dev zlib-dev
複製代碼
第12步,咱們好像就差一個啓動腳本了,接下來,寫個啓動腳本;這裏須要注意NET_VAR變量,我在這裏踩了個坑,默認是eth0,適合Linux,若是是mac,須要給它賦值en0,或者直接自定義:HOST_IP
# 建立啓動腳本
RUN echo -e "mkdir -p /var/local/fdfs/storage/data /var/local/fdfs/tracker; \n\ ln -s /var/local/fdfs/storage/data/ /var/local/fdfs/storage/data/M00; \n\n\ sed -i \"s/listen\ .*$/listen\ \$NGINX_PORT;/g\" /usr/local/nginx/conf/nginx.conf; \n\ sed -i \"s/http.server_port=.*$/http.server_port=\$NGINX_PORT/g\" /etc/fdfs/storage.conf; \n\ if [ \"\$HOST_IP\" = \"\" ]; then \n\ HOST_IP=\$(ifconfig \$NET_VAR | grep \"inet\" | grep -v \"inet6\" | awk '{print \$2}' | awk -F: '{print \$2}')\n\ fi \n\ sed -i \"s/^tracker_server=.*$/tracker_server=\$HOST_IP:\$FDFS_PORT/g\" /etc/fdfs/storage.conf; \n\ sed -i \"s/^tracker_server=.*$/tracker_server=\$HOST_IP:\$FDFS_PORT/g\" /etc/fdfs/client.conf; \n\ sed -i \"s/^tracker_server=.*$/tracker_server=\$HOST_IP:\$FDFS_PORT/g\" /etc/fdfs/mod_fastdfs.conf; \n\ /etc/init.d/fdfs_trackerd start; \n\ /etc/init.d/fdfs_storaged start; \n\ /usr/local/nginx/sbin/nginx; \n\ tail -f /usr/local/nginx/logs/access.log \ ">/start.sh \
&& chmod u+x /start.sh
複製代碼
第13步,好了,暴露端口,配置啓動腳本,收工
# 暴露端口
EXPOSE ${NGINX_PORT} ${FDFS_PORT}
ENTRYPOINT ["/bin/bash","/start.sh"]
複製代碼
FROM alpine:3.7
MAINTAINER oak <ritj@163.com>
# 定義變量
ENV HOME=/root/fastdfs \
# nginx版本
NGINX_VERSION=1.17.0 \
# nginx端口默認值
NGINX_PORT=8888 \
# IP所在網絡
NET_VAR=eth0 \
# fastdfs端口默認值
FDFS_PORT=22122
# 建立目錄
RUN mkdir -p ${HOME}
# 升級軟件包
RUN apk update
# 安裝必要的軟件
RUN apk add --no-cache --virtual .mybuilds \
bash \
gcc \
make \
linux-headers \
curl \
gnupg \
gd-dev \
pcre-dev \
zlib-dev \
libc-dev \
libxslt-dev \
openssl-dev \
geoip-dev
# 下載、安裝libfastcommon
RUN cd ${HOME}/ \
&& curl -fSL https://github.com/happyfish100/libfastcommon/archive/master.tar.gz -o fastcommon.tar.gz \
&& tar zxf fastcommon.tar.gz \
&& cd ${HOME}/libfastcommon-master/ \
&& ./make.sh \
&& ./make.sh install
# 下載、安裝fastdfs
RUN cd ${HOME}/ \
&& curl -fSL https://github.com/happyfish100/fastdfs/archive/master.tar.gz -o fastfs.tar.gz \
&& tar zxf fastfs.tar.gz \
&& cd ${HOME}/fastdfs-master/ \
&& ./make.sh \
&& ./make.sh install
# 配置fastdfs
RUN cd /etc/fdfs/ \
&& cp storage.conf.sample storage.conf \
&& sed -i "s|/home/yuqing/fastdfs|/var/local/fdfs/storage|g" /etc/fdfs/storage.conf \
&& cp tracker.conf.sample tracker.conf \
&& sed -i "s|/home/yuqing/fastdfs|/var/local/fdfs/tracker|g" /etc/fdfs/tracker.conf \
&& cp client.conf.sample client.conf \
&& sed -i "s|/home/yuqing/fastdfs|/var/local/fdfs/storage|g" /etc/fdfs/client.conf
# 下載nginx插件
RUN cd ${HOME}/ \
&& curl -fSL https://github.com/happyfish100/fastdfs-nginx-module/archive/master.tar.gz -o nginx-module.tar.gz \
&& tar zxf nginx-module.tar.gz
# 下載nginx
RUN cd ${HOME}/ \
&& curl -fSL http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz -o nginx-${NGINX_VERSION}.tar.gz \
&& tar zxf nginx-${NGINX_VERSION}.tar.gz
# 修復編譯找不到 #include "common_define.h"的致命問題
ADD ./config ${HOME}/fastdfs-nginx-module-master/src
# 將nginx和fastdfs的nginx插件編譯
RUN cd ${HOME} \
&& chmod u+x ${HOME}/fastdfs-nginx-module-master/src/config \
&& cd nginx-${NGINX_VERSION} \
&& ./configure --add-module=${HOME}/fastdfs-nginx-module-master/src \
&& make && make install
# 配置nginx和fastdfs環境,配置nginx
RUN cp ${HOME}/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/ \
&& sed -i "s|^store_path0.*$|store_path0=/var/local/fdfs/storage|g" /etc/fdfs/mod_fastdfs.conf \
&& sed -i "s|^url_have_group_name=.*$|url_have_group_name=true|g" /etc/fdfs/mod_fastdfs.conf \
&& cd ${HOME}/fastdfs-master/conf/ \
&& cp http.conf mime.types anti-steal.jpg /etc/fdfs/ \
&& echo -e "events {\n\ worker_connections 1024;\n\ }\n\ http {\n\ include mime.types;\n\ default_type application/octet-stream;\n\ server {\n\ listen \$NGINX_PORT;\n\ server_name localhost;\n\ location ~ /group[0-9]/M00 {\n\ ngx_fastdfs_module;\n\ }\n\ }\n\ }">/usr/local/nginx/conf/nginx.conf
# 清理臨時軟件和文件
RUN rm -rf ${HOME}/*
RUN apk del .mybuilds
RUN apk add bash pcre-dev zlib-dev
# 建立啓動腳本
RUN echo -e "mkdir -p /var/local/fdfs/storage/data /var/local/fdfs/tracker; \n\ ln -s /var/local/fdfs/storage/data/ /var/local/fdfs/storage/data/M00; \n\n\ sed -i \"s/listen\ .*$/listen\ \$NGINX_PORT;/g\" /usr/local/nginx/conf/nginx.conf; \n\ sed -i \"s/http.server_port=.*$/http.server_port=\$NGINX_PORT/g\" /etc/fdfs/storage.conf; \n\ if [ \"\$HOST_IP\" = \"\" ]; then \n\ HOST_IP=\$(ifconfig \$NET_VAR | grep \"inet\" | grep -v \"inet6\" | awk '{print \$2}' | awk -F: '{print \$2}')\n\ fi \n\ sed -i \"s/^tracker_server=.*$/tracker_server=\$HOST_IP:\$FDFS_PORT/g\" /etc/fdfs/storage.conf; \n\ sed -i \"s/^tracker_server=.*$/tracker_server=\$HOST_IP:\$FDFS_PORT/g\" /etc/fdfs/client.conf; \n\ sed -i \"s/^tracker_server=.*$/tracker_server=\$HOST_IP:\$FDFS_PORT/g\" /etc/fdfs/mod_fastdfs.conf; \n\ /etc/init.d/fdfs_trackerd start; \n\ /etc/init.d/fdfs_storaged start; \n\ /usr/local/nginx/sbin/nginx; \n\ tail -f /usr/local/nginx/logs/access.log \ ">/start.sh \
&& chmod u+x /start.sh
# 暴露端口
EXPOSE ${NGINX_PORT} ${FDFS_PORT}
ENTRYPOINT ["/bin/bash","/start.sh"]
複製代碼
文件結構:
腳本一個:
#!/bin/bash
STORAGE=/var/local/fdfs/storage/logs/storaged.log
TRACKER=/var/local/fdfs/tracker/logs/trackerd.log
NGINX=/usr/local/nginx/logs/access.log
ID=$(docker ps|grep fastdfs|awk '{print $1}')
USER_PRINT=$1
LOG=""
if [[ "${USER_PRINT}" = "tracker" ]];then
LOG=${TRACKER}
elif [[ "${USER_PRINT}" = "storage" ]]; then
LOG=${STORAGE}
else
LOG=${NGINX}
fi
docker exec -it $ID /usr/bin/tail -f ${LOG}
複製代碼
使用方法(記得給腳本賦執行權): ./log.sh tracker 或 storage 或 nginx
沒有公衆號,也沒有二維碼,也沒有廣告,僅此。