Dockerコンテナにftp接続するには pure-ftpdならdockerイメージあるみたい

今回も解決できてないので、お時間ある方のみご照覧ください。

ローカル環境(Windows 10 Home)でのKUSANAGI Runs on Dockerでの話です。

どういうことかというと、

f:id:ts0818:20170610211145j:plain

こういうことですね。ホストOS側から新しいthemeをアップロードしようとしたところ、Dockerコンテナ(kusanagi-data[BusyBox])側とftp接続せんと進まない模様。

Dockerコンテナは外部からアクセスできない様に設計されてるらしいはずですが、WordPressftp接続を求めているようです。(駄目じゃん)

Dockerコンテナとftp接続には proftpd? pure-ftpd? vsftpd?

ftpサーバって無茶苦茶たくさんあるみたいですね。

ftpサーバー(ftpd)比較 - Qiita

で、pure-ftpdってなんなのかというと、

Pure-FTPd is a free (BSD), secure, production-quality and standard-conformant FTP server. It doesn't provide useless bells and whistles, but focuses on efficiency and ease of use. It provides simple answers to common needs, plus unique useful features for personal users as well as hosting providers. 

Pure-FTPd - About

⇩  ということらしく下記サイトが詳しいです

Pure-FTPd の存在を知ってしまったので試さざるを得ない - Qiita

 

pure-ftpdは、dockerイメージが用意されているらしく、その名もdocker-pure-ftpd

DockerでFTPサーバーやSFTPサーバーをたてるのーと - Qiita

docker-pure-ftpd

ftpサーバ用のコンテナを起てるほうが良いみたいですね。(CentOS7のコンテナの中にftpサーバを入れるもんだと思っていたんですが)

nginx - FTP into existing Docker Containers - Stack Overflow

そして、pure-ftpdのdockerイメージがあるということで、dockerコンテナ(pure-ftpd) を作る流れですね。

⇩  Git Hubで導入手順が公開されてるのでトライしていきます

GitHub - stilliard/docker-pure-ftpd: Docker Pure-ftpd Server

 

仮想マシンを起動してない場合は起動しておきます。

docker-machine start kusanagi-machine

 

『 This error may also indicate that the docker daemon is not running.』となるときは、

Docker - dockerコマンドをコマンドプロンプトから利用(66952)|teratail

docker pull stilliard/pure-ftpd:hardened

f:id:ts0818:20170610211146j:plain

pure-ftpd用のDockerFileの作成 (ファイルの配置場所はどこでも良いみたいです)

E:¥kusanagi-docker¥Dockerfileとしてみました。 

f:id:ts0818:20170611102309j:plain

FROM stilliard/pure-ftpd

# e.g. you could change the defult command run:
CMD /run.sh -c 30 -C 5 -l puredb:/etc/pure-ftpd/pureftpd.pdb -E -j -R 

Dockerfileが作成できたら保存します。拡張子なしで「Dockerfile」として保存しました。拡張子が付いてしまう場合は、『名前の変更(M)』で拡張子以降を無くします。

f:id:ts0818:20170611102310j:plain

 そしたら、Dockerfileからコンテナ(pure-ftpd)を起動します。

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

f:id:ts0818:20170611102308j:plain

 コンテナ(pure-ftpd)にログインします。

docker exec -it ftpd_server /bin/bash

f:id:ts0818:20170611102311j:plain

仮想マシンsshしないと駄目みたい...見本だと特にsshログインしてる様子はないんですが、自分の場合はsshログインしないと駄目でした。

f:id:ts0818:20170611102312j:plain

コンテナにログインできたら、ftpユーザーを作成するようです。useraddで指定したものがftpユーザー名、Passwordで入力したものがftpパスワードになるようです。

pure-pw useradd ts0818 -f /etc/pure-ftpd/passwd/pureftpd.passwd -m -u ftpuser -d /home/ftpusers/ts0818

