スキップしてメイン コンテンツに移動

すぐ作れる!DockerでFTPサーバーを構築

パソコンでコードを打ち込んでいるイメージ

DockerでFTPサーバーを構築する方法を紹介します。Docker公式レジストリからイメージをPULLしてすぐ使えます。

FTPは、社内システム開発など、まだまだ現役で使われている所が多いため、サクッと開発環境を構築したたい時に、DockerでFTPサーバーを構築できるのは便利です。

FTPサーバーには「Pure-FTPd」を使用します。

FTPサーバーのイメージをPULL

Docker公式のレジストリから、FTPサーバー(stilliard/pure-ftpd)のイメージをPULLします。

$ docker pull stilliard/pure-ftpd:latest

Docker runでFTPサーバーを起動する

PULLしたFTPサーバーのイメージを、以下のコマンドで起動します。

$ docker run -d --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e "PUBLICHOST=localhost" stilliard/pure-ftpd:latest

起動したコンテナのCONTAINER IDを調べます。

$ docker ps

CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                                      NAMES
44fdee748d14        stilliard/pure-ftpd:latest   "/bin/sh -c '/run.sh…"   27 seconds ago      Up 25 seconds       0.0.0.0:21->21/tcp, 0.0.0.0:30000-30009->30000-30009/tcp   ftpd_server

調べたCONTAINER IDを指定して、コンテナにアクセスします。

$ docker exec -it 44fdee748d14 bash

FTPユーザーを作成する

FTPのユーザを作成します。以下はtestというユーザを追加する場合の例です。

root@xxx:/# cd /home/ftpusers/
root@xxx:/home/ftpusers# pure-pw useradd test -f /etc/pure-ftpd/passwd/pureftpd.passwd -m -u ftpuser -d /home/ftpusers/test

Password: ********         (パスワード)
Enter it again: ********   (パスワード確認)

FTPのホームディレクトリを作成して、ディレクトリのアクセス権を変更します。

root@xxx:/home/ftpusers# mkdir test
root@xxx:/home/ftpusers# chown ftpuser:ftpgroup test
root@xxx:/home/ftpusers# ls -la

ホストマシンからFTPサーバーに接続する

作成したFTPサーバーに対して、ホストマシンからアクセスしてみます。今回はFFFTPを使った例で紹介しますが、FTPクライアントであれば何でもOKです。

接続先の設定

ホスト名は自分自身のコンテナにアクセスするため「localhost」です。ユーザ名、パスワードは上の手順で作成したユーザの情報を設定します。

FFTPの接続先設定

ファイルをアップロード

DockerのFTPサーバーに接続出来たら、適当なファイルをアップロードしてみましょう。

FFTPでDockerで作成したFTPサーバーにファイルをアップロードする所

正常にアップロードできればOKです。

FFTPでDockerで作成したFTPサーバーにファイルをアップロードした所

ホスト側でファイルをアップロードしたら、コンテナ側で以下のコマンドを叩いて、ファイルが登録されているか確認してみましょう。

root@xxx:/home/ftpusers# ls -lt
total 4
drwxr-xr-x 2 ftpuser ftpgroup 4096 Jul 17 01:33 test

データの永続化

ご存知の通り、Dockerはコンテナを削除すると、コンテナ内に保存されているデータは破棄されます。

少し手順は面倒ですが、Dockerのボリューム(Volume)を使えば、データの永続化が可能です。以下に手順を解説します。

ボリューム(Volume)の作成

まずは、Dockerのボリュームを次のコマンドで作成します。今回は「testvolume」という名前でボリュームを作成しています。

$ docker volume create testvolume

ボリュームの一覧は、以下のコマンドで取得できます。「testvolume」のボリュームが存在する事を確認しましょう。

$ docker volume ls

DRIVER              VOLUME NAME
local               testvolume

-vオプションでボリュームをマウントして、FTPサーバーのコンテナを起動します。(その他のコマンドオプションは、前で紹介したものと同じ)

$ docker run -d --name volume_ftpd_server -v testvolume:/data/ -p 21:21 -p 30000-30009:30000-30009 -e "PUBLICHOST=localhost" stilliard/pure-ftpd:latest

起動したコンテナのCONTAINER IDを調べて、コンテナにアクセスします。

$ docker ps

CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                                      NAMES
cc405c7e1cef        stilliard/pure-ftpd:latest   "/bin/sh -c '/run.sh…"   7 seconds ago       Up 5 seconds        0.0.0.0:21->21/tcp, 0.0.0.0:30000-30009->30000-30009/tcp   volume_ftpd_server

$ docker exec -it cc405c7e1cef bash
root@cc405c7e1cef:/#

ボリュームをホームディレクトリに指定してFTPユーザー作成

作成したボリュームをホームディレクトリ(-d /data/testの部分)に指定して、FTPのユーザを作成します。

root@xxx:/# cd /data/
root@xxx:/data# pure-pw useradd test -f /etc/pure-ftpd/passwd/pureftpd.passwd -m -u ftpuser -d /data/test

Password: ********         (パスワード)
Enter it again: ********   (パスワード確認)

FTPのホームディレクトリを作成して、ディレクトリのアクセス権を変更します。

root@xxx:/data# mkdir test
root@xxx:/data# chown ftpuser:ftpgroup test
root@xxx:/data# ls -la

drwxr-xr-x 3 root    root     4096 Jul 17 10:30 .
drwxr-xr-x 1 root    root     4096 Jul 17 10:13 ..
drwxr-xr-x 2 ftpuser ftpgroup 4096 Jul 17 10:30 test

