爱生活,爱分享


Docker安装FastDFS

haiten 2019-11-03 1500浏览 0条评论
首页/正文
分享到: / / / /

一、准备相关软件包

wget https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz -O libfastcommon-1.0.43.tar.gz

wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz -O fastdfs-6.06.tar.gz

wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz -O fastdfs-nginx-module-1.22.tar.gz

wget http://download.oracle.com/berkeley-db/db-6.0.30.tar.gz -O db-6.0.30.tar.gz

wget https://codeload.github.com/happyfish100/fastdht/zip/master -O fastdht-master.zip

unzip fastdht-master.zip

tar zcvf fastdht-master.tar.gz

wget http://nginx.org/download/nginx-1.19.8.tar.gz -O nginx-1.19.8.tar.gz

二、编写 Dockerfile 文件

nano Dockerfile
-----------------------------------------------------------------------------------------
FROM centos:7.9.2009

MAINTAINER yanghaiteng 13702721963@139.com

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ENV INSTALL_PATH=/opt \

FDFS_BASE_PATH=/var/fdfs \
FDFS_CONF_PATH=/etc/fdfs \
TRACKER_PORT=22122 \
RESERVED_STORAGE_SPACE=10% \
TRACKER_SERVER=192.168.1.2:22122 \
FDHT_PORT=11411 \
FDHT_SERVER=192.168.1.2:11411 \
GROUP_NAME=group0 \
STORE_PORT=23000 \
NGINX_PORT=9999

VOLUME ${FDFS_BASE_PATH} ${FDFS_CONF_PATH}

RUN rpm --rebuilddb \
&& yum install -y wget \
zlib zlib-devel \
pcre pcre-devel \
gcc gcc-c++ \
openssl openssl-devel \
libevent libevent-devel \
make cmake perl tar net-tools \
&& mkdir -p ${INSTALL_PATH}

ADD libfastcommon-1.0.43.tar.gz ${INSTALL_PATH}/
RUN mv ${INSTALL_PATH}/libfastcommon-* ${INSTALL_PATH}/libfastcommon
WORKDIR ${INSTALL_PATH}/libfastcommon
RUN ./make.sh \
&& ./make.sh install

ADD fastdfs-6.06.tar.gz ${INSTALL_PATH}/
RUN mv ${INSTALL_PATH}/fastdfs-* ${INSTALL_PATH}/fastdfs
WORKDIR ${INSTALL_PATH}/fastdfs
RUN ./make.sh \
&& ./make.sh install

ADD fastdfs-nginx-module-1.22.tar.gz ${INSTALL_PATH}/
RUN mv ${INSTALL_PATH}/fastdfs-nginx-module-* ${INSTALL_PATH}/fastdfs-nginx-module
RUN sed -i 's|ngx_module_incs\s*=.*$|ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"|g' ${INSTALL_PATH}/fastdfs-nginx-module/src/config \
&& sed -i 's|CORE_INCS\s*=.*$|CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"|g' ${INSTALL_PATH}/fastdfs-nginx-module/src/config

ADD nginx-1.19.8.tar.gz ${INSTALL_PATH}/
RUN mv ${INSTALL_PATH}/nginx-* ${INSTALL_PATH}/nginx
WORKDIR ${INSTALL_PATH}/nginx
RUN ./configure --prefix=/usr/local/nginx --add-module=${INSTALL_PATH}/fastdfs-nginx-module/src \
&& make \
&& make install

RUN mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak \
&& mkdir -p /usr/local/nginx/conf.d /usr/local/nginx/conf.d.demo
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
COPY nginx.vh.default.conf /usr/local/nginx/conf.d.demo/nginx.vh.default.conf.demo

ADD db-6.0.30.tar.gz ${INSTALL_PATH}/
RUN mv ${INSTALL_PATH}/db-* ${INSTALL_PATH}/db
WORKDIR ${INSTALL_PATH}/db/build_unix
RUN ../dist/configure --prefix=/usr/local/db \
&& make \
&& make install

ADD fastdht-master.tar.gz ${INSTALL_PATH}/
RUN mv ${INSTALL_PATH}/fastdht-* ${INSTALL_PATH}/fastdht
RUN sed -i "s|CFLAGS='-Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE'.*$|CFLAGS='-Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -I/usr/local/db/include/ -L/usr/local/db/lib/'|g" ${INSTALL_PATH}/fastdht/make.sh
WORKDIR ${INSTALL_PATH}/fastdht
RUN ./make.sh \
&& ./make.sh install

