【Docker项目实战】使用Docker部署FTP服务器
一、FTP服务介绍
1.1 FTP简介
FTP
(File Transfer Protocol)是一种用于在网络上传输文件的标准协议,其核心特性是通过 控制连接(用于发送命令和响应,默认端口21)和 数据连接(用于传输文件数据)实现文件传输。根据数据连接的建立方式,FTP分为两种工作模式:主动模式(Active Mode)和被动模式(Passive Mode)。
1.2 FTP模式介绍
1. 主动模式(Active Mode)
-
工作原理:
- 客户端通过任意高端口(>1024)连接服务器的21端口(控制连接)。
- 客户端发送
PORT
命令,告知服务器一个本地监听的高端口(如50001)。 - 服务器从20端口主动连接客户端的指定端口(50001),建立数据连接进行文件传输。
-
特点:
- 连接方向:服务器主动发起数据连接到客户端。
- 端口使用:服务器固定使用20端口,客户端使用随机高端口。
- 防火墙限制:客户端需开放高端口以接收服务器的连接,否则防火墙可能拦截。
- 安全性:服务器暴露20端口,客户端需开放动态端口,安全性较低。
-
适用场景:
- 客户端位于受信任的网络环境(如局域网),且防火墙允许服务器主动连接。
- 服务器对客户端的访问权限有严格控制。
2. 被动模式(Passive Mode)
-
工作原理:
- 客户端通过任意高端口(>1024)连接服务器的21端口(控制连接)。
- 客户端发送
PASV
命令,请求服务器进入被动模式。 - 服务器随机分配一个高端口(如50001),并通过控制连接将该端口告知客户端。
- 客户端主动连接服务器的指定端口(50001),建立数据连接进行文件传输。
-
特点:
- 连接方向:客户端主动发起所有连接。
- 端口使用:服务器和客户端均使用随机高端口(>1024)。
- 防火墙适配:客户端主动连接服务器的高端口,兼容防火墙和NAT环境。
- 安全性:服务器仅暴露控制端口(21)和被动端口范围,客户端无需开放端口,更安全。
-
适用场景:
- 客户端位于防火墙或NAT后(如公网用户访问内网服务器)。
- 服务器需支持大量客户端连接,且防火墙策略复杂。
3. 主动模式 vs. 被动模式
特性 | 主动模式 | 被动模式 |
---|---|---|
数据连接发起方 | 服务器 | 客户端 |
典型端口 | 服务器20端口,客户端随机高端口 | 服务器和客户端均随机高端口 |
防火墙兼容性 | 需客户端开放高端口,易被拦截 | 客户端主动连接,兼容性高 |
安全性 | 服务器暴露20端口,风险较高 | 客户端无需开放端口,风险较低 |
配置复杂度 | 简单(服务器固定端口) | 需配置服务器的被动端口范围 |
适用场景 | 客户端与服务器在同一局域网 | 客户端在防火墙/NAT后 |
1.3 如何选择FTP模式?
- 主动模式:适合服务器和客户端处于同一网络或客户端防火墙策略宽松的场景。
- 被动模式:适合客户端在防火墙/NAT后,或服务器需支持大规模公网访问的场景。
在实际应用中,被动模式因兼容性和安全性优势更常用。若遇到连接问题,需检查:
- 服务器是否配置了正确的被动端口范围(如
50000-60000
)。 - 防火墙/路由器是否开放了服务器的被动端口范围。
- 客户端是否禁用了防火墙或允许出站连接。
二、本次实践规划
2.1 本地环境规划
本次实践为个人测试环境,操作系统版本为 Ubuntu 24.04.2 LTS。
hostname | IP地址 | 操作系统版本 | Docker版本 | 部署项目 |
---|---|---|---|---|
jeven01 | 192.168.3.88 | Ubuntu 24.04.2 LTS | 28.3.3 | FTP |
2.2 本次实践介绍
1.本次实践部署环境为个人测试环境,生产环境请谨慎;
2.在Docker环境下部署FTP服务器。
三、本地环境检查
3.1 检查Docker服务状态
检查Docker服务是否正常运行,确保Docker正常运行。
root@jeven:~# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)
Active: active (running) since Mon 2025-08-04 10:10:52 UTC; 30min ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 860 (dockerd)
Tasks: 10
Memory: 97.2M (peak: 98.4M)
CPU: 606ms
CGroup: /system.slice/docker.service
3.2 检查Docker版本
检查Docker版本
root@jeven:~# docker -v
Docker version 28.3.3, build 980b856
3.3 检查docker compose 版本
检查Docker compose版本,确保2.0以上版本。
root@jeven:~# docker -v
Docker version 28.3.3, build 980b856
四、拉取FTP镜像
下载拉FTP容器镜像,如下所示
docker pull fauria/vsftpd
五、部署FTP服务
5.1 创建部署目录
- 创建部署目录
mkdir -p /data/ftp/data && mkdir -p /data/ftp/log
- 目录授权
chmod -R 755 /data/ftp
5.2 编辑部署文件
使用docker-cli方式部署,可参考以下命令:
docker run -d \
--name vsftpd \
--restart=always \
-v /data/ftp/data/:/home/vsftpd \
-v /data/ftp/log/:/var/log/vsftpd/ \
-p 20:20 -p 21:21 -p 20000:20000 \
-e FTP_USER=admin \
-e FTP_PASS=admin \
-e PASV_MIN_PORT=20000 \
-e PASV_MAX_PORT=20000 \
-e PASV_ADDRESS=192.168.3.88 \
-e LOG_STDOUT=1 \
fauria/vsftpd
在部署目录下,创建docker-compose.yaml文件,内容如下所示:
vim docker-compose.yaml
version: '3.9'
services:
vsftpd:
image: fauria/vsftpd
environment:
- LOG_STDOUT=1
- PASV_ADDRESS=192.168.3.88
- PASV_MAX_PORT=20000
- PASV_MIN_PORT=20000
- FTP_PASS=admin
- FTP_USER=admin
ports:
- '20000:20000'
- '21:21'
- '20:20'
volumes:
- '/data/ftp/log/:/var/log/vsftpd/'
- '/data/ftp/data/:/home/vsftpd'
restart: always
container_name: vsftpd
5.3 创建FTP容器
执行以下命令,创建FTP容器。
docker compose up -d
5.4 查看FTP容器状态
检查FTP容器运行状态,确保FTP容器正常启动。
root@jeven:~# docker compose ps
WARN[0000] /root/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
vsftpd fauria/vsftpd "/usr/sbin/run-vsftp…" vsftpd 50 seconds ago Up 50 seconds 0.0.0.0:20-21->20-21/tcp, [::]:20-21->20-21/tcp, 0.0.0.0:20000->20000/tcp, [::]:20000->20000/tcp
六、连接FTP服务器
6.1 安装FTP客户端
在宿主机上安装FTP客户端,执行以下命令:
apt install ftp -y
6.2 连接FTP服务器
直接使用以下命令,连接FTP服务端。输入设置的账号密码admin/admin,即可连接成功。
ftp 192.168.3.88
6.3 测试上传
- 上传文件
!echo "hello ftp" > upload_test.txt
put upload_test.txt
- 下载文件
ftp> lcd /tmp
Local directory now: /tmp
ftp> get upload_test.txt
local: upload_test.txt remote: upload_test.txt
229 Entering Extended Passive Mode (|||20000|).
150 Opening BINARY mode data connection for upload_test.txt (10 bytes).
100% |************************************************************************************************| 10 180.84 KiB/s 00:00 ETA
226 Transfer complete.
10 bytes received in 00:00 (37.13 KiB/s)
ftp>
ftp> exit
221 Goodbye.
root@jeven:~# ls /tmp/upload_test.txt
/tmp/upload_test.txt
root@jeven:~# ls -l /tmp/upload_test.txt
-rw-r--r-- 1 root root 10 8月 14 15:08 /tmp/upload_test.txt
在本地浏览器也可以连接FTP服务器,输入地址: ftp ://192.168.3.88 ,如下所示:
七、总结
通过本次Docker部署FTP服务器的实战,我们高效实现了服务的快速搭建与环境隔离,显著提升了部署的灵活性与可重复性。利用Docker容器化技术,FTP服务具备了良好的可移植性和一致性,便于在不同环境中快速复制和扩展。合理的数据卷挂载策略确保了用户文件的持久化存储,有效避免了容器重启导致的数据丢失风险。整个过程体现了容器化技术在简化运维流程、提升系统可靠性方面的显著优势。
- 点赞
- 收藏
- 关注作者
评论(0)