これでデータの永続化の設定は完了です。この状態でFTPでファイルをアップロードすると、ボリュームにファイルが作成される為、コンテナを削除した場合でも、再度ボリュームをマウントすればファイルが残ります。

ボリュームのホスト側のパスを確認

作成したボリュームが、ホスト側のどのに保存されているのかは、以下のコマンド確認できます。

$ docker volume inspect testvolume
[
    {
        "CreatedAt": "2019-07-17T10:30:47Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/testvolume/_data",
        "Name": "testvolume",
        "Options": {},
        "Scope": "local"
    }
]

さいごに

DockerでFTPサーバーを構築する手順を紹介しました。簡単な手順でFTPサーバーを構築できて、さらに使い終わったら、コンテナイメージを削除すれば、キレイさっぱり無くなるので、開発用のFTPサーバーが必要な場合に、とても重宝します。

スポンサーリンク
スポンサーリンク
スポンサーリンク

コメント

このブログの人気の投稿

axiosの使い方まとめ (GET/POST/例外処理)

axiosの使い方まとめ (GET/POST/例外処理)最近何かとよく使うJavaScriptでAJAX通信を行うaxiosについて、簡単に使い方をまとめました。GETリクエストをaxiosで送るまずはGETリクエストをaxiosで送る方法です。const res =await axios.get('/users') console.log(res.data)分割代入の記法を使うと、以下のようにも書けますconst{data}=await axios.get('/users') console.log(data)クエリパラメータ (URLパラメータ)を指定クエリパラメータを指定する方法は2つあります。1つ目は、axios.getに指定するURLに直接記述する方法です。axios.get('/user?id=123')2つめは、axios.getの第2引数に、オプション指定する方法です。axios.get('/user',{ params:{ id:123}})POSTリクエストをaxiosで送る次はPOSTリクエストをaxiosで送る方法です。JSON形式でPOSTするJSON形式でPOSTする場合は、axios.postの第2引数に、送信するデータをJavaScriptオブジェクトで指定します。const res =await axios.post('/user',{ id:123, name:'Yamada Tarou'})application/x-www-form-urlencoded形式でPOSTするapplication/x-www-form-urlencoded形式でPOSTする場合は、URLSearchParamsを使います。var params =newURLSearchParams() params.append('id',123) params.append('name','Yamada Tarou')const res =await axios.post('/user', params)axios でファイルをアップロードする画像などのファイルを、axiosでアッ…

[VB, C#] Windows 8, Window 10 で ImeModeが制御できない問題を解決する

[VB, C#] Windows 8, Window 10 で ImeModeが制御できない問題を解決するタイトルの通りですが、Windows 8 以降では Windows Form アプリケーションで、コントロールの ImeMode に Katakana や KatakanaHalf を設定しても、カタカナになってくれません。なぜ ImeMode が効かないのか?Windows 8 以降、IME Mode の切り替えは、ユーザー単位で切り替わるようになった為、アプリから IME Mode 制御が出来ないようになりました。
(IME をON にした場合、常に ひらがな モードになます)※ Windows 7までは、IME Modeの切り替えはアプリ単位で行われていた為、問題なくアプリから IME制御が行えました。対処方法Windows 8 以降、IMEの制御は、InputScope クラスの利用が推奨されています。
しかし、InputScope クラスは、WPF、Windows ストアアプリでしか使えない為、Windows Formアプリでは使用できません。
(Windows Form はもう使うな!という事でしょうか (涙) )結論としては、コントールパネルの設定で、IMEの制御をユーザ単位から アプリ単位に変更する事ができます。
これで、Windows Formアプリでも 従来通りIMEの制御を行う事が出来ます。おわりにこの方法だと、アプリをインストールする端末すべてに設定が必要となり、とっても面倒です。。。
しかし、今の所これしか方法がない状態です。
これからは Windows Formではなく、WPFや Windows ストアアプリで作れという事ですかね (^^;)

MailKitの使い方! エンコーディング指定や添付ファイをメールで送信する方法[C#/VB Tips]

MailKitの使い方! エンコーディング指定や添付ファイをメールで送信する方法[C#/VB Tips]MailKitを使ってメールを送るサンプルコードです。(C#)UTF8/iso-2022-jpのエンコーディング指定、GMail/YahooのSMTPサーバで送るなど、4つのサンプルコードでMailKitの使い方を紹介します。MailKitって何?2017年に.NET標準のSystem.Net.Mail.SmtpClientが廃止予定となり、Microsoftより今後はオープンソースライブラリである、MailKitに置き換えるとアナウンスがありました。既にSmtpClientは非推奨になっており、今後は廃止されていきます。現在、SmtpClientを使用したソースコードには、Visual StudioからMailKitを使うよう警告が出るようになっています。さっそく、MailKitを使ってメールを送信するサンプルコードを作っていきます。UTF8でメールを送信文字エンコーディングを、UTF8でメールを送信するサンプルコードです。
MailKitは、デフォルトの文字エンコーディングがUTF8なっている為、シンプルなコードでメールを送信する事ができます。var host ="<smtp server name>"; var port =25;// or 587using(var smtp =new MailKit.Net.Smtp.SmtpClient()){//SMTPサーバに接続する smtp.Connect(host, port, MailKit.Security.SecureSocketOptions.Auto);//認証が必要な場合は、以下のコメントを解除//smtp.Authenticate("<id>", "<password>");//送信するメールを作成する var mail =new MimeKit.MimeMessage(); var builder =new MimeKit.BodyBuilder(); mail.From.Add(new MimeKit.MailboxAddress("",&quo…