RUN rm -rf ${FDFS_BASE_PATH}/* ${FDFS_CONF_PATH}/*

WORKDIR ~

COPY docker-entrypoint.sh /usr/bin/
RUN chmod 755 /usr/bin/docker-entrypoint.sh
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
CMD ["client"]
-----------------------------------------------------------------------------------------

三、编写 docker 容器启动文件

nano docker-entrypoint.sh
-----------------------------------------------------------------------------------------
#!/bin/bash

if [ "$1" = "tracker" ] ; then
  FASTDFS_MODE="tracker"

  if [ ! -f "${FDFS_CONF_PATH}/tracker.conf" ]; then
    cp ${INSTALL_PATH}/fastdfs/conf/tracker.conf ${FDFS_CONF_PATH}/tracker.conf
    sed -i "s|^base_path\s*=.*$|base_path = ${FDFS_BASE_PATH}|g" ${FDFS_CONF_PATH}/tracker.conf
    if [ -n "$TRACKER_PORT" ] ; then  
      sed -i "s|^port\s*=.*$|port = ${TRACKER_PORT}|g" ${FDFS_CONF_PATH}/tracker.conf
    fi
    if [ -n "$RESERVED_STORAGE_SPACE" ] ; then  
      sed -i "s|^reserved_storage_space\s*=.*$|reserved_storage_space = ${RESERVED_STORAGE_SPACE}|g" ${FDFS_CONF_PATH}/tracker.conf
    fi
  fi

  if [ ! -f "${FDFS_CONF_PATH}/storage_ids.conf" ]; then
    cp ${INSTALL_PATH}/fastdfs/conf/storage_ids.conf ${FDFS_CONF_PATH}/storage_ids.conf
  fi
elif [ "$1" = "storage" ] ; then
  FASTDFS_MODE="storage"

  if [ ! -f "${FDFS_CONF_PATH}/storage.conf" ]; then
    cp ${INSTALL_PATH}/fastdfs/conf/storage.conf ${FDFS_CONF_PATH}/storage.conf
    sed -i "s|^base_path\s*=.*$|base_path = ${FDFS_BASE_PATH}|g" ${FDFS_CONF_PATH}/storage.conf
    sed -i "s|^store_path0\s*=.*$|store_path0 = ${FDFS_BASE_PATH}|g" ${FDFS_CONF_PATH}/storage.conf

    sed -i "s|^check_file_duplicate\s*=.*$|check_file_duplicate = 1|g" ${FDFS_CONF_PATH}/storage.conf
    sed -i "s|^keep_alive\s*=.*$|keep_alive = 1|g" ${FDFS_CONF_PATH}/storage.conf
    sed -i "s|^##include\s*.*/fdht_servers.conf.*$|#include ${FDFS_CONF_PATH}/fdht_servers.conf|g" ${FDFS_CONF_PATH}/storage.conf

    if [ -n "$GROUP_NAME" ] ; then  
      sed -i "s|^group_name\s*=.*$|group_name = ${GROUP_NAME}|g" ${FDFS_CONF_PATH}/storage.conf
    fi
    if [ -n "$STORE_PORT" ] ; then  
      sed -i "s|^port\s*=.*$|port = ${STORE_PORT}|g" ${FDFS_CONF_PATH}/storage.conf
    fi
    if [ -n "$TRACKER_SERVER" ] ; then  
      sed -i "s|^tracker_server\s*=.*$|tracker_server = ${TRACKER_SERVER}|g" ${FDFS_CONF_PATH}/storage.conf
    fi
  fi

  if [ ! -f "${FDFS_CONF_PATH}/storage_ids.conf" ]; then
    cp ${INSTALL_PATH}/fastdfs/conf/storage_ids.conf ${FDFS_CONF_PATH}/storage_ids.conf
  fi

  if [ ! -f "${FDFS_CONF_PATH}/fdht_servers.conf" ]; then
    echo 'group_count = 1' > ${FDFS_CONF_PATH}/fdht_servers.conf
    echo 'group0 = '${FDHT_SERVER} >> ${FDFS_CONF_PATH}/fdht_servers.conf
  fi

  if [ ! -f "${FDFS_CONF_PATH}/anti-steal.jpg" ]; then
    cp ${INSTALL_PATH}/fastdfs/conf/anti-steal.jpg ${FDFS_CONF_PATH}/anti-steal.jpg
  fi

  if [ ! -f "${FDFS_CONF_PATH}/mime.types" ]; then
    cp ${INSTALL_PATH}/fastdfs/conf/mime.types ${FDFS_CONF_PATH}/mime.types
  fi

  if [ ! -f "${FDFS_CONF_PATH}/http.conf" ]; then
    cp ${INSTALL_PATH}/fastdfs/conf/http.conf ${FDFS_CONF_PATH}/http.conf
    sed -i "s|^http.anti_steal.token_check_fail\s*=.*$|http.anti_steal.token_check_fail = ${FDFS_CONF_PATH}/anti-steal.jpg|g" ${FDFS_CONF_PATH}/http.conf
  fi

  if [ ! -f "${FDFS_CONF_PATH}/mod_fastdfs.conf" ]; then
    cp ${INSTALL_PATH}/fastdfs-nginx-module/src/mod_fastdfs.conf ${FDFS_CONF_PATH}/mod_fastdfs.conf
    mkdir -p ${FDFS_BASE_PATH}/tmp
    sed -i "s|^base_path\s*=.*$|base_path = ${FDFS_BASE_PATH}/tmp|g" ${FDFS_CONF_PATH}/mod_fastdfs.conf
    sed -i "s|^store_path0\s*=.*$|store_path0=${FDFS_BASE_PATH}|g" ${FDFS_CONF_PATH}/mod_fastdfs.conf
    sed -i "s|^url_have_group_name\s*=.*$|url_have_group_name = true|g" ${FDFS_CONF_PATH}/mod_fastdfs.conf
    if [ -n "$TRACKER_SERVER" ] ; then
      sed -i "s|^tracker_server\s*=.*$|tracker_server = ${TRACKER_SERVER}|g" ${FDFS_CONF_PATH}/mod_fastdfs.conf
    fi
    if [ -n "$STORE_PORT" ] ; then
      sed -i "s|^storage_server_port\s*=.*$|storage_server_port = ${STORE_PORT}|g" ${FDFS_CONF_PATH}/mod_fastdfs.conf
    fi
    if [ -n "$GROUP_NAME" ] ; then
      sed -i "s|^group_name\s*=.*$|group_name = ${GROUP_NAME}|g" ${FDFS_CONF_PATH}/mod_fastdfs.conf
    fi
  fi

  if [ ! -f "/usr/local/nginx/conf.d/nginx.vh.default.conf" ]; then
    cp /usr/local/nginx/conf.d.demo/nginx.vh.default.conf.demo /usr/local/nginx/conf.d/nginx.vh.default.conf
    if [ -n "$NGINX_PORT" ] ; then
      sed -i "s|^    listen       9999;.*$|    listen       ${NGINX_PORT};|g" /usr/local/nginx/conf.d/nginx.vh.default.conf
    fi
  fi

  /usr/local/nginx/sbin/nginx
