不使用Docker Desktop的前提下,使用Docker的方法

概述

本文将介绍在不使用Docker Desktop for Windows的情况下,将”docker.com的Docker(Docker Engine)”安装到WSL2环境的步骤。
本文只针对Windows操作系统,不涉及Mac。

不安装Docker Desktop,可以避免与付费许可相关的问题。

通过实施本文的内容,可以实现以下事项。

    • docker.com の Docker が WSL2 環境にインストールされ、WSL2 のコマンドラインで docker compose コマンドなどが使用できるようになります。

 

    • 起動したコンテナに対して Windows の VSCode からアタッチして、コンテナ内のリソースやソースコードを操作することが可能になります。

 

    WSL2 が起動するタイミングで docker サービスが自動的に起動するようになります。

以下一些事情無法執行。

    • Windows の Powershell などから docker コマンドを実行することはできません。

kubectl コマンドは使えません。(別途インストールが必要になりますが未検証です。)
Docker Desktop for Windows にあった GUI による操作はできなくなります。
Docker Desktop for Windows の Extensions は使用できなくなります。

卸载 Docker Desktop

如果已经安装了Docker Desktop for Windows或者替代的Rancher Desktop之类的软件,请先卸载它们。

确认WSL2的安装状态

确认Windows的版本

请查看 [系统] > [详细信息],确认 Windows 的版本为22H2。同时确认其为 Home/Pro/Enterprise 版本之一。

Windowsのバージョンが22H2であること

如果不是 22H2,则更新 Windows 为 22H2。

确认WSL2的状态

有两种WSL2版本可供选择,分别是“内置版”和“商店版”。
为了完成本文所述的内容,需要安装“商店版”的WSL2。
您可以使用wsl –version命令来确定已安装的WSL2版本。

另外,我们还要确认安装了“Store版”后,通过 wsl -l -v 命令确认Ubuntu版本是否为“版本2”,且标有“默认(以*开头)”。

PS C:\Users\tadashi.oya> wsl -l -v
  NAME                    STATE           VERSION
* Ubuntu                  Running         2
(...省略...)

确认「商店版本」

如果使用”wsl –version”命令显示版本信息,则表示已经安装了”Store版本”的WSL2。

请继续进入下一节。

PS C:\Users\tadashi.oya> wsl --version
WSL バージョン: 1.1.6.0
カーネル バージョン: 5.15.90.1
WSLg バージョン: 1.0.50
MSRDC バージョン: 1.2.3770
Direct3D バージョン: 1.608.2-61064218
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows バージョン: 10.0.19045.2846

如果是”收件箱版本”的情况

如果在运行 wsl –version 命令时显示帮助信息,则表示正在运行“内置版”WSL2。

PS C:\Users\tadashi.oya> wsl --version
コマンド ライン オプションが無効です: --version
Copyright (c) Microsoft Corporation. All rights reserved.

使用法: wsl.exe [Argument] [Options...] [CommandLine]

(...省略...)

    --unregister <Distro>
        ディストリビューションの登録を解除し、ルートファイルシステムを削除します。

在这种情况下,您可以通过运行”wsl –update”命令来安装商店版。

PS C:\Users\tadashi.oya> wsl --update

请确认通过运行wsl –version命令是否安装了“商店版”,然后继续下一节。

如果既没有安装商店版本也没有安装收件箱版本,请进行安装。

在本作者的环境中,无论是“Store版”还是“Inbox版”,都未安装wsl –version等命令的执行结果。我无法确认版本信息或帮助消息,可能会输出某种错误提示。

通过使用管理员权限的PowerShell等工具,执行wsl –install命令即可安装WSL2存储版和Linux发行版Ubuntu。

可以查阅以下的官方文档。

    • https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands

 

    https://learn.microsoft.com/ja-jp/windows/wsl/install

启用systemd

要求安装「商店版」的 WSL2。

创建/etc/wsl.conf

创建/etc/wsl.conf文件。

您可以选择使用vi或nano手动创建,或者通过复制并粘贴以下内容sudo cat >/etc/wsl.conf <<[EOF]至[EOF]来创建。

PS C:\Users\tadashi.oya> ubuntu

tadashi@DESKTOP-CRHC3IF:~$ sudo cat >/etc/wsl.conf <<[EOF]
[boot]
systemd=true
[EOF]

tadashi@DESKTOP-CRHC3IF:~$ cat /etc/wsl.conf # 中身を確認する
[boot]
systemd=true

如果能创建/etc/wsl.conf文件,则使用wsl –shutdown命令重新启动WSL2。

PS C:\Users\tadashi.oya> wsl --shutdown

确认systemd已启用。

使用”systemctl status”命令来确认启动状态是否显示在列表中。

PS C:\Users\tadashi.oya> ubuntu

tadashi@DESKTOP-CRHC3IF:~$ systemctl status
● DESKTOP-CRHC3IF
    State: degraded
     Jobs: 0 queued
   Failed: 3 units
    Since: Fri 2023-04-14 21:50:31 JST; 10s ago
   CGroup: /
           ├─user.slice
           │ └─user-1000.slice
           │   ├─user@1000.service
           │   │ └─init.scope
           │   │   ├─891 /lib/systemd/systemd --user
           │   │   └─892 (sd-pam)
(...省略...)

启用systemd后,systemd本身会被启用,但会显示状态为degraded或Failed:3 units等。

在不同的环境中,关于失败的数量可能会有所不同。

即使出现了 Failed 的情况,也可以继续进行 Docker 安装,但如果有顾虑的话,可以进行处理,将状态设置为 running,Failed 单元数为 0。

处理 systemd 的失败

在不同的环境下,造成失败的原因各不相同。以下是一个示例。
使用 systemctl –failed 命令,将列出失败的服务。

