#Bash on Ubuntu on Windowsでdockerをhttpソケットを開けながらセキュアに利用したい
Bash on Ubuntu on Windows上でdockerを使いたくても現状ではクライアントしか動きません。
そのためdockerのサーバーはBash on Ubuntu on Windowsではなくホストの方で動かす必要があります。
Docker for Windowsにはhttpソケットを開けるオプションが存在します。
Docker for WindowsのタスクトレイからSettingsを開くとGeneralに、
- Expose daemon on tcp:localhost:2375 without TLS
とありますが、この機能は文字通りTLSを使わずに2375を待ち受けるためセキュアではありません。
何らかの理由(例えばファイヤーウォールのルールの設定権がない)から、生のhttpソケットを公開したくない場合があります。
Windowsコンテナの場合はdaemon.jsonを編集することによって、設定を変更することが可能ですが、Linuxコンテナの場合、TLSで待ち受ける機能(待受ポートの設定とかも)が正常に働きません。
上記のリンクではWindowsコンテナについてMS公式のドキュメントですが、同じことをLinuxコンテナに作用させるとクラッシュします。(Version 17.07.0-ce-rc3-win23 (13024)で確認)
これとか、これを見る限りLinuxコンテナを公開する場合はdocker-machineを使ってね、のような感じみたいです。
そのため、docker-machineを利用してBash on Ubuntu on Windows(BoW)からTLSを使ってhttpソケットにアクセスさせます。
##前提として
Bash on Ubuntu on Windows(BoW)とdocker-machine、Hyper-Vが使えることとします。
BoW上でDockerクライアントを入れておきます。
私の環境では、Docker for Windowsを入れたらdocker-machineも入ったのでそれを利用しています。
docker-machineで使う仮想スイッチは予めHyper-Vの管理コンソールかpowershellで作成しておきます。
このとき仮想スイッチは「外部ネットワーク」で、対象となるNICを選択し、「 □管理オペレーティングシステムに~」のチェックを入れます。多分内部的にはブリッジのような感じになってます。
作成したスイッチの名前は後で使うので覚えておきます。
私の環境ではうまく動きませんが、動く方はWindowsNATで構成してもいいと思います。
そして、先ほど作ったスイッチを使うため、引数で先ほどのスイッチを指定してください。
私は「bridge」という名前で作成したため、以下のようになります。
Hyper-Vを使用するため、driverでhypervを、マシン名をtestVMにしています。
docker-machine create --driver hyperv --hyperv-virtual-switch 作成したHyper-Vのスイッチ名(私の環境だとbridge) 作成するマシン名
管理者権限で起動されたpowershell上で実行すると指定したマシン名で作成されます。
作成が終わったら、同じくpowershell上で以下のコマンドを叩いてください。
docker-machine env 作成したマシン名
実行するとbashで追加すべき環境変数が表示されます。
そのうち、
- DOCKER_TLS_VERIFY
- DOCKER_HOST
- DOCKER_CERT_PATH
- DOCKER_MACHINE_NAME
をBoWのbashなりzshの環境変数に追加しましょう。私の環境ではzshで読み込んでexportしてます。
この時注意するべきなのが、DOCKER_CERT_PATHは、BoW上では/mnt/c/をつけて、その上で、パスを\から/に書き換えてください。
例:DOCKER_CERT_PATH="/mnt/c/Users/ユーザー名/.docker/machine/machines/testVM/"
BoW上で、
docker version
を叩いて、server側の情報が表示されたら成功です。