2016/05/12

Docker and Nano Server TP5 (cannot enable tty mode on non tty input エラーの回避方法)

Nano Server をコンテナー ホストとしてセットアップした場合、PowerShell Remoting や PowerShell Direct の PS セッションから docker コマンドを実行することになると思うのですが、コンテナーを対話的に実行 (docker run -it) すると、docker : cannot enable tty mode on non tty input というエラーで失敗すると思います。


Docker と Windows (https://msdn.microsoft.com/ja-jp/virtualization/windowscontainers/deployment/docker_windows) というページに、このエラーの回避方法として docker daemon -D -H <ip address of Nano Server>:2375 でリモートからの接続を許可する方法が説明されていますが、実はこの日本語ページは古い (TP4 以前の内容)。

※ Windows Containers 関連の日本語ドキュメントは、更新日が英語ドキュメントと同じでも、内容は古いままという場合があるので注意してください。日本語ページの URL の ja-jp を en-us に変更して、内容が同じかどうか確認したほうがよいです。

Docker デーモンまわりは、TP5 で dockerから dockerd に変更になっていますし、dockerd を 2375 で動かそうとしても起こられます。


英語版の Docker and Windows (https://msdn.microsoft.com/en-us/virtualization/windowscontainers/deployment/docker_windows) は TP5 対応の内容になっているんですが、リモート接続の許可まわりがちょっと説明不足。 

ちょっとだけ詳しく説明すると...


サーバー用の鍵 ca.pemserver-cert.pemserver-key.pem と、クライアント用の鍵 ca.pemcert.pemkey.pem をがんばって準備して...

コンテナー ホストの C:\ProgramData\docker\certs.d (certs.d は作成する必要あり) に ca.pemserver-cert.pemserver-key.pem をコピーします。

通常の Windows Server 2016 なら、

PS> Stop-Service -Name Docker
PS> Start-Service -Name Docker

Nano Server なら、

PS> Get-Process dockerd | Stop-Process -Force
PS> Start-ScheduledTask -TaskName Docker

で Docker デーモンを再起動。Windows ファイアウォールで 2376/TCP を許可。

PS> netsh advfirewall firewall add rule name="Docker daemon" dir=in action=allow protocol=TCP localport=2376




クライアントでは、ユーザー プロファイル フォルダー (%USERPROFILE%) に .docker フォルダーを作成して、クライアント用の鍵 ca.pemcert.pemkey.pem をコピーします。

PowerShell なら...

PS C:\Users\username> wget -uri https://aka.ms/tp5/docker -outfile .\docker.exe
PS C:\Users\username> $env:DOCKER_HOST = "tcp://X.X.X.X:2376"
PS C:\Users\username> $env:DOCKER_TLS_VERIFY = "1"
PS C:\Users\username> .\docker.exe run -it ....

コマンド プロンプトなら...

C:\Users\username> Set DOCKER_HOST=tcp://x.x.x.x:2376
C:\Users\username> Set DOCKER_TLS_VERIFY=1
C:\Users\username> .\docker.exe run -it ....

または、ちょっと面倒ですが...

C:\Users\username> docker --tlsverify --tlscacert=.docker\ca.pem --tlscert=.docker\cert.pem --tlskey=.docker\key.pem -H x.x.x.x:2376 run -it ....

でも OK。

鍵ファイルは、openssl で作成するんですが、その方法は以前に以下の投稿で説明したとおり。

Nano Server TP4 を Container Host にする (完全版) (2015/11/25)
Windows Server 2016 TP3 > Windows 版 Docker でリモート接続 (TLS) を有効化する (2015/08/24)

 
Windows 10 Insider Preview をお使いなら、Bash on Ubuntu on Windows の openssl を使えますよ。Bash on Ubuntu on Windows からは、cp *.pem /mnt/c/work とかで C: ドライブのパスに鍵をコピーできます。






pem ファイルの作り方、一応、メモっときます。

# openssl genrsa -aes256 -out ca-key.pem 4096
# openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem    (->ca.pem)
# openssl genrsa -out server-key.pem 4096        (->server-key.pem)
# openssl req -subj "/CN=<Docker ホストの FQDN>" -sha256 -new -key server-key.pem -out server.csr
# echo subjectAltName = IP:<Docker ホストの IP>;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        (->server-cert.pem)
# openssl genrsa -out key.pem 4096    (->key.pem)
# 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    (->cert.pem)

0 件のコメント: