参考资料:
https://www.cnblogs.com/Eric-Hwang/articles/4244287.html
https://github.com/fauria/docker-vsftpd
https://www.cnblogs.com/jbxie/p/12092293.html
光看上面三个参考资料而不知道原理,你是没办法在docker容器中成功把ftp服务起起来的。
首先是原理部分,ftp分为主动模式和被动模式。主动模式使用20和21端口,其中20为数据端口,21为控制端口。被动模式使用21控制端口和一个其他随机端口作数据端口。主动模式因为防火墙的原因,经常会断掉,因此被动模式是通常情况下的优选。当宿主机端口紧张的时候,我们只需要(至少需要)两个端口作端口映射,即一个21控制端口(例子中使用45009);一个其他非公认数据端口(例子中使用45010)。
知道了原理,我们拉一个别人封装好的vsftpd(开源ftp服务器)镜像即可很快地部署ftp。
docker pull fauria/vsftpd
什么?你已经有了一个容器,不想重新使用别人的镜像。那么你也只需要使用apt-get install vsftpd命令即可自己去起vsftpd服务。只是这个搭建的过程会踩一些坑,比如vsftpd启动脚本的bug,配置文件等。搜索引擎会帮到你。
下面还是专注于vsftpd docker。
我们有了一个docker,下面就只需要按照参考资料中的命令来做即可。具体命令如下:
docker run -d -v /data/ftp:/home/vsftpd -p 45009:21 -p 45010:45010 -e FTP_USER=ftpuser -e FTP_PASS=654321 -e PASV_ADDRESS=XX.XX.XX.XX -e PASV_MIN_PORT=45010 -e PASV_MAX_PORT=45010 --name ftpserver --restart=always fauria/vsftpd
下面解释一下:
1. -v /data/ftp:/home/vsftpd
这句话是将宿主机的/data/ftp文件夹和容器的home文件夹作一个映射,之后容器中上传的东西都可以在/data/ftp中看到。
2. -p 45009:21 -p 45010:45010
这句话就是原理部分的端口映射了
3. -e FTP_USR and FTP_PASS
设置初始的ftp用户和密码
4. PASV_ADDRESS=XXX
设置宿主机的ip地址即可。这个我的理解就是服务器不知道自己的外部ip,要显式地指定,这样在S to C交换信息的时候才不会出错。
5. PASV_MIN_PORT和PASV_MAX_PORT都设置成一样的
此时就仅开放一个端口作为数据端口了
容器运行起来之后就可以使用filezilla等软件登录上去了。