ftp分為主動模式(PORT)和被動模式(PASV)。主動模式使用20和21端口,其中20為數據端口,21為控制端口。被動模式使用21控制端口和一個其他隨機端口作數據端口。主動模式因為防火牆的原因,經常會斷掉,因此被動模式是通常情況下的優選。當宿主機端口緊張的時候,我們只需要(至少需要)兩個端口作端口映射,即一個21控制端口;一個其他非公認數據端口。
前提:有docke環境后,可以開始搭建。
搜索一下別人封裝好的 vsftpd (開源的ftp服務器)鏡像。
# docker search vsftpd
然后根據需要選擇鏡像,一般都拉取使用量最高的鏡像,這里是 fauria/vsftpd。
# docker pull fauria/vsftpd
等同於把安裝包安裝成可運行的軟件,我們把拉取的 vsftp 鏡像創建一個容器實例。在創建時需要指定一些運行參數。
# docker run -d \
-v /home/webapps:/home/vsftpd \
-v /var/log/vsftpd/:/var/log/vsftpd/ \
-p 20:20 -p 21:21 -p 20000:20000 \
-e FTP_USER=test \
-e FTP_PASS=test \
-e PASV_MIN_PORT=20000 \
-e PASV_MAX_PORT=20000 \
-e PASV_ADDRESS=宿主機ip地址 \
-e LOG_STDOUT=1 \
--name vsftpd --restart=always \
fauria/vsftpd
下面來解釋一下:
1. -v /home/webapps:/home/vsftpd
這句話是將宿主機的 /home/webapps 文件夾和容器的 /home/vsftpd 文件夾作一個映射,之后容器中上傳的東西都可以在 /home/webapps 中看到。
2. -p 20:20 -p 21:21 -p 21100-21110:21100-21110
這句話就是原理中的端口映射了,冒號前是宿主機暴露的端口,冒號后是容器實例啟動的端口。補充一點是,要映射21端口才能訪問ftp,映射20端口才能查看到文件。、
3. -e FTP_USR and FTP_PASS
設置初始的ftp用戶和密碼
4. PASV_ADDRESS=X.X.X.X
這里需要填寫宿主機的ip地址
5. PASV_MIN_PORT和PASV_MAX_PORT都設置成一樣的
此時就僅開放一個端口作為數據端口了
容器運行起來之后就可以登錄測試了。
當然如果是公有雲服務器,需要在安全組規則開啟上面用到的端口
除了安全組規則開放之外,一般服務器還會設置得有 firewalld 規則,所以需要服務器開啟端口。
# firewall-cmd --zone=public --add-port=20/tcp --permanent
# firewall-cmd --zone=public --add-port=21/tcp --permanent
# firewall-cmd --permanent --zone=public --add-port=20000/tcp
# firewall-cmd --reload
在創建容器時我們設置了ftp的用戶和密碼,我們還可以增加用戶,用戶信息保存在 /etc/vsftpd/virtual_users.txt 這個文件中。當然這個文件在容器內部,我們需要進入容器。
先看一下容器是否正常啟動
# docker ps
能夠看到啟動的容器,我們進入容器查看用戶
# docker exec -it vsftpd /bin/bash
# vi /etc/vsftpd/virtual_users.txt
可以看到我們指定的用戶和密碼都在這個文件中,在文件中添加新用戶的用戶名和密碼:奇數為帳號,奇數相鄰的偶數為密碼。創建容器時未設置用戶名和密碼,系統會默認創建用戶和隨機密碼。
帳號和目錄是對應的,每個賬號對應一個用戶目錄,所以我們需要在/home下創建一個與賬號同名的目錄。
# mkdir /home/vsftpd/<username>
hash處理登錄的驗證信息並寫入數據庫
# /usr/bin/db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db
用戶密碼都配置完之后,我們需要重啟一下容器,讓配置生效。退出容器
# exit
# docker restart vsftpd
然后我們可以訪問驗證了
linux 訪問
# yum install -y ftp
# ftp <ip>
輸入用戶名
輸入密碼
登錄成功
ftp> ls 查看文件
windows 訪問
1、在瀏覽器中訪問:ftp://