2015/08/24

Windows Server 2016 TP3 > Windows 版 Docker でリモート接続 (TLS) を有効化する

Windows Server 2016 Technical Preview 3 でいよいよ Docker が利用可能になり、Windows Server Container が提供されました。手順は簡単なのでこちらのチュートリアルに譲るとして、リモートの Docker クライアントから TLS でリモート接続して管理するための方法をまとめます。

Windows Containers
[URL] https://msdn.microsoft.com/en-us/virtualization/windowscontainers/containers_welcome


Linux 版の Docker と同様に、Windows 版の Docker もリモート接続は既定で無効になっています。こちらのフォーラムで、非 TLS 接続を有効にする方法がわかりますが、暗号化されませんし、認証もありませんので、決してお勧めできる方法ではありません。

Can I connect docker from remote docker client?
[URL] https://social.msdn.microsoft.com/Forums/en-US/9caf90c9-81e8-4998-abe5-837fbfde03a8/can-i-connect-docker-from-remote-docker-client?forum=windowscontainers

以下の画面は、非 TLS 接続 (2375/tcp) で Windows および CoreOS の Docker クライアントから Windows Server の Docker にリモート接続しているところです。あっ、そうそう。非 TLS 接続を可能にするには、C:\ProgramData\docker\RunDockerDaemon.cmd をいじるんですけど、このバッチファイルは改行コードが Windows の CR+LF ではない (おそらく Linux で作成してあるので LF) ので、メモ帳 (Notepad.exe) で開くと面倒なことになりますよ。

TLS によるリモート接続 (2376/tcp) を可能にするには、 OpenSSL で CA、サーバー、およびクライアントの証明書を準備してあげる必要があります。今回は、Windows 10 で証明書を準備して、Windows 10 上の Docker クライアントから Technical Preview 3 の Docker ホストに接続できるようにセットアップしてみます...



Windows 版 Docker クライアントを準備する

Windows 版の Docker クライアントは、Boot2docker で VirtualBox の Docker ホストイメージとともに入手する方法、Chocolatey で Docker クライアントだけを入手する方法がありますが...

Installation on Winodws
[URL] https://docs.docker.com/installation/windows/


Windows Server 2016 Technical Preview 3 向けの Docker.exe と同じバイナリをダウロードするのが速くて簡単だと思います。Windows PowerShell で次のコマンドラインを実行すれば、カレントディレクトリに Docker.exe をダウンロードできます。

wget -Uri http://aka.ms/ContainerTools -OutFile .\docker.exe -UseBasicParsing

12/15 追記)
TP4 の場合は wget -Uri https://aka.ms/tp4/docker ...

Windows 版の OpenSSL の入手

OpenSSL を含む Git for Windows をダウンロードしてインストール。

Git for Windows
[URL] https://git-for-windows.github.io/


スタート メニューの[すべてのアプリ > Git > Git CMD] を開く (管理者として実行はしなくてよい)。

OpenSSL へのパスが通ってないと思うので、次のコマンドラインを実行して設定する。

set PATH=%PATH%;"C:\Program Files\Git\MinGW64\bin

12/15 追記) 今のバージョンだとパスが %USERPROFILE%\AppData\Local\Programs\Git\MinGW64\bin とかにに変わったみたい。

以下のドキュメントを参考に、必要な証明書を準備します。

Protect the Docker daemon socket
[URL] https://docs.docker.com/articles/https/

こんな感じて、Docker ホスト用の ca.pem、server-cert.pem、server-key.pem と、Docker クライアント用の ca.pem、cert.pem、key.pem を作成します。 この例では、Docker ホストの FQDN に加えて、IP アドレス (10.0.0.105 と 127.0.0.1) で接続できるようにサブジェクト代替名も設定しています。

openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
    Common Name (e.g. server FQDN or YOUR name) []: <Docker ホストの FQDN>
 

openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=<Docker ホストの FQDN>" -sha256 -new -key server-key.pem -out server.csr


echo subjectAltName = IP:10.0.0.105,IP:127.0.0.1 > extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf


openssl genrsa -out key.pem 4096
openssl req -subj '/CN=<Docker クライアントの FQDN>' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile.cnf

openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf



Docker ホストで TLS リモート接続を有効化する

Docker ホストの C:\ProgramData\docker フォルダーに certs.d フォルダーを作成し、ca.pemserver-cert.pemserver-key.pem の 3 つのファイルを certs.d フォルダーに保存します。


Docker ホストを再起動または Docker Daemon サービスを再起動します。Docker Daemonサービスの起動時、C:\ProgramData\docker\RunDockerDaemon.cmd によって、certs.d の証明書を使用してデーモンが開始され、ポート 2376 でリモート接続を受信するようになります。

netstat -a コマンドで 2376 ポートが LISTENING になっていることを確認し、Windows ファイアウォールで 2376 の受信トラフィックを許可するようにルールを追加します。



Docker クライアントから TLS でリモート接続する


Docker クライアントからは、こんな感じで、ca.pem、cert.pem、key.pem を指定して Docker ホストに接続します。

docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H 10.0.0.105:2376 version


%USERPROFILE%\.dockerにca.pem、cert.pem、key.pem をコピーして、DOCKER_HOST と DOCKER_TLS_VERIFY 環境編集を設定してあげれば...

set DOCKER_HOST=tcp://10.0.0.105:2376
set DOCKER_TLS_VERIFY=1


こんな感じで、簡単なコマンドラインでリモート操作できます。

docker images








なお、TLS を有効化すると、Docker ホストのローカル操作も TLS 接続で行わないといけなくなるのでご注意。

関連:
このブログ > Docker Client for Windows > How to Build by Go (2015/04/17)
このブログ > Docker Client for Windows > How to Install by Chocolatey (2015/04/17)
@IT > 山市良のうぃんどうず日記(31:特別編):所要時間わずか10分で「Docker」を体験しよう――Azureで始めるDocker入門 (2015/04/13)

[URL] http://www.atmarkit.co.jp/ait/articles/1504/13/news020.html

0 件のコメント: