- 由 虚拟的现实创建于2月 01, 2024 需要 3 分钟阅读时间
需求描述
快速搭建内部文件共享的平台,支持 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进程转为前台能持续运行的进程。
- 无标签