f:id:ts0818:20170611102314j:plain

できてないじゃん....bobしか駄目なのかな? と思ったら自分でディレクトリを作成しないといけないみたいです。

DockerでFTPサーバーを構築したら簡単すぎた - メンチカツには醤油でしょ!!

cd /home/ftpusers/
makdir ts0818
chown ftpuser:ftpgroup ts0818

f:id:ts0818:20170611111219p:plain

このフォルダとffftpなどで接続できるらしいんですが、このコンテナだとWordPressのthemesフォルダがないんですが....嫌な予感がしますね。

 とりあえずは、ホスト名(IPアドレス)の問題に進みますかね。

 

Dockerのネットワーク

⇩   Dockerのネットワークややこしいですね、ですが下記サイトが詳しいです

Dockerを活用するためのネットワーク関連操作のおさらい - Qiita

 

ローカル環境(Windows 10 Home)でのKUSANAGI Runs on Dockerの場合、ホストOS(Windows 10 Home)からDocker_Hostに、Docker_Hostから各々のdockerコンテナにという流れで接続されてるのだと思われます。

今回、ホストOSWindows 10 Home)にあるffftpで、dockerコンテナ(kusanagi-data[busybox])とftp接続したいんですが、dockerコンテナ(ftpd-server[pure-ftpd])というコンテナを別に作成してます。

図みたいなことができるのか謎ですが、dockerコンテナ(kusanagi-data[busybox])にWordPressのthemesフォルダがあるので、そこにアップロードできないと終了ですね

f:id:ts0818:20170611123829p:plain

dockerコンテナ(kusanagi-nginx[CentOS7])にもWordPressがあることが分かったので、 dockerコンテナ(kusanagi-nginx[CentOS7])にftpサーバーを直接インストールしたほうが良いのかもです。

どちらにしろ、dockerコンテナにホスト(Windows 10 Home)からアクセスできないことには駄目そうです。

Dockerコンテナに外部からアクセスする方法 – ムッシューのIT備忘録

 

Docker_Hostのほうのネットワーク

f:id:ts0818:20170616213425j:plain

仮想マシン(Docker_Host)のIPアドレス確認

docker-machine ip kusanagi-machine

コンテナの一覧を確認します。

が、なぜか、docker-compose ps が機能せず、

docker-compose -p kusanagi-machine ps

仮想マシン(Docker_Host)を指定してpsしたら動きました。

Docker-compose ps not showing any output · Issue #2188 · docker/compose · GitHub

f:id:ts0818:20170616223042j:plain

で、docker-composeした場合は独自のネットワークができるみたいです。

Compose のネットワーク機能 — Docker-docs-ja 1.13.RC ドキュメント

docker-compose で立ち上げたコンテナの IP アドレスを調べる - Qiita

 

ということで、dockerに存在するネットワーク一覧をチェックします。 

docker network ls

docker-compose で別の docker-compose.yml で作ったコンテナとリンクする (ネットワークを繋げる) - Qiita

f:id:ts0818:20170617111613j:plain

dokcer-compose up -d でも確認できるらしいのですが、 

docker-compose up -d

f:id:ts0818:20170617112325j:plain

既にコンテナが起動してる場合にはエラーになってしまうようです。

仮想マシン起動時(docker-machine start kusanagi-machineしたとき)にkusanagi-dataコンテナが自動で起動するためと思われます。

で、コンテナのIPアドレスだけを確認する場合は、 

 docker inspect -f "{{.NetworkSettings.Networks.NETWORK.IPAddress}}" CONTAINER

でいけるようです。CONTAINERの部分は、コンテナのNAME(docker psしたときとかのNAMEの部分)で大丈夫そうです。

f:id:ts0818:20170617120815j:plain

 他には、コンテナID以外の情報が入ってしまいますが、

 docker network inspect kusanagimachine_default

