使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

使用 Docker 部署 FTP 和 Nginx 通过 HTTP 访问 FTP 里的文件,这是一个常见的需求,通常用于将存储在 FTP 服务器上的文件通过 Web 方式提供访问。以下是如何操作的详细步骤:

1. 部署 FTP 服务器 (vsftpd)

我们使用 fauria/vsftpd 镜像,因为它配置简单且常用。

  • 创建存储目录: 在宿主机上创建一个目录用于 FTP 存储文件。

    shell 复制代码
    mkdir -p /path/to/ftp/data

    /path/to/ftp/data 替换为你希望使用的实际路径。

  • 运行 vsftpd 容器:

    shell 复制代码
    docker run -d -p 21:21 -p 20:20 -p 21100-21110:21100-21110 \
        -v /path/to/ftp/data:/home/vsftpd \
        -e FTP_USER=ftpuser -e FTP_PASS=ftppass \
        -e PASV_ENABLE=YES -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 \
        --name ftpserver fauria/vsftpd
    • -p 21:21 -p 20:20: 映射 FTP 的控制端口 (21) 和数据端口 (20)。
    • -p 21100-21110:21100-21110: 映射被动模式的端口范围。被动模式对于 Docker 环境很重要。
    • -v /path/to/ftp/data:/home/vsftpd: 将宿主机目录挂载到容器内的 FTP 用户目录。
    • -e FTP_USER=ftpuser -e FTP_PASS=ftppass: 设置 FTP 用户名和密码。请务必修改为你自己的用户名和密码。
    • -e PASV_ENABLE=YES -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110: 启用被动模式并指定端口范围,这对于在 Docker 容器中使用 FTP 非常重要。
    • --name ftpserver: 为容器命名。
  • 验证 FTP 连接: 使用 FTP 客户端(如 FileZilla)连接到你的服务器。

2. 部署 Nginx

  • 创建 Nginx 配置文件: 创建一个名为 nginx.conf 的文件,内容如下:

    nginx 复制代码
    user  root; # 用户使用root,否则没有权限访问FTP用户上传的文件
    worker_processes  auto;
    
    error_log  /var/log/nginx/error.log notice;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        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  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        #include /etc/nginx/conf.d/*.conf;  # 注释掉这句,否则里面的默认配置会覆配置盖下面的server配置
            server {
                    listen       80;
                    listen  [::]:80;
                    server_name  localhost; # 修改为你的域名或 IP 地址
    
                    location / {
                            root   /ftp/data; # Nginx 访问的根目录,稍后会通过挂载 FTP 数据目录实现
                            index  index.html index.htm;
                    }
    
                    error_page   500 502 503 504  /50x.html;
                    location = /50x.html {
                            root   /ftp/data;
                    }
            }
    }
  • 运行 Nginx 容器:

    Bash

    复制代码
    docker run -d -p 80:80 \
        -v /path/to/ftp/data:/ftp/data \
        -v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf \
        --name webserver nginx:latest
    • -p 80:80: 映射 Nginx 的 80 端口。
    • -v /path/to/ftp/data:/ftp/data: 关键步骤! 将 FTP 数据目录挂载到 Nginx 容器内的 /ftp/data 目录。这样 Nginx 就可以访问 FTP 上的文件了。
    • -v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf: 将我们创建的 Nginx 配置文件挂载到容器内。
    • --name webserver: 为容器命名。
    • nginx:latest: 使用最新的 Nginx 镜像。

3. 访问 FTP 文件

现在,你可以通过浏览器访问服务器的 IP 地址 (例如 http://your_server_ip) 来浏览 FTP 上的文件。Nginx 将会提供一个文件列表,你可以点击链接下载文件。

使用 Docker Compose (推荐)

使用 Docker Compose 可以更方便地管理多个容器。创建一个名为 docker-compose.yml 的文件,内容如下:

yaml 复制代码
version: "3.9"
services:
  ftpserver:
    image: fauria/vsftpd
    ports:
      - "21:21"
      - "20:20"
      - "21100-21110:21100-21110"
    volumes:
      - ./ftpdata:/home/vsftpd # 注意使用相对路径
    environment:
      - FTP_USER=ftpuser
      - FTP_PASS=ftppass
      - PASV_ENABLE=YES
      - PASV_MIN_PORT=21100
      - PASV_MAX_PORT=21110
    restart: always

  webserver:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./ftpdata:/ftp/data # 共享同一个数据卷
      - ./nginx.conf:/etc/nginx/nginx.conf # 挂载配置文件
    depends_on:
      - ftpserver # 依赖于 ftpserver 启动
    restart: always
volumes:
 ftpdata: #定义数据卷

在该文件所在目录下运行 docker-compose up -d 即可同时启动 FTP 和 Nginx 容器。

关键点和注意事项:

  • 被动模式 (PASV): 在 Docker 环境中,FTP 客户端通常需要使用被动模式。确保正确配置被动模式的端口范围。
  • 数据卷: 使用数据卷来共享 FTP 和 Nginx 容器之间的文件。这是实现此功能的关键。
  • 安全性: 上述配置只是一个基本的示例。在生产环境中,你需要考虑安全性问题,例如使用 SFTP 而不是 FTP,配置防火墙,限制访问权限等。
  • 端口映射: 确保宿主机上没有其他服务占用这些端口。
  • 文件权限: 确保 FTP 容器和 Nginx 容器都具有访问共享目录的正确权限。

希望以上步骤能够帮助你成功搭建 FTP 和 Nginx 服务,并通过 HTTP 访问 FTP 上的文件。使用 Docker Compose 可以大大简化部署和管理过程,强烈推荐使用。

相关推荐
计算机小手8 小时前
一个带Web UI管理的轻量级高性能OpenAI模型代理网关,支持Docker快速部署
经验分享·docker·语言模型·开源软件
坚持学习前端日记9 小时前
常见docker指令
docker·容器·eureka
小芳矶10 小时前
Dify本地docker部署踩坑记录
python·docker·容器
70asunflower10 小时前
阿里云无影云电脑 Docker 使用完全指南
阿里云·docker·云计算
feasibility.12 小时前
在OpenCode使用skills搭建基于LLM的dify工作流
人工智能·低代码·docker·ollama·skills·opencode·智能体/工作流
lpruoyu13 小时前
【Docker进阶-02】Docker命令
docker·容器
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.14 小时前
Nginx构建PC站点:root与alias详解
运维·chrome·nginx
FLGB14 小时前
Docker网段和服务器内部网段172.17 网段冲突导致网络不通
服务器·网络·docker
骂我的人都死了16 小时前
DevOps架构部署
运维·ubuntu·docker·k8s·github·devops·python3.11
AL31717 小时前
模拟实现NetDevOps全生命周期自动化网络运维
运维·docker·centos·ensp·netmiko