需求描述

 快速搭建内部文件共享的平台,支持 FTP、Windows 共享和浏览器方式访问共享资源

  • FTP 要求配置用户名验证模式,支持文件的上传、下载、新建、删除等管理操作
  • Samba 共享支持匿名访问方式,通过只读的方式访问。同时也确保不会因为Windows 访问环境导致的病毒影响,保障共享服务器的安全稳定
  • 启用 Nginx 的 FancyIndex 访问模式实现用户通过浏览器访问共享文件的需求
  • 整体上就是 FTP 实现共享管理,Samba 和 Nginx 提供匿名的共享和浏览器访问方式

环境搭建

先参照“Linux 系统生产环境配置指南”https://blog.51cto.com/waringid/5782872 完成系统和基本组件的配置,文中涉及防火墙相关的配置内容请参考“Linux 系统防火墙 Firewall-cmd 日常操作指南”https://blog.51cto.com/waringid/5806004

docker-compose

version: '3'

services:
  ftpd_server:
    image: stilliard/pure-ftpd
    container_name: pure-ftpd
    ports:
      - "21:21"
      - "30000-30009:30000-30009"
    volumes: # remember to replace /folder_on_disk/ with the path to where you want to store the files on the host machine
      - /docker/fileserver/file:/home/ftpusers
      - /docker/fileserver/passwd:/etc/pure-ftpd/passwd
      - /docker/fileserver/ssl:/etc/ssl/private
    environment:
      TZ: "Asia/Shanghai"
      PUBLICHOST: 192.168.16.77
      FTP_USER_NAME: "ftpuser"
      FTP_USER_PASS: "www.myj123.com"
      FTP_USER_HOME: "/home/ftpusers"
      ADDED_FLAGS: "--tls=2"
    networks:
      - smbnet
    restart: always

  nginx_server:
    image: fraoustin/fancyindex
    container_name: fancyindex
    ports:
      - "8000:80"
    volumes: 
      - /docker/fileserver/file:/share
    environment:
      COLOR: "greydark"
      CONTAINER_TIMEZONE: "Asia/Shanghai"
      DISABLE_AUTH: "true"
    networks:
      - smbnet
    restart: always
  
  samba:
    image: dperson/samba
    container_name: samba
    environment:
      TZ: "Asia/Shanghai"
    networks:
      - smbnet
    ports:
      - "137:137/udp"
      - "138:138/udp"
      - "139:139/tcp"
      - "445:445/tcp"
    read_only: true
    tmpfs:
      - /tmp
    restart: unless-stopped
    stdin_open: true
    tty: true
    volumes:
      - /docker/fileserver/file:/share
    command: '-s "Public;/share" '

networks:
  smbnet:

FTP 容器说明

该镜像的详细说明可以参考 https://github.com/stilliard/docker-pure-ftpd。实际环境中的配置说明如下:

  • /docker/fileserver/file是实际的文件存放位置,容器内部的实际位置是/home/ftpusers
  • FTP 启动后生产的密码保存在实际的位置/docker/fileserver/passwd,容器内部的实际位置是/etc/pure-ftpd/passwd
  • 容器的环境项目中配置了 FTP 容器的时区、FTP 启动时新增的用户名称和密码以及访问的 IP 地址等相关信息

TLS 自签名证书配置

mkdir -p /etc/ssl/private
openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 2048
openssl req -x509 -nodes -newkey rsa:2048 -sha256 -keyout /etc/ssl/private/pure-ftpd.pem   -out /etc/ssl/private/pure-ftpd.pem -days 3650
chmod 600 /etc/ssl/private/*.pem

默认情况下 FTP 启动时有对应的用户数限制

Samba 容器说明

该镜像的容器说明可以参考 https://github.com/dperson/samba。实际环境中的说明如下:

  •  /docker/fileserver/file是实际的文件存放位置,该位置同时和FTP 容器中的配置一致,对应的Samba 容器内部的位置是/share
  • command: '-s "Public;/share" ' 表示将 /share 新增为 Public 的共享,这里配置的是匿名访问,没有配置用户名和密码

如需配置用户名和密码访问,可以参考以下的指令

 -u "example1;badpass" \
 -u "example2;badpass" \
 -s "public;/share" \
 -s "users;/srv;no;no;no;example1,example2" \
 -s "example1 private share;/example1;no;no;no;example1" \
 -s "example2 private share;/example2;no;no;no;example2"

docker run -it -p 139:139 -p 445:445  -v /downloads/qbittorrent/downloads:/shared \
--name samba -d dperson/samba -p -u "down;password;1000;down;1000" \
-s "Downloads Share;/shared;yes;yes;no;down;down;down;Docker.test Host"

FancyIndex 容器说明

该容器的镜像说明可以参考 https://github.com/fraoustin/fancyindex。本文中的设置说明如下:

  •  禁用访问验证,设置对应的时区和颜色
  •  路径说明和前面描述的一致

容器镜像涉及的变量说明如下:

  • SET_CONTAINER_TIMEZONE (false or true) manage time of container  #是否设置容器时区
  • CONTAINER_TIMEZONE timezone of container  #容器时区设置
  • DISABLE_AUTH (false or true) allows you to disable auth on nginx  #是否禁用验证
  • WEBUSER (default user)
  • WEBPASSWORD (default pass)
  • COLOR (default blue) for web ihm (blue, green, grey, greydark, orange, purple, red) #颜色

参考内容

在容器配置文件中配置以下的指令

      sh -c "ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone && nginx -g 'daemon off;'"

为什么要加 nginx -g "daemon off;"

在常规的虚机上,nginx默认是以守护进程来运行的(daemon on),在后台默默提供服务,同时部署多个ngxin服务也不会相互干扰。

nginx -g directives: set global directives out of configuration file.

在容器环境,one container == one process,容器要能持续运行,必须有且仅有一个前台进程,所以对nginx进程容器化,需要将nginx转为前后进程( daemon off)。

我们能顺利执行docker run nginx,启动容器并不退出,是因为nginx的官方镜像Dockerfile 已经指定 nginx -g "daemon off;"

If you add a custom CMD in the Dockerfile, be sure to include -g daemon off; in the CMD in order for nginx to stay in the foreground, so that Docker can track the process properly (otherwise your container will stop immediately after starting)!

CMD在执行的shell脚本实际上是启动shell进程来执行,脚本执行完,进程就会退出(此时nginx还是一摊死的物理文件),所以我们要在脚本内再添加nginx -g "daemon off;" 将整个shell进程转为前台能持续运行的进程。

  • 无标签
写评论...