私はメインPCのMacbook ProにDockerをインストールして利用しているのですが、Mac内で稼働させているコンテナ数が多くなってきて少し重くなってきました。
そこで、以前に使っていたノートPCにWindows Server 2016評価版をインストールしたモノがあったので、そこへDocker for WindowsをインストールしてDockerを利用できる様にセットアップしたいと思います。
<<20/12/26 追記>>
Windows10 20H2を使うことで、WindowsでもWSL2を利用することで簡単にDockerを扱えるようになってます!Windows10 HomeでもDockerを利用できます。
こちらの記事を参照ください。
今回、Docker for WindowsをWindows Server 2016へインストールしたときにエラーになって幾つかハマったポイントがあったのでメモしておきます。
結論から言いますとWindowsServer2016で利用できるコンテナはWindowsコンテナだけで、Linuxコンテナは利用できないようです。
Linuxコンテナを使いたい場合にはWindowsServer Version1709以降もしくはWindowsServer2019を使いましょう。
どうしてもLinuxコンテナを利用したい場合は、Hyper-VにLinuxの仮想マシンを構築してその上でDockerを利用する必要があるようです。
WindowsServerで利用可能なDockerはDockerEE
DockerのバージョンはCEとEEがありますが、WindowsServerで利用可能なDockerのバージョンについてはDocker Enterprise Editionとなります。
Docker EEは有償サポートバージョンという位置づけなのですが、WindowsServerで利用する場合には無償になるみたいです(以下に書いてますね。ややこしや。
Docker Engine – Enterprise is available at no additional cost to all Windows Server 2019 and 2016 customers
https://hub.docker.com/editions/enterprise/docker-ee-server-windows
Windows Serverでコンテナを利用する方法は主に3つ
WindowsServerでコンテナを使う方法も時代とともに変化しているのですが、たくさんあって分かりにくいです。
WindowsServerでDockerを動かす方法としてOSのHostレベル(Linuxの方式)でDockerを動す方法と、Hyper-VのLinux仮想マシンを介してコンテナを利用する方法の2パターンがあります。
図にするとこんな感じです。
WindowsServer Version 1709(このバージョンが分かりにくい原因ともいえる)とWindowsServer2019ではHostレベルで、WindowsコンテナとLinuxコンテナ(LinuxKitを利用)が利用できる様になったようです。
まとめると以下のような感じです。
- Windowsコンテナ機能(Hyper-Vの機能も必要)でWindowsコンテナを使う
→ Windows Server 2016以降で可能 - Docker for Windows CEでHyper-V機能を利用してLinuxコンテナを使う
→ Windows10 Proでは可能だが、WindowsServerでは不可(Docker EEのため) - LinuxKitを利用してLinuxコンテナを使う
→ Windows Server version1709 / Windows Server 2019以降
Windows Server 2016へDocker EEをインストールする手順
結果的にWindowsServer 2016上でLinxuコンテナを使うことができなかったのですが、せっかくなのでWindowsコンテナ機能(Hyper-Vの機能も必要)でWindowsコンテナを使ってみたいと思います。
Hyper-Vのインストール
Docker EEには事前にHyper-Vのインストールが必要です。管理者権限でPowershellを起動してコマンドでHyper-Vでインストールします。
> PowerShell Install-WindowsFeature hyper-v
サーバ再起動
Hyper-Vをインストールしたら機能を有効にするため再起動します。
Restart-Computer
Docker EEをインストール
Hyper-Vのインストールができたら、Docker EE をインストールします。マイクロソフト公式のインストール手順に従ってすすめていきます。
Docker EEのインストールはPowerShellのコマンドベースで行います。
Powershellを管理者として起動してコマンド「Install-Module DockerMsftProvider -Force」を打ち込んでください。
PS C:\WINDOWS\system32>Install-Module DockerMsftProvider -Force
もし次のようなエラーが発生したら以下の対応を参考にしてください。
エラーが出た場合の対応
以下のエラーメッセージが表示された場合には、URLにアクセスができないというエラーです。
PS C:\WINDOWS\system32> Install-Module DockerMsftProvider -Force
続行するには NuGet プロバイダーが必要です
PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet
プロバイダーが必要です。NuGet プロバイダーは 'C:\Program Files\PackageManagement\ProviderAssemblies' または
'C:\Users\super\AppData\Local\PackageManagement\ProviderAssemblies' に配置する必要があります。'Install-PackageProvider
-Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet プロバイダーをインストールすることもできます。今すぐ
PowerShellGet で NuGet プロバイダーをインストールしてインポートしますか?
[Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"): Y
警告: URI 'https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409' から '' へダウンロードできません。
警告: 利用可能なプロバイダーの一覧をダウンロードできません。インターネット接続を確認してください。
原因を特定するため、Invoke-WebRequestコマンドで直接アクセスできるか確認するとエラーが表示されます。
原因としてはSSL周りでエラーになってURLへアクセスできないようです。
PS C:\WINDOWS\system32> Invoke-WebRequest "https://go.microsoft.com/fwlink/?LinkID=627338&clcid=0x409"
Invoke-WebRequest : 要求は中止されました: SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした
発生場所 行:1 文字:1
+ Invoke-WebRequest "https://go.microsoft.com/fwlink/?LinkID=627338&clc ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、WebEx
ption
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
どうも、SSLのバージョンが弱くてセキュリティが低い理由から接続を拒否されているようです。そこで以下のコマンドで.Net Framework(バージョン4以降)に強力な暗号化を設定します。
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
[Net.ServicePointManager]::SecurityProtocol
Tls12
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
[Net.ServicePointManager]::SecurityProtocol
Tls, Tls11, Tls12
再度インストールをトライ
もう一度インストールを試してみます。うまくインストールができるかと思います。Docker EEのインストールが完了後に再起動します。
PS C:\WINDOWS\system32> Install-Module DockerMsftProvider -Force
続行するには NuGet プロバイダーが必要です
PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの
プロバイダーが必要です。NuGet プロバイダーは 'C:\Program Files\PackageManagement\Provide
'C:\Users\super\AppData\Local\PackageManagement\ProviderAssemblies' に配置する必要があり
-Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet プロバイダーをインストール
PowerShellGet で NuGet プロバイダーをインストールしてインポートしますか?
[Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"): y
PS C:\WINDOWS\system32> Install-Package Docker -ProviderName DockerMsftProvider -Force
PS C:\WINDOWS\system32> Restart-Computer
Docker EEがインストールされたか確認
Dockerサービスを起動して正常に動作していることを確認します。
PS C:\WINDOWS\system32> Start-Service docker
PS C:\WINDOWS\system32> Get-Service docker
Status Name DisplayName
------ ---- -----------
Running docker Docker Engine
続いてdockerバージョンの確認をします。
PS C:\WINDOWS\system32> docker version
Client: Docker Engine - Enterprise
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 2ee0c57608
Built: 11/13/2019 08:00:16
OS/Arch: windows/amd64
Experimental: false
Server: Docker Engine - Enterprise
Engine:
Version: 19.03.5
API version: 1.40 (minimum version 1.24)
Go version: go1.12.12
Git commit: 2ee0c57608
Built: 11/13/2019 07:58:51
OS/Arch: windows/amd64
Experimental: false
ここまでで、Docker EEはうまくインストールされているようです。
Restart-Computer
動作確認
動作確認のためにWindowsコンテナを作成してみたいと思います。
MSが用意しているdotnet-samplesのコンテナを取得してみます。
PS C:\WINDOWS\system32> docker run microsoft/dotnet-samples:dotnetapp-nanoserver
Unable to find image 'microsoft/dotnet-samples:dotnetapp-nanoserver' locally
dotnetapp-nanoserver: Pulling from microsoft/dotnet-samples
bce2fbc256ea: Pull complete
b0b5e40cb939: Pull complete
347417e0cada: Pull complete
1e5ea1830940: Pull complete
081f63111c09: Pull complete
94504ab92c8e: Pull complete
4b830cd70a22: Pull complete
c09304867c0b: Pull complete
04d6c936784e: Pull complete
5897a999aef6: Pull complete
b33a195869b0: Pull complete
Digest: sha256:a4a4edf37ec58d56223ef0691b280a4bc8680201b3c65c8c4a8532dbd8437a28
Status: Downloaded newer image for microsoft/dotnet-samples:dotnetapp-nanoserver
Dotnet-bot: Welcome to using .NET Core!
__________________
\
\
....
....'
....
..........
.............'..'..
................'..'.....
.......'..........'..'..'....
........'..........'..'..'.....
.'....'..'..........'..'.......'.
.'..................'... ......
. ......'......... .....
. ......
.. . .. ......
.... . .......
...... ....... ............
................ ......................
........................'................
......................'..'...... .......
.........................'..'..... .......
........ ..'.............'..'.... ..........
..'..'... ...............'....... ..........
...'...... ...... .......... ...... .......
........... ....... ........ ......
....... '...'.'. '.'.'.' ....
....... .....'.. ..'.....
.. .......... ..'........
............ ..............
............. '..............
...........'.. .'.'............
............... .'.'.............
.............'.. ..'..'...........
............... .'..............
......... ..............
.....
**Environment**
Platform: .NET Core 2.0
OS: Microsoft Windows 10.0.14393
PS C:\WINDOWS\system32>
問題なく取得できることを確認できました。
まとめ
結果的にMacbook Proのスペック不足の対応はできなかったので悔しいところですが、また別の方法でためしてみたいと思います。
Dockerのオススメ勉強方法
私がオススメするDocker初心者向けの最初に購入すべき書籍は「さわって学ぶクラウドインフラ docker基礎からのコンテナ構築」です。
さわって学ぶクラウドインフラ docker基礎からのコンテナ構築
本書ではDockerの基本的な概念などの座学ももちろんありますが、実際に、Dockerのインストール方法やWebサーバーをコンテナで構築するハンズオンを通じて学習することができるため、特に初心者の方はは分かりやすい内容となっています。
今回は以上となります。
コメント