elif [ "$1" = "fdht" ] ; then
  FASTDFS_MODE="fdht"

  if [ ! -f "/usr/local/bin/fdhtd" ]; then
    cp ${INSTALL_PATH}/fastdht/init.d/fdhtd /usr/local/bin/fdhtd
  fi
  if [ ! -f "${FDFS_CONF_PATH}/fdhtd.conf" ]; then
    cp ${INSTALL_PATH}/fastdht/conf/fdhtd.conf ${FDFS_CONF_PATH}/fdhtd.conf
    sed -i "s|^base_path\s*=.*$|base_path = ${FDFS_BASE_PATH}|g" ${FDFS_CONF_PATH}/fdhtd.conf
    if [ -n "$FDHT_PORT" ] ; then  
      sed -i "s|^port\s*=.*$|port = ${FDHT_PORT}|g" ${FDFS_CONF_PATH}/fdhtd.conf
    fi
    sed -i "s|^#include\s*.*/fdht_servers.conf.*$|#include ${FDFS_CONF_PATH}/fdht_servers.conf|g" ${FDFS_CONF_PATH}/fdhtd.conf
  fi
  if [ ! -f "${FDFS_CONF_PATH}/fdht_servers.conf" ]; then
    echo 'group_count = 1' > ${FDFS_CONF_PATH}/fdht_servers.conf
    echo 'group0 = '${FDHT_SERVER} >> ${FDFS_CONF_PATH}/fdht_servers.conf
  fi
  if [ ! -f "${FDFS_CONF_PATH}/fdht_client.conf" ]; then
    cp ${INSTALL_PATH}/fastdht/conf/fdht_client.conf ${FDFS_CONF_PATH}/fdht_client.conf
    sed -i "s|^base_path\s*=.*$|base_path = ${FDFS_BASE_PATH}|g" ${FDFS_CONF_PATH}/fdht_client.conf
    sed -i "s|^#include\s*.*/fdht_servers.conf.*$|#include ${FDFS_CONF_PATH}/fdht_servers.conf|g" ${FDFS_CONF_PATH}/fdht_client.conf
  fi
  if [ ! -f "/usr/lib/libdb-6.0.so" ]; then
    cp /usr/local/db/lib/libdb-6.0.so /usr/lib/libdb-6.0.so
  fi
  if [ ! -f "/usr/lib64/libdb-6.0.so" ]; then
    cp /usr/local/db/lib/libdb-6.0.so /usr/lib64/libdb-6.0.so
  fi
