利用FastDFS搭建文件服務Docker一鍵啓動集成版 - 在巨人肩膀上奔跑系列

1、什麼是FastDFS

最近公司業務需求,須要搭建文件服務器,通過各類諮詢和搜索,決定使用FastDFS。那FastDFS有什麼優勢呢?linux

FastDFS是用c語言編寫的一款開源的分佈式文件系統。FastDFS爲互聯網量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集羣提供文件上傳、下載等服務。nginx

更詳細的你們能夠參考:來自ityouknow的文章: 點擊查看git

2、如何使用docker鏡像

爲了更方便地集成到現有服務裏,咱們須要一個能夠一鍵運行的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服務器

  • 第一種:[傳入網絡名,自動獲取IP]
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
複製代碼
  • 第二種:[直接傳入IP]
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
複製代碼

若是你想知道它是怎麼來的,請繼續往下看:

3、如何編寫dockerfile

  • 第1步,固然是建立一個dockerfile文件,而後去看看咱們須要用的軟件版本。

    依賴版本:libfastcommon和fastdfs的版本爲master分支,nginx默認1.17.0,你懂的。

    具體版本查看:

    libfastcommon: 點擊跳轉

    fastdfs: 點擊跳轉

    nginx: 點擊跳轉

  • 第2步,咱們須要選擇一個環境,嗯,咱們選擇最小的Linux -> alpine,如今dockerfile是這樣的:

FROM alpine:3.7
複製代碼
  • 第3步,定義幾個全局變量吧
# 工做目錄
ENV HOME=/root/fastdfs \
    # nginx版本
    NGINX_VERSION=1.17.0 \
    # nginx端口默認值
    NGINX_PORT=8888 \
    # IP所在網絡默認值
    NET_VAR=eth0 \
    # fastdfs端口默認值
    FDFS_PORT=22122
複製代碼
  • 第4步,咱們須要安裝一些編譯期間的依賴軟件,順便更新下系統軟件
# 建立目錄
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了。

  • 第5步,咱們須要檢查一下目錄,而後下載fastdfs的依賴libfastcommon而且編譯安裝
# 下載、安裝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
複製代碼
  • 第6步,下載、編譯、安裝fastdfs
# 下載、安裝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
複製代碼
  • 第7步,配置一下fastdfs, 替換一下里面的路徑/home/yuqing/fastdfs
# 配置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 
複製代碼
  • 第8步,好了,接下來咱們安裝一下nginx和nginx插件
# 下載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
複製代碼
  • 第9步,咱們把nginx兩兄弟一塊兒編譯安裝下
# 將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
複製代碼
  • 第10步,配置nginx和fastdfs環境,配置一下nginx
# 配置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"]
複製代碼
  • 總結:完整的dockerfile
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"]
複製代碼

文件結構:

4、如何查看日誌

腳本一個:

#!/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

沒有公衆號,也沒有二維碼,也沒有廣告,僅此。

相關文章
相關標籤/搜索