left4dead2サーバー用のDockerイメージを作り、GCE上で動かしてみた #3(サーバー構築までで苦労したこと)


 前回の記事で今回作成した、l4d2 dedicated serverを構築用のDockerfileの悪い点を示しました。
 最後に、Dckerfileを作成する過程で躓いた点2つ(些細なことですが)を残します。

1. Docker Toolboxのdefaultマシンのディスク容量が足りなくなった

 私が使用していた環境はDocker Toolbox (version 19.03.1)なのですが、docker buildをする際にdockerのディスク容量が足りないことを示すno space left on deviceが出てしまいました。
 類似した症状に関する記事を参考にdocker system prune -a --volumesで不要なコンテナ・ネットワーク・イメージ・ボリュームを一括削除してみましたが、それでも解決しませんでした。

 作成しようとしているコンテナイメージは前回の記事で述べていたように10GB程度と大きいですが、Docker Toolboxのdefaultマシンのディスク容量は20GB(disk.vmdkは19.53GB)あるため、ディスク容量に問題はないと思い込んでおりました。
 しかし、(想像ですが)今回のコンテナは大半の容量をdedicated serverが占めているため、仮にdocker buildがこれをイメージ内でコピーするような動作をしているとしたら、ディスク容量が不足している可能性もあると思い、一回defaultマシンを削除してディスク容量を増やして再作成しました。

# defaultマシンを削除
$ docker-machine rm default
About to remove default
WARNING: This action will delete both local reference and remote instance.
Are you sure? (y/n): y
Successfully removed default

# defaultVM(50GB)を作成
$ docker-machine create -d virtualbox --virtualbox-disk-size "50000" default                
...

この上で再度ビルドしたところ、問題無く動作することを確認出来ました。
ディスク容量が足りないわけではないだろうという思い込みで躓いておりました。

2. GCEのポート設定が上手くできているのか分からなかった

 これはGCE側の仕様というよりはnmapの仕様かと思うのですが、ファイアウォール設定をした後にちゃんとポート設定が出来ているのかを確認するため、nmapを使ってポートスキャンをしました。すると、5桁以降のポートはスキャン対象から除かれるようで、それに気づかず躓いてしまいました。
(この際、実際にファイアウォール設定をしててもサーバーに接続できない事象が発生していたため、勝手にポートの設定が出来ていないものとばかり思いこんでいたのですが、実態はdocker runの際にUDPの27015をポートフォワードし忘れていたことに起因しており、このことに気が付くのに時間がかかってしまいました……。)

 上記を実際に見ていきます。例えば、ファイアウォール設定で22(SSH), 443(HTTPS), 8080, 9000, 10000, 11000, 27015(l4d2 dedicated serverのデフォルト), 27016を許可した上で、nmapでオプションをつけずにスキャンをすると下記のようになります。

xxx@instance-1:~$ nmap 34.84.27.167
...
Not shown: 994 filtered ports
PORT      STATE  SERVICE
22/tcp    open   ssh
443/tcp   closed https
3389/tcp  closed ms-wbt-server
8080/tcp  closed http-proxy
9000/tcp  closed cslistener
10000/tcp closed snet-sensor-mgmt
Nmap done: 1 IP address (1 host up) scanned in 4.60 seconds

 確かに11000以降はスキャンされていません。私はこれを勝手に10000以降は許可できていないと勘違いして混乱してしまいました。
 しかし(当然ですが)、例えば上記の条件の下スキャンするポートを27015-27018に制限すると、下記のように27015と27016はclosed(受信待機中のアプリケーションはないが、プローブは届いている)となっており(当然17, 18はプローブが到達していない)、しっかり機能していることが分かります。

xxx@instance-1:~$ nmap -p 27015-27018 34.84.27.167
PORT      STATE    SERVICE
27015/tcp closed   unknown
27016/tcp closed   unknown
27017/tcp filtered mongod
27018/tcp filtered mongod
Nmap done: 1 IP address (1 host up) scanned in 1.32 seconds

まとめ

 蓋を開けてみるとなんてことない話かもしれませんが、実際こういうところで躓いてしまったので、今後のために残しておきます。

 これで「left4dead2サーバー用のDockerイメージを作り、GCE上で動かしてみた」の一連の話は全てとなります。今後はまた勉強を進め、本件のバージョンアップ版やその他の新しいアウトプットが出来たら積極的に記事化していきたいと思います。
 今回も最後まで読んでいただきありがとうございます。