無需安裝 vsftpd , 直接使用 FTP 來管理 docker 容器中的文件


無圖無真相,先放個效果圖:

 
 

背景

使用 docker 來跑一些服務很方便,但是有的時候想管理容器里面的文件卻很麻煩 -- 一般常規做法有3種:

  1. 通過數據卷或數據卷容器的方式
  2. 啟動容器的時候時候啟動 vsftpd 或者 sshd 等服務,並開啟端口映射,然后通過 ftp/sftp 連上去管理
  3. 進入容器的終端,通過命令行管理

但是這些做法都有一定的缺陷和不便:

1和2都是需要在啟動容器的時候做一些配置,如果容器已經啟動了就歇菜了。而且2需要額外的端口映射,占用主機的端口。3的做法比較 geek ,而容器中通常只有基礎的 shell 工具,沒有一個熟悉的工具套件環境,操作比較費時費力,不夠直觀。

解決方案: ftp-server-for-docker

我所能想到比較好的解決方案是綜合2和3的方案,構建一個不需要額外的啟動配置的 FTP 服務器:ftp-server-for-docker

這是一個 docker 專用的 FTP 服務器 - 允許通過 FTP 協議來訪問 docker 容器中的文件(即使 docker 容器已經啟動了也可以的喲)。基於 linux shell sh 和 docker 的 docker cp.

如何安裝

推薦使用 npm 安裝:

npm install -g ftp-server-for-docker 

如何運行

示例1

比如說在 localhost:21 上啟動 FTP 服務器,並運行 test 用戶通過密碼 123456 來訪問:

$ ftp-server-for-docker -H localhost -p 21 --users test:123456 FtpServer start listening at localhost:21 

示例2

使用 ftp-server-for-docker 來瀏覽容器 wordpress 中的文件:

查看命令行幫助

想要知道更多使用方法,可以查看命令行幫助:

$ ftp-server-for-docker --help Usage: ftp-server-for-docker [options] Options: --port, -p Specify which port to listen on(default is 21) [number] --host, -H Specify which host to bind(default is 0.0.0.0) [string] --annoymous, -a Whether enable annoymous user [boolean] --users, -u Specify users (in form like username:password, can be multiple) [array] --config, -c Specify which configuration file to use --debug Whether enable debug mode [boolean] -h, --help Show help [boolean] -?, --help Show help [boolean] Examples: ftp-server-for-docker -h localhost -p 21 Start the FTP Server on -u test:123 localhost:21, allow user `test` to access. 

實現原理

這個 FTP 服務器網絡方面采用了比較成熟的 ftpd ,而文件系統模塊替換成了新寫的 Docker FS.

文件系統的基本操作(stat/readdir/open/unlink...)都是通過 docker execdocker cp和臨時文件來完成,比如:

  • stat 是通過 docker exec <container> stat xxx 來查看文件狀態
  • readdir 是通過 docker exec <container> ls -1 --color=none 來列出目錄下的文件
  • open 是通過 docker cp <container>:<path> <temp-path> 把容器中的文件拷貝到臨時文件中,然后再讀取的

具體實現流程參見源代碼

關於 TypeScript

這個項目中的主要源代碼都使用 TypeScript -- 都是在 src/*.ts 中,通過 tsc 編譯后生成成 lib/*.js,最終npm打包的只有 lib/*.js 沒有 src/*.ts.

這是我第一次使用 TypeScript. TypeScript 的強類型帶來很多方便,也帶來很多不便。綜合而言,TypeScript 讓我想起了曾經使用過的 C#,結合 Visual Studio Code 來用還是利大於弊。TypeScript 能在編輯和編譯的時候就檢查出很多類型問題,而且智能提示確實很棒。

常見問題

  1. FileZilla 無法列出目錄結構 -- 可以嘗試配置傳輸模式為 主動模式,被動模式還有問題,正在解決ing...
  2. 中文目錄顯示亂碼 -- 已知問題,正在解決ing...

如有其他問題,歡迎來提 issue , 當然更歡迎 fork 並解決后來提 PR.

 

 

原文地址:http://www.clarencep.com/2017/04/15/ftp-server-for-docker/ 轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM