データアナリティクス事業本部の鈴木です。
FTPを使った通信の、FTPクライアントを使った実装を検証したいことがあり、便利なdockerイメージとFTPクライアントを使って、環境を構築してみました。
最初は特にFTPサーバーを構築するところが大変そうだなと悩んでいましたが、docker-pure-ftpd
という便利なイメージが公開されていたのでとても簡単に検証環境を作ることができました。
準備
環境
以下の環境で検証しました。
- macOS Monterey
- LFTP Version 4.9.2
FTPサーバー
docker-pure-ftpd
イメージを使いました。
Dockerfileなどは以下のGitHubレポジトリで公開されています。
docker-compose.ymlのサンプルもGitHubレポジトリにて公開されているので、参考にして以下のyamlファイルを作成しておきました。 今回はあくまでローカル上での練習用なので、通信の暗号化はしていないのでご注意ください。
docker-compose.yml
version: '3'
services:
ftpd_server:
image: stilliard/pure-ftpd
container_name: pure-ftpd
ports:
- "21:21"
- "30000-30009:30000-30009"
# docker-compose.ymlがあるディレクトリに、コンテナとの共有ディレクトリを作る
volumes:
- "./data:/home/username/"
- "./passwd:/etc/pure-ftpd/passwd"
environment:
PUBLICHOST: "localhost"
FTP_USER_NAME: username
FTP_USER_PASS: mypass
FTP_USER_HOME: /home/ftpusers/username
restart: always
FTP_USER_NAME
環境変数のユーザー名とFTP_USER_PASS
環境変数のパスワードでユーザーが作成されます。このユーザーのホームはFTP_USER_HOME
環境変数の場所になります。この場所はvolumes
でdocker-compose.ymlがあるディレクトリのdata
ディレクトリと共有するように設定しました。
FTPクライアント
今回はLFTPを使いました。LFTPのGitHubレポジトリは以下になります。
macの場合はHomebrew Formulaeに記載があり、homebrewでインストールできることが分かったので、以下のコマンドでインストールしました。
brew install lftp
やってみる
コンテナを起動する
docker-compose.yml
があるディレクトリでdocker-compose up
を実行し、コンテナを起動します。
docker-compose up
FTP_USER_NAME
環境変数で設定したユーザー名と、FTP_USER_PASS
環境変数で設定したパスワードでログインできることを確認しました。
# lftp の起動
lftp
# 以下はlftpのコマンド入力
lftp :~> open -u username ftp://localhost/
#パスワード: FTP_USER_PASS環境変数で設定したパスワード
ログインすると、ディレクトリはコンテナ側の、FTP_USER_HOME
環境変数で設定した場所になっています。
起動すると、ホスト側に共有ディレクトリが作成され、以下のようになっています。
.
├── data
├── docker-compose.yml
└── passwd
ファイルを受け渡ししてみる
簡単にですが、ファイルを受け渡しができるか確認しておきます。
新しく別のコンソールを開き、適当なsample.txt
というファイルをカレントディレクトリに作っておきます。
touch sample.txt
sample.txt
と同じディレクトリでlftpでログインし、put
コマンドでファイルを送ってみます。
# ファイルの転送
lftp username@localhost:/> put ./sample.txt
# 結果の確認
lftp username@localhost:/> ls
-rw-r--r-- 1 1000 ftpgroup 0 Jun 18 13:49 sample.txt
送信できたことが確認できました。
今度はローカルのsample.txt
を削除しておいた状態で、FTPサーバー側からさっき送ったsample.txt
を取ってきます。
FTPサーバーに接続していない方のコンソールで以下を実行し、ファイルを削除しておきます。
rm sample.txt
ls sample.txt
# ls: sample.txt: No such file or directory
FTPサーバーに接続していない方のコンソールで以下を実行し、ファイルを取得します。
# ファイルの取得
lftp username@localhost:/> get sample.txt
FTPサーバーに接続していない方のコンソールで以下を実行し、取得したファイルを確認します。
ls sample.txt
# sample.txt
最後に
docker-pure-ftpd
イメージとLFTPで、ローカルにFTPの練習環境を構築してみました。
参考になりましたら幸いです。