else 
  if [ ! -f "${FDFS_CONF_PATH}/storage_ids.conf" ]; then
    cp ${INSTALL_PATH}/fastdfs/conf/storage_ids.conf ${FDFS_CONF_PATH}/storage_ids.conf
  fi

  if [ ! -f "${FDFS_CONF_PATH}/client.conf" ]; then
    cp ${INSTALL_PATH}/fastdfs/conf/client.conf ${FDFS_CONF_PATH}/client.conf
    sed -i "s|^base_path\s*=.*$|base_path = ${FDFS_BASE_PATH}|g" ${FDFS_CONF_PATH}/client.conf
    if [ -n "$TRACKER_SERVER" ] ; then  
      sed -i "s|^tracker_server\s*=.*$|tracker_server = ${TRACKER_SERVER}|g" ${FDFS_CONF_PATH}/client.conf
    fi
  fi

  fdfs_monitor ${FDFS_CONF_PATH}/client.conf
  while [ 0 -lt 1 ]
  do
    sleep 36000s
  done
  exit 0
fi

echo "try to start the $FASTDFS_MODE node..."
if [ "${FASTDFS_MODE}" = "fdht" ] ; then
  FASTDFS_LOG_FILE="${FDFS_BASE_PATH}/logs/${FASTDFS_MODE}d.log"
  FASTDFS_PID_NUMBER="${FDFS_BASE_PATH}/data/${FASTDFS_MODE}d.pid"
  if [ -f "$FASTDFS_LOG_FILE" ]; then 
    rm "$FASTDFS_LOG_FILE"
  fi
  if [ -f "$FASTDFS_PID_NUMBER" ]; then 
    rm "$FASTDFS_PID_NUMBER"
  fi
  fdhtd ${FDFS_CONF_PATH}/fdhtd.conf
else
  FASTDFS_LOG_FILE="${FDFS_BASE_PATH}/logs/${FASTDFS_MODE}d.log"
  FASTDFS_PID_NUMBER="${FDFS_BASE_PATH}/data/fdfs_${FASTDFS_MODE}d.pid"
  if [ -f "$FASTDFS_LOG_FILE" ]; then 
    rm "$FASTDFS_LOG_FILE"
  fi
  if [ -f "$FASTDFS_PID_NUMBER" ]; then 
    rm "$FASTDFS_PID_NUMBER"
  fi
  fdfs_${FASTDFS_MODE}d ${FDFS_CONF_PATH}/${FASTDFS_MODE}.conf start
fi

TIMES=5
while [ ! -f "$FASTDFS_PID_NUMBER" -a $TIMES -gt 0 ]
do
  sleep 1s
  TIMES=`expr $TIMES - 1`
done

if [ $TIMES -gt 0 ]; then
  echo "the ${FASTDFS_MODE} node started successfully at $(date +%Y-%m-%d_%H:%M)"
  echo "please have a look at the log detail at $FASTDFS_LOG_FILE"
  echo
  echo
  # tail -F --pid=`cat $FASTDFS_PID_NUMBER` /dev/null
