今回はシンプルにWindowsに直接Docker CLIとDockerをインストールする方法を紹介します。ちなみに自分で編み出した方法ではなく、Dynamics 365 Business CentralをDockerで利用する方法を探していたらD365BCのDockerイメージを提供してくれている海外のMicrosoftのTechnicalの人のブログに行きついただけですw
ちなみに前回の記事ではDocker社のFAQに沿ってDocker DesktopなしでDockerを使う方法を紹介しました。簡単に書くとWindows上でWSL2をインストールしてDocker CLIとDocker Engineをインストールする、という方法です。今回はWSLのインストール不要でLinuxの知識がなくても問題ないです。
1. 情報元(Freddy氏のブログ)
元ネタはこちらのブログです。
Docker and Business Central | Freddys blog
記事の一番最後に” This PowerShell script can be found here. ”と書かれています。リンク先はGitHubでコードが書かれています。
2. 手順
GitHubで公開されているソースをコピーしてPowerShellで実行するだけです。たったこれだけです。
PowerShellの実行が完了したら再起動。サービスを確認してDocker Engineが起動していればOKです。
PowerShellから任意のコンテナーを作成します。自分はもともとD365BCのコンテナが作りたくて調べたのでBCのコンテナを作ります。あっさり成功しました。
BCに興味がない人にはどうでもいい話ですが、こんな感じでショートカットが作成されて、、
ショートカットをクリックしてブラウザを起動するとBCが使えるようになります。超便利です。
3. 解説
ソースを解説します。
6行目~9行目はPowerShellをAdminで実行しているか否かのチェックです。PowerShellは管理者モードで実行する必要があります。
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { throw "This script needs to run as admin" }
11行目~3行目はDocker Desktopのインストールチェック。先にアンインストールしておきましょう。
if ((Test-Path (Join-Path $env:ProgramFiles "Docker Desktop")) -or (Test-Path (Join-Path $env:ProgramFiles "DockerDesktop"))) { throw "Docker Desktop is installed on this Computer, cannot run this script" }
15行目~22行目はWindowsのコンテナー機能のインストールチェック。先に機能のインストールを実行して再起動しておいた方がよいでしょう。
# Install Windows feature containers $restartNeeded = $false if (!(Get-WindowsOptionalFeature -FeatureName containers -Online).State -eq 'Enabled') { $restartNeeded = (Enable-WindowsOptionalFeature -FeatureName containers -Online -NoRestart).RestartNeeded if ($restartNeeded) { Write-Host "A restart is needed before you can start the docker service after installation" } }
24行目~35行目はDockerの最新Stableバージョンの取得。(正直よくわからんですが、コメント行のままだと理解してます。)
# Get Latest Stable version and URL $latestZipFile = (Invoke-WebRequest -UseBasicParsing -uri "https://download.docker.com/win/static/stable/x86_64/").Content.split("`r`n") | Where-Object { $_ -like "<a href=""docker-*"">docker-*" } | ForEach-Object { $zipName = $_.Split('"')[1]; [Version]($zipName.SubString(7,$zipName.Length-11).Split('-')[0]) } | Sort-Object | Select-Object -Last 1 | ForEach-Object { "docker-$_.zip" } if (-not $latestZipFile) { throw "Unable to locate latest stable docker download" } $latestZipFileUrl = "https://download.docker.com/win/static/stable/x86_64/$latestZipFile" $latestVersion = [Version]($latestZipFile.SubString(7,$latestZipFile.Length-11)) Write-Host "Latest stable available Docker Engine version is $latestVersion"
37行目から64行目でインストール済のDockerバージョンを特定し、
# Check existing docker version $dockerService = get-service docker -ErrorAction SilentlyContinue if ($dockerService) { if ($dockerService.Status -eq "Running") { $dockerVersion = [Version](docker version -f "{{.Server.Version}}") Write-Host "Current installed Docker Engine version $dockerVersion" (以下略)
65行目から75行目で新バージョンがあればダウンロード
# Download new version $tempFile = "$([System.IO.Path]::GetTempFileName()).zip" Invoke-WebRequest -UseBasicParsing -Uri $latestZipFileUrl -OutFile $tempFile Expand-Archive $tempFile -DestinationPath $env:ProgramFiles -Force Remove-Item $tempFile -Force (以下略)
76行目からはサービスの登録と起動
# Register service if necessary if (-not $dockerService) { $dockerdExe = 'C:\Program Files\docker\dockerd.exe' & $dockerdExe --register-service } New-Item 'c:\ProgramData\Docker' -ItemType Directory -ErrorAction SilentlyContinue | Out-Null Remove-Item 'c:\ProgramData\Docker\panic.log' -Force -ErrorAction SilentlyContinue | Out-Null New-Item 'c:\ProgramData\Docker\panic.log' -ItemType File -ErrorAction SilentlyContinue | Out-Null (以下略)
15行目~22行目は地味にポイントで、Windowsのコンテナー機能は使っている一方でWSL(Linux用Windowsサブシステム)もHyper-Vも入れていないことに注意です。そうです、Hyper-VやWSLなしでも動くのです。(WSLなしでも動くのはちょっとビビりました。)
65行目~75行目を見る限り、直接ProgramFilesにDockerDaemonとDockerCLIを配置しているようです。
D365BCユーザー向けに提供されているソースですが、D365BC以外でも使えると思いますので紹介しました。