tadashi@DESKTOP-CRHC3IF:~$ systemctl --failed
  UNIT                       LOAD   ACTIVE SUB    DESCRIPTION
● ssh.service                loaded failed failed OpenBSD Secure Shell server
● systemd-remount-fs.service loaded failed failed Remount Root and Kernel File Systems
● multipathd.socket          loaded failed failed multipathd control socket

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

3 loaded units listed.

ssh服务

因为不使用SSH服务,所以我们会将其禁用。

tadashi@DESKTOP-CRHC3IF:~$ sudo systemctl disable ssh.service
Synchronizing state of ssh.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable ssh
Removed /etc/systemd/system/sshd.service.
Removed /etc/systemd/system/multi-user.target.wants/ssh.service.

例2:多路径守护程序。

由于不使用 multipathd,因此将其禁用。

被显示为错误的是 multipathd.socket,但要停止的是 multipathd.service。

tadashi@DESKTOP-CRHC3IF:~$ sudo systemctl disable multipathd.service
Removed /etc/systemd/system/multipath-tools.service.
Removed /etc/systemd/system/sysinit.target.wants/multipathd.service.
Removed /etc/systemd/system/sockets.target.wants/multipathd.socket.

例3:systemd-remount-fs.service 升级到最新版本提示

如果您在终端中使用 systemctl status 命令,您可以确认 systemd-remount-fs.service 的状态。

tadashi@DESKTOP-CRHC3IF:~$ systemctl status systemd-remount-fs.service
● systemd-remount-fs.service - Remount Root and Kernel File Systems
     Loaded: loaded (/lib/systemd/system/systemd-remount-fs.service; enabled-runtime; vendor preset: enabled)
     Active: failed (Result: exit-code) since Wed 2022-11-30 21:55:55 JST; 15min ago
       Docs: man:systemd-remount-fs.service(8)
             https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
    Process: 60 ExecStart=/lib/systemd/systemd-remount-fs (code=exited, status=1/FAILURE)
   Main PID: 60 (code=exited, status=1/FAILURE)

Nov 30 21:55:55 DESKTOP-CRHC3IF systemd-remount-fs[66]: mount: /: can't find LABEL=cloudimg-rootfs.
Warning: journal has been rotated since unit was started, output may be incomplete.

我会用汉语原生地重新表达这个句子,只提供一个选项:
这样表示。

Nov 30 21:55:55 DESKTOP-CRHC3IF systemd-remount-fs[66]: mount: /: can't find LABEL=cloudimg-rootfs.

因此,由于无法找到 LABEL,所以将使用 e2label 命令为其添加 LABEL。

tadashi@DESKTOP-CRHC3IF:~$ df
Filesystem     1K-blocks      Used Available Use% Mounted on
(...省略...)
/dev/sdc       263112772   2830428 246844188   2% /
(...省略...)

tadashi@DESKTOP-CRHC3IF:~$ sudo e2label /dev/sdc cloudimg-rootfs

确认 systemd 的故障已经解决。

在关闭wsl后,使用systemctl status命令来确认状态为”running”或”Failed: 0 units”。

PS C:\Users\tadashi.oya> wsl --shutdown

PS C:\Users\tadashi.oya> ubuntu

tadashi@DESKTOP-CRHC3IF:~$ systemctl status
● DESKTOP-CRHC3IF
    State: running
     Jobs: 0 queued
   Failed: 0 units
(...省略...)

安装Docker引擎

按照官方文档的指示,安装docker.com上的Docker(Docker Engine)。

安装Docker Engine主体

执行“使用apt存储库安装” 在公式文档中的步骤。

使用apt源安装

章节的结构不容易辨认,

从软件包安装

直到之前是“使用apt存储库安装”。

让普通用户能够运行 Docker

执行”以非root用户身份管理Docker”的公式文档。

使用非root用户管理Docker

创建docker组。
将你的用户添加到docker组中。
注销并重新登录,以重新评估你的组成员身份。
验证你是否可以无需sudo运行docker命令。

只需要一个选择,以下是对其本地中国汉语的释义:

给出了4个步骤,但请在“安装Docker Engine核心”时进行操作。

创建一个名为docker的用户组。

应该已经完成了。检查/etc/group文件是否添加了docker组。

tadashi@DESKTOP-CRHC3IF:~$ grep docker /etc/group
docker:x:1001:tadashi

确认已经添加了Docker组后,执行从“2. Add your user…”到“4. Verify…”的步骤。

要在 VSCode 中连接到容器,可以:

需要在 VSCode 连接到 WSL2 的状态下执行附加到容器的操作。

如果VSCode连接到WSL2

当VSCode左下角(绿色显示区域下的齿轮图标)处于”WSL:Ubuntu”状态时,可以附加到容器。

コンテナにアタッチできる
アタッチするコンテナを選択する
コンテナにアタッチした状態

如果 VSCode 没有连接到 WSL2(出现错误的情况下)

如果在VSCode的左下角(綠色顯示區域下方的齒輪圖標)顯示”沒有任何連接”,即使容器已經啟動,也無法找到。

这是因为 Windows 无法在 WSL2 中检测到容器的启动状态。

コンテナにアタッチできない.png
エラー.png

Ubuntu软件包更新

建议在每天工作开始的时候执行 apt-get update 和 apt-get upgrade 命令来更新 Ubuntu。

以下是在没有可更新的软件包的情况下:

tadashi@DESKTOP-CRHC3IF:~$ sudo apt-get update
[sudo] password for tadashi:
Hit:1 https://download.docker.com/linux/ubuntu focal InRelease
Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease
Get:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:4 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
Fetched 336 kB in 3s (130 kB/s)
Reading package lists... Done

tadashi@DESKTOP-CRHC3IF:~$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.