else
  echo "the ${FASTDFS_MODE} node started failed at $(date +%Y-%m-%d_%H:%M)"
  echo "please have a look at the log detail at $FASTDFS_LOG_FILE"
  echo
  echo
fi

tail -f "$FASTDFS_LOG_FILE"
-----------------------------------------------------------------------------------------

四、编写 nginx 配置文件

nano nginx.conf
-----------------------------------------------------------------------------------------
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  10240;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    add_header X-Frame-Options SAMEORIGIN;
 
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
 
    include /usr/local/nginx/conf.d/*.conf;
}
-----------------------------------------------------------------------------------------
nano nginx.vh.default.conf
-----------------------------------------------------------------------------------------
server {
    listen       9999;
    server_name  localhost;
    location ~/group[0-9]/ {
        if ($arg_attname ~ "^(.+)") {
            add_header Content-Disposition "attachment;filename=$arg_attname";
        }
        ngx_fastdfs_module;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root html;
    }
}


# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
#    listen       8000;
#    listen       somename:8080;
#    server_name  somename  alias  another.alias;

#    location / {
#        root   html;
#        index  index.html index.htm;
#    }
#}


# HTTPS server
#
#server {
#    listen       443 ssl;
#    server_name  localhost;

#    ssl_certificate      cert.pem;
#    ssl_certificate_key  cert.key;

#    ssl_session_cache    shared:SSL:1m;
#    ssl_session_timeout  5m;

#    ssl_ciphers  HIGH:!aNULL:!MD5;
#    ssl_prefer_server_ciphers  on;

#    location / {
#        root   html;
#        index  index.html index.htm;
#    }
#}
-----------------------------------------------------------------------------------------

五、执行 Dockerfile 制作镜像

docker build -t yht/fastdfs:6.06 .
docker save yht/fastdfs:6.06 > yht-fastdfs-6.06.tar
xz yht-fastdfs-6.06.tar
xz -d yht-fastdfs-6.06.tar.xz
docker load < yht-fastdfs-6.06.tar

六、使用镜像

firewall-cmd --permanent --add-port=10004/tcp
firewall-cmd --permanent --add-port=10005/tcp
firewall-cmd --permanent --add-port=10006/tcp
firewall-cmd --permanent --add-port=10007/tcp
firewall-cmd --reload
firewall-cmd --list-all

docker run -d \
--name fastdfs-tracker \
--network=host \
--restart unless-stopped \
-v /data/frame/fastdfs/tracker/conf:/etc/fdfs \
-v /data/frame/fastdfs/tracker/base:/var/fdfs \
-e TRACKER_PORT=10004 \
-e RESERVED_STORAGE_SPACE=5% \
yht/fastdfs:6.06 tracker

docker run -d \
--name fastdfs-fdht \
--network=host \
--restart unless-stopped \
-v /data/frame/fastdfs/fdht/conf:/etc/fdfs \
-v /data/frame/fastdfs/fdht/base:/var/fdfs \
-e FDHT_PORT=10005 \
-e FDHT_SERVER=192.168.56.139:10005 \
yht/fastdfs:6.06 fdht

docker run -d \
--name fastdfs-storage \
--network=host \
--restart unless-stopped \
-v /data/frame/fastdfs/storage/conf:/etc/fdfs \
-v /data/frame/fastdfs/storage/base:/var/fdfs \
-v /data/frame/fastdfs/storage/nginx/conf:/usr/local/nginx/conf.d \
-v /data/frame/fastdfs/storage/nginx/logs:/usr/local/nginx/logs \
-e TRACKER_SERVER=192.168.56.119:10004 \
-e FDHT_SERVER=192.168.56.139:10005 \
-e GROUP_NAME=group1 \
-e STORE_PORT=10006 \
-e NGINX_PORT=10007 \
yht/fastdfs:6.06 storage

docker run -d \
--name fastdfs-client \
-e TRACKER_SERVER=192.168.56.119:10004 \
yht/fastdfs:6.06

七、测试

fdfs_monitor /etc/fdfs/client.conf

cd ~
echo 1 > 1.txt
echo 2 > 2.txt
fdfs_upload_file /etc/fdfs/client.conf 1.txt
fdfs_upload_file /etc/fdfs/client.conf 2.txt

原创不易,如需转载,请标明出处!

最后修改:2019-11-03 10:43:08 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

说点什么吧~

评论列表

还没有人评论哦~赶快抢占沙发吧~