Docker Desktop を使わずにDockerを利用する(2)


今回はシンプルに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以外でも使えると思いますので紹介しました。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です