參考資料:
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等軟件登錄上去了。