を実行する方法でもコンテナのIPアドレスが確認できるようです。

    
[
    {
        "Name": "kusanagimachine_default",
        "Id": "1be8a37884ff8d5446c881c077d40ddf2eeaf2f7714b430d30013364e1bc0b4c",
        "Created": "2017-05-28T06:17:11.991220934Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "Containers": {
            "18189b3f1b983c3135bb5f7c03f5636b16ef57b6ecaf6657b8d26cfd2e6f873c": {
                "Name": "kusanagi-nginx",
                "EndpointID": "17cab3c8606bb4f0053b475758aaf40363a1ab23938e1cab0fe4288f5a852784",
                "MacAddress": "02:42:ac:12:00:06",
                "IPv4Address": "172.18.0.6/16",
                "IPv6Address": ""
            },
            "2c9032ebd027854520a33717281ff65d5e6fd2f52be66157b78ac8e2216a9e66": {
                "Name": "ruby",
                "EndpointID": "e719ced7c3c602ed6f61f9dbfe94c619eb77728ffc5043ffe54ba7a63a963764",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            },
            "6838721b525169706d817013cafb96f788bda54debee55feb14f6ba8ddde45c1": {
                "Name": "kusanagi-mariadb",
                "EndpointID": "694d5bbabf987b5e29d6fff60e6a41c0813bce8aa29fbb4d3d2986c8f92e35c6",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "705e73ba297b6b48ebf3a8966a04020248d02d480ad2294a92256c3631c8e32f": {
                "Name": "kusanagi-data",
                "EndpointID": "fb09bd54bef42c125f4581e77d1e28b57b4106708425af3154267eba7eeafd9d",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "f7b9dcfa034f0666f97dde2f46526d2142010da0a15c68465c1467d37fb64018": {
                "Name": "kusanagi-php7",
                "EndpointID": "d322fed8b2226b947c9436097d9537da65a453645d135e98a3b28ae1b13f7ceb",
                "MacAddress": "02:42:ac:12:00:05",
                "IPv4Address": "172.18.0.5/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

f:id:ts0818:20170617120252j:plain

 

f:id:ts0818:20170617154946p:plain

ネットマスクとは「 192.168.0.0/24 」などの「/24」部分の、
プレフィックス表示部分を示します。
※/24の場合、サブネットマスクは255.255.255.0になります。

IP・サブネットマスクから手計算でネットワーク情報を求める | IPV46

f:id:ts0818:20170617160745p:plain

異なるネットワーク間の通信は、ルータもしくはL3スイッチなどでないと通信できないようです。

IPアドレスの基礎知識 - Qiita

Windows(ホストOS)側のブラウザから、dockerコンテナ(kusanagi-nginx[CentOS7])のWordPressが表示されているので、なんかやりようはあるような気はするのですが...いかんせんネットワークの知識が欠し過ぎて今回も断念。

pure-FTPコンテナにはffftpで接続できたようです。ホスト名(アドレス)はeth1のIPアドレスを指定してます。ユーザー名とパスワードはpure-FTPコンテナでユーザーを作った時のもでOKっぽいです。

f:id:ts0818:20170617162812j:plain

PASVモードのチェックを外さないと接続できないっぽいです。

f:id:ts0818:20170617162819j:plain

仮想マシン側(Docker_Host)のpure-FTPコンテナの/home/ftpusers/ts0818フォルダに接続されたみたいです。

f:id:ts0818:20170617162815j:plain

試しにWindows(ホストOS)側のファイルをアップロードしてみます。

f:id:ts0818:20170617164242j:plain

仮想マシン側(Docker_Host)のpure-FTPコンテナにログインして、/home/ftpusers/ts0818に移動すると、ファイルがアップされています。

f:id:ts0818:20170617163745j:plain

 もう、あとはKUSANAGIの中の人にお頼みするしかなさそうです。

おれとKUSANAGIとDockerとAzure - Docs.com

 

というわけで、今回もハマりにハマって徒に時間を使ってしまいましたね。