• !/bin/bash
    set -euo pipefail
    BaseDir=$(cd “$(dirname “$0”)”; pwd)
    cd ${BaseDir}

    docker build -t ubuntu:20.04 -f Dockerfile —build-arg USERNAME=bc —build-arg PASSWORD=bc .

    docker images | grep ubuntu
    :<镜像安全检查
    Use ‘docker scan’ to run Snyk tests against images to find vulnerabilities and learn how to fix them
    PS C:\work\prod\bimdev\wsl> docker scan ubuntu:20.04
    EOF

    echo “export UBUNTU 20.04 docker image”
    #image格式wsl不认识
    #docker save ubuntu:20.04 -o ubuntu.20.04.tar
    #
    docker run —name ubuntu_instance ubuntu:20.04
    docker export -o ubuntu.20.04.tar ubuntu_instance
    docker rm ubuntu_instance

    echo “done”
  • https://marketplace.visualstudio.com/
    # VSCODE must be installed
    code —version

    # install extenstion
    # —install-extension

    #Visual Studio Code plugin that autocompletes npm modules in import statements
    code —install-extension christian-kohler.npm-intellisense
    # Bracket Pair Colorizer
    code —install-extension CoenraadS.bracket-pair-colorizer

    code —install-extension donjayamanne.githistory
    code —install-extension eamodio.gitlens
    #Prettier - Code formatter
    code —install-extension esbenp.prettier-vscode
    #输入时有特效,好玩
    code —install-extension hoovercj.vscode-power-mode
    # docker docker-compose使用超方便
    code —install-extension ms-azuretools.vscode-docker
    #VUE
    code —install-extension octref.vetur
    code —install-extension mhutchie.git-graph
    code —install-extension sdras.vue-vscode-extensionpack
    code —install-extension sdras.vue-vscode-snippets
    code —install-extension xabikos.JavaScriptSnippets

    code —install-extension tombonnike.vscode-status-bar-format-toggle
    code —install-extension wmaurer.vscode-jumpy

    code —install-extension xykong.format-all-files
    code —install-extension xyz.local-history

    code —install-extension vscode-icons-team.vscode-icons
    code —install-extension dbaeumer.vscode-eslint

    # 习惯了英语,中文看起来有点别扭
    # code —install-extension MS-CEINTL.vscode-language-pack-zh-hans

    code —install-extension andrew-codes.cypress-snippets

    code —install-extension marcostazi.vs-code-vagrantfile
    # json - yaml的转换工具
    code —install-extension ahebrank.yaml2json

    #https://marketplace.visualstudio.com/search?target=VSCode&category=Extension%20Packs&sortBy=Installs
    #微软官方的开发语言包
    #Java Extension Pack
    code —install-extension vscjava.vscode-java-pack
    #C/C++
    code —install-extension ms-vscode.cpptools
    code —install-extension ms-vscode.cmake-tools

    #rest client .http的web请求
    code —install-extension humao.rest-client
    #toml
    code —user-data-dir /opt/vscode —install-extension be5invis.toml
    #
    code —user-data-dir /opt/vscode —install-extension visualstudioexptteam.vscodeintellicode
    #python
    code —install-extension ms-python.python
    code —install-extension ms-python.vscode-pylance

    echo “extension installed done, 开启界面操作下,然后package.sh”
    mkdir -p ~/.config/Code/User/
    cp -f settings.json ~/.config/Code/User/settings.json
    ">!/bin/bash
    # https://marketplace.visualstudio.com/
    # VSCODE must be installed
    code —version

    # install extenstion
    # —install-extension

    #Visual Studio Code plugin that autocompletes npm modules in import statements
    code —install-extension christian-kohler.npm-intellisense
    # Bracket Pair Colorizer
    code —install-extension CoenraadS.bracket-pair-colorizer

    code —install-extension donjayamanne.githistory
    code —install-extension eamodio.gitlens
    #Prettier - Code formatter
    code —install-extension esbenp.prettier-vscode
    #输入时有特效,好玩
    code —install-extension hoovercj.vscode-power-mode
    # docker docker-compose使用超方便
    code —install-extension ms-azuretools.vscode-docker
    #VUE
    code —install-extension octref.vetur
    code —install-extension mhutchie.git-graph
    code —install-extension sdras.vue-vscode-extensionpack
    code —install-extension sdras.vue-vscode-snippets
    code —install-extension xabikos.JavaScriptSnippets

    code —install-extension tombonnike.vscode-status-bar-format-toggle
    code —install-extension wmaurer.vscode-jumpy

    code —install-extension xykong.format-all-files
    code —install-extension xyz.local-history

    code —install-extension vscode-icons-team.vscode-icons
    code —install-extension dbaeumer.vscode-eslint

    # 习惯了英语,中文看起来有点别扭
    # code —install-extension MS-CEINTL.vscode-language-pack-zh-hans

    code —install-extension andrew-codes.cypress-snippets

    code —install-extension marcostazi.vs-code-vagrantfile
    # json - yaml的转换工具
    code —install-extension ahebrank.yaml2json

    #https://marketplace.visualstudio.com/search?target=VSCode&category=Extension%20Packs&sortBy=Installs
    #微软官方的开发语言包
    #Java Extension Pack
    code —install-extension vscjava.vscode-java-pack
    #C/C++
    code —install-extension ms-vscode.cpptools
    code —install-extension ms-vscode.cmake-tools

    #rest client .http的web请求
    code —install-extension humao.rest-client
    #toml
    code —user-data-dir /opt/vscode —install-extension be5invis.toml
    #
    code —user-data-dir /opt/vscode —install-extension visualstudioexptteam.vscodeintellicode
    #python
    code —install-extension ms-python.python
    code —install-extension ms-python.vscode-pylance

    echo “extension installed done, 开启界面操作下,然后package.sh”
    mkdir -p ~/.config/Code/User/
    cp -f settings.json ~/.config/Code/User/settings.json
  • https://docs.microsoft.com/zh-cn/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7.1

    # Update the list of packages
    sudo apt-get update
    # Install pre-requisite packages.
    sudo apt-get install -y wget apt-transport-https software-properties-common
    # Download the Microsoft repository GPG keys
    wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
    # Register the Microsoft repository GPG keys
    sudo dpkg -i packages-microsoft-prod.deb
    # Update the list of products
    sudo apt-get update
    # Enable the “universe” repositories
    sudo add-apt-repository universe
    # Install PowerShell
    sudo apt-get install -y powershell

    # Start PowerShell
    #pwsh">!/bin/bash

    #https://docs.microsoft.com/zh-cn/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7.1

    # Update the list of packages
    sudo apt-get update
    # Install pre-requisite packages.
    sudo apt-get install -y wget apt-transport-https software-properties-common
    # Download the Microsoft repository GPG keys
    wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
    # Register the Microsoft repository GPG keys
    sudo dpkg -i packages-microsoft-prod.deb
    # Update the list of products
    sudo apt-get update
    # Enable the “universe” repositories
    sudo add-apt-repository universe
    # Install PowerShell
    sudo apt-get install -y powershell

    # Start PowerShell
    #pwsh
  • https://hub.fastgit.org/hashicorp/vagrant/issues/8384
    # https://superuser.com/questions/1354658/hyperv-static-ip-with-vagrant

    # Remove-VMSwitch -SwitchName “VagrantSwitch”
    # Remove-NetNAT -Name “NATVagrantSwitch”

    $mustRestart = 0
    # Set Hyper-V
    If (“VagrantSwitch” -in (Get-VMSwitch | Select-Object -ExpandProperty Name) -eq $FALSE) {
    Write-Host ‘Creating Internal-only switch named “VagrantSwitch” on Windows…’

    New-VMSwitch -SwitchName “VagrantSwitch” -SwitchType Internal | out-null
    sleep 2
    $mustRestart = 1
    }

    #if (“VagrantSwitch” -in (Get-VM -Name $vmName | Get-VMNetworkAdapter | Select-Object -ExpandProperty SwitchName) -eq $FALSE) {
    # Write-Host ‘Associate VagrantSwitch to the VM…’
    # Get-VM -VMNAME $vmName | Get-VMNetworkAdapter | Connect-VMNetworkAdapter -SwitchName “VagrantSwitch”
    # sleep 2
    # $mustRestart = 1
    #}
    If (“10.1.1.1” -in (Get-NetIPAddress | Select-Object -ExpandProperty IPAddress) -eq $FALSE) {
    Write-Host ‘Registering new IP gateway address 10.1.1.1 for VagrantSwitch on Windows…’
    New-NetIPAddress -IPAddress 10.1.1.1 -PrefixLength 24 -InterfaceAlias “vEthernet (VagrantSwitch)” | out-null
    sleep 2
    $mustRestart = 1
    }
    If (“10.1.1.0/24” -in (Get-NetNAT | Select-Object -ExpandProperty InternalIPInterfaceAddressPrefix) -eq $FALSE) {
    Write-Host ‘Registering new NAT adapter for 10.1.1.0/24 on Windows…’
    New-NetNAT -Name “NATVagrantSwitch” -InternalIPInterfaceAddressPrefix 10.1.1.0/24 | out-null
    sleep 2
    $mustRestart = 1
    }
    ">https://hub.fastgit.org/hashicorp/vagrant/issues/8384
    # https://superuser.com/questions/1354658/hyperv-static-ip-with-vagrant

    # Remove-VMSwitch -SwitchName “VagrantSwitch”
    # Remove-NetNAT -Name “NATVagrantSwitch”

    $mustRestart = 0
    # Set Hyper-V
    If (“VagrantSwitch” -in (Get-VMSwitch | Select-Object -ExpandProperty Name) -eq $FALSE) {
    Write-Host ‘Creating Internal-only switch named “VagrantSwitch” on Windows…’

    New-VMSwitch -SwitchName “VagrantSwitch” -SwitchType Internal | out-null
    sleep 2
    $mustRestart = 1
    }

    #if (“VagrantSwitch” -in (Get-VM -Name $vmName | Get-VMNetworkAdapter | Select-Object -ExpandProperty SwitchName) -eq $FALSE) {
    # Write-Host ‘Associate VagrantSwitch to the VM…’
    # Get-VM -VMNAME $vmName | Get-VMNetworkAdapter | Connect-VMNetworkAdapter -SwitchName “VagrantSwitch”
    # sleep 2
    # $mustRestart = 1
    #}
    If (“10.1.1.1” -in (Get-NetIPAddress | Select-Object -ExpandProperty IPAddress) -eq $FALSE) {
    Write-Host ‘Registering new IP gateway address 10.1.1.1 for VagrantSwitch on Windows…’
    New-NetIPAddress -IPAddress 10.1.1.1 -PrefixLength 24 -InterfaceAlias “vEthernet (VagrantSwitch)” | out-null
    sleep 2
    $mustRestart = 1
    }
    If (“10.1.1.0/24” -in (Get-NetNAT | Select-Object -ExpandProperty InternalIPInterfaceAddressPrefix) -eq $FALSE) {
    Write-Host ‘Registering new NAT adapter for 10.1.1.0/24 on Windows…’
    New-NetNAT -Name “NATVagrantSwitch” -InternalIPInterfaceAddressPrefix 10.1.1.0/24 | out-null
    sleep 2
    $mustRestart = 1
    }

    基础和背景 4
    缘起 4
    命令行/CLI 4
    Windows CLI 5
    DOS命令行 5
    PowerShell 5
    WSL 5
    Windows上运行linux程序的方式简介 6
    虚拟机隔离模式 6
    软件跨平台 6
    Cygwin 6
    MinGW 7
    MSYS 7
    WSL 8
    WSL 8
    WSL版本 9
    WSL1 10
    WSL2 12
    WSL2的文件系统 14
    安装和使用 16
    已有安装的WSL版本如何区分版本 16
    安装条件 17
    界面安装 18
    命令行安装 18
    Linux Kernel安装 18
    Linux Distribution 19
    Ubuntu20的运行说明 20
    执行命令 21
    关闭 22
    更多用法 22
    配置文件 22
    wsl.conf 22
    . wslconfig 23
    参考 23
    互操作性 24
    Windows访问Linux 25
    文件 25
    管道的使用 26
    windows输出管道进入linux 26
    linux输出管道进windows 27
    windows访问linux的服务 28
    MSTSC访问Linux桌面例子 28
    使用浮动的IP 28
    设置固定的ip 29
    Linux访问windows 30
    文件 30
    访问windows的命令 30
    管道 31
    linux访问Windows服务 31
    Linux分发版 31
    官方直接用 31
    导入导出 32
    docker方式自己制作 32
    Dockerfile文件制作桌面版LINUX 32
    build的脚本 34
    WSL GUI的使用 35
    xRDP 35
    X11方式 36
    启动X11 Server 36
    建立WSL连接 37
    将GUI程序启动到 windows系统上 37
    WSLg 38
    容器开发 39
    安装 40
    docker ce/ee的安装 40
    docker desktop的安装 42
    基本命令 43
    docker常用命令表 46
    复杂些的例子 49
    windows容器生态 50
    容器仓库 51
    开放仓库 51
    自建仓库 52
    自己搭建仓库环境 52
    云上使用 52
    镜像发布 54
    镜像大小 54
    Docker镜像层 54
    提防构建路径 55
    挤压镜像 56
    命令合并 58
    标准化镜像层 59
    删除缓存 61
    选择基础镜像 62
    完全不选择基础镜像 64
    多阶段构建 64
    从精简镜像开始构建 65
    编排 65
    docker compose 65
    swarm 67
    k8s 68
    容器安全 69
    容器漏洞扫描工具 69
    VS Code开发 70
    快速干净环境体验TIP 71
    编写Vagrantfile文件 72
    运行Windows2019 73
    进入Windows2019 74
    VS Code remote WSL 74
    WSL安装 75
    安装Ubuntu分发版本 76
    VS Code和插件安装 79
    WSL运行 80
    访问wsl内的服务 83
    VS Code和容器下开发 84
    windows下docker安装 84
    VS Code Docker插件 86
    VS Code常用插件Tip 87
    shell总结和比较 90
    Window Git Bash参考 90
    git bash安装和使用 90
    Sublime更有效的集成git-bash 94
    脚本文件编写Tip 95
    windows terminal 97
    MobaXterm 98
    Powershell 98
    ubutnu下安装powershell 99
    常用的一些小命令 99
    使用powershell管理虚拟交换机 100
    常用shell 101


    Windows Subsystem for Linux
    Ø 随着LINUX的普及和为软件的开放,WSL是微软推出的主要面向开发者在windows下使用的系统
    Ø 这个可以大幅提高linux开发的便捷性和效率
    Ø 这个系统比较新,属于快速增长期,经过2代的演化,也比较成熟,在日常的开发中会逐步的普及

    命令行界面(英语:command-line interface,缩写:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(CUI)。
    通常认为,命令行界面(CLI)没有图形用户界面(GUI)那么方便用户操作。因为,命令行界面的软件通常需要用户记忆操作的命令,但是,由于其本身的特点,命令行界面要较图形用户界面节约计算机系统的资源。在熟记命令的前提下,使用命令行界面往往要较使用图形用户界面的操作速度要快。所以,图形用户界面的操作系统中,都保留着可选的命令行界面。
    在早期的计算机上,操作员可用的命令通常相对简单,但操作员很快就要求越来越高的复杂度,并且能够编写脚本来自动执行常规或重复或复杂的任务。因此,命令行处理器的复杂度不断提高,并演变成现在通常被称为命令行“shell”的处理机制。
    在UNIX/Linux中,原始的UNIX shell(sh)启发了大量的shell,包括Korn shell(ksh)、C shell(csh)和Bourne Shell(sh),它们本身引发了Bourne Again Shell(bash)等。

    原始的MS-DOS (command.com)是一个相对简单的命令行shell(可能比较古怪)。
    Windows NT的“命令行提示符Command Prompt” (cmd.exe)旨在与旧版MS-DOS command.com/批处理脚本兼容,并未新的、功能更强的操作系统体检了几个额外的命令。

    在2006年,Microsoft发布了Windows PowerShell,PowerShell是一款现代版的基于对象的命令行shell,受其他shell功能的启发,并且是基于.Net CLR & .NET框架基础之上的
    使用PowerShell后, Windows用户可以控制、编写脚本并自动执行Windows主机、Windows计算机组、网络、存储系统、数据等等各方面功能
    在2017年,Microsoft开源了PowerShell,并让其支持在macOS和诸多类Linux/BSD系统上运行。

    Windows Subsystem for Linux (WSL)
    在2016年,Microsoft引入了Windows下的linux子系统(WSL)
    在Windows 上直接支持真正的未经修改的Linux二进制文件执行,用户可以执行一个或多个发行版实例,并可以和现有windows应用程序及工具一起运行
    WSL使得Windows用户能够同时运行所有他们喜爱的Windows工具和Linux命令行工具,而无需双开或利用资源匮乏的虚拟机(VM)

    无论是VMARE,Virtualbox,HyperV等虚拟机,这些是完全隔离的环境,相当于独立的主机,网络、文件等是独立的。
    使用时可以使用X-windows或终端连接使用

    Cygwin,原 Cygnus 出品(已被红帽收购),目前是 RedHat 名下的项目。项目的目的是提供运行于 Windows 平台的类 Unix 环境(以 GNU 工具为代表),为了达到这个目的,Cygwin 提供了一套抽象层 dll,用于将部分 Posix 调用转换成 Windows 的 API 调用,实现相关功能。这里面最典型的,最基本的模拟层就是那个 cygwin1.dll。除此之外,随着 Linux 系统的发展壮大,目前的 Cygwin 已经不仅仅提供 POSIX 兼容,因此也顺带多了更多模拟层的依赖关系。
    Cygwin 的目录结构基本照搬了 linux 的样子,但同时,也兼容了 Windows 的许多功能:大部分应用使用 Unix 风格的路径,Windows的盘符通过类似挂载点的方式提供给 Cygwin 使用;Cygwin 中既可以运行 Cygwin 的应用(依赖模拟层),又可以运行 Windows 应用,而传递给应用的路径会经过它的模拟层变换,以此保证程序运行不会出错。
    由于它的模拟层实现了相当良好的 Posix 兼容,人们试着将许多重要的 Linux/BSD 应用移植到了Cygwin下,使得Cygwin越来越大,功能也越来越丰富,以至于目前很多人直接把将Linux应用移植到Windows平台的任务都交给了Cygwin(当然,这种移植并非原生)。事实上,Cygwin诞生之初,本就是想通过GCC编译出Windows应用来,因为bootstrap GCC而顺带搞了一坨别的东西过来,最后发展到现在的。
    小结:Cygwin是运行于Windows平台的POSIX“子系统”,提供Windows下的类Unix环境,并提供将部分 Linux 应用“移植”到Windows平台的开发环境的一套软件。按照我经常开玩笑的话来讲,Cygwin 基本上就是传说中的 GNU/NT 系统(对照 GNU/Linux,GNU/BSD,GNU/HURD)。

    MinGW,Minimalist GNU for Windows,用于开发原生(32位) Windows 应用的开发环境。它主要提供了针对 win32 应用的 GCC、GNU binutils 等工具,以及对等于 Windows SDK(的子集)的头文件和用于 MinGW 版本 linker 的库文件(so、a等,而不是 VC 的 lib)。
    MinGW 能够替代 cl 用于编译不包含 MFC 的、以 WinSDK 为主的 Windows 应用,并且编译出来的应用不依赖于第三方的模拟层支持,其运行时为大部分 Windows 标配的 msvcrt(故称原生 Windows 应用)。除此之外,MinGW 也支持 GCC 支持的其他语言。
    因为这些原因,MinGW 被许多 Linux 上发展起来的开发工具选择为 Windows 版本的默认编译器,例如 CodeBlocks,例如 DevC++。
    小结,MinGW 是用于进行 Windows 应用开发的 GNU 工具链(开发环境),它的编译产物一般是原生 Windows 应用,虽然它本身不一定非要运行在 Windows 系统下(是的 MinGW 工具链也存在于 Linux、BSD 甚至 Cygwin 下)。

    MinGW是针对 32 位 Windows 应用开发的。而且由于版本问题,不能很好的支持较新的 Windows API。MinGW-W64 则是新一代的 MinGW,支持更多的 API,支持 64 位应用开发,甚至支持 32 位 host 编译 64 位应用以及反过来的“交叉”编译。除此之外,它本身也有 32 位和 64 位不同版本,其它与 MinGW 相同。

    MSYS,由于 MinGW 本身仅代表工具链,而在 Windows 下,cmd,实在太差,以及配套的命令行工具不够齐全(也不舒服),因此,MinGW 开发者从曾经比较旧的 Cygwin 创建了一个分支,也用于提供类 Unix 环境。但与 Cygwin 的大而全不同,MSYS 是冲着小巧玲珑的目标去的,所以整套 MSYS 以及 MinGW,主要以基本的 Linux 工具为主,大小在 200M 左右,并且没有多少扩展能力。
    MSYS 是用于辅助 Windows 版 MinGW 进行命令行开发的配套软件包,提供了部分 Unix 工具以使得 MinGW 的工具使用起来方便一些。如果不喜欢庞大的 Cygwin,而且使用不多,可以试试。不过喜欢完整体验、不在乎磁盘占用等等,还是推荐 Cygwin 而不是 MSYS。
    MSYS2,由于 MinGW 万年不更新,MSYS 更是,Cygwin的许多新功能 MSYS 没有同步过来,于是 Alex 等人建立了新一代的 MSYS 项目。仍然是 fork 了 Cygwin(较新版),但有个更优秀的包管理器 pacman,有活跃的开发者跟用户组,有大量预编译的软件包(虽然肯定没有Cygwin多)……对于不喜欢庞大的 Cygwin 的用户而言,推荐试试 msys2。

    WSL将windows和linux环境进行了深度整合,可以做到
    Ø 文件可以互相访问
    Ø Linux中启动windows进程;反之,windows中也可以启动linux进程
    n 比如可以启动一个windows进程,然后将暑促通过管道传递给linux中的命令,使用体验和linux应用一致
    n 这种方式对开发来说相比虚拟机跨越windows linux环境操作,是非常的方便

    WSL(适用于 Linux 的 Windows 子系统)可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销。

    您可以:

    Ø 在 Microsoft Store 中选择你偏好的 GNU/Linux 分发版。
    Ø 运行常用的命令行软件工具(例如 grep、sed、awk)或其他 ELF-64 二进制文件。
    Ø 运行 Bash shell 脚本和 GNU/Linux 命令行应用程序,包括:
    Ø 工具:vim、emacs、tmux
    Ø 语言:NodeJS、Javascript、Python、Ruby、C/ C++、C# 与 F#、Rust、Go 等。
    Ø 服务:SSHD、MySQL、Apache、lighttpd、MongoDB、PostgreSQL。
    Ø 使用自己的 GNU/Linux 分发包管理器安装其他软件。
    Ø 使用类似于 Unix 的命令行 shell 调用 Windows 应用程序。
    Ø 在 Windows 上调用 GNU/Linux 应用程序。
    总之,在windows平台上可以高效利用windows 和linux的组合优势,消除虚拟机等各种跨系统的麻烦

    https://dbgtech.github.io/2017/09/06/Windows-Subsystem-Linux-internals.html
    windows 10在14393之后开始支持Ubuntu子系统WSL,全称Windows Subsystem for Linux(Windows的Linux子系统)。这个子系统并非Hyper-V启动Ubuntu的虚拟机,而是直接的Local系统,由子系统将Linux调用转成Native的API;这个子系统也不是简单cygwin扩展,而是比cygwin更像Linux操作系统。

    将适用于 Linux 的 Windows 子系统从 WSL 1 升级到 WSL 2 的主要区别和优势是:
    · 提高文件系统性能
    · 支持完全的系统调用兼容性
    · WSL2学习和使用汇集 - 图1
    https://docs.microsoft.com/zh-cn/windows/wsl/compare-versions
    从上述比较表中可以看出,除了跨操作系统文件系统的性能外,WSL 2 体系结构在多个方面都比 WSL 1 更具优势。


    WSL1 中,在Linux和windows 之间建立了一个翻译层,这层主要完成了在Windows内核上实现Linux的syscalls的调用,通过该步骤可以使用linux二进制文件无需修改即可运行。当linux二进制程序运行并且做syscalls调用时,WSL翻译层起作用并完成转换到windows内核的调用。
    WSL2学习和使用汇集 - 图2
    转换层负责填平linux和windows内核之间的不同,不过这个也会性能产生影响,如在WSL1中运行进行大量文件访问的应用时速度特别慢。
    另一方面,由于linux和windows内核的差异,翻译层很难来融合二者,比如windows下重命名目录看起来是错误的,但是在linux看起来确实成功的,这种情况下靠翻译层很难处理这种差别。
    由于有的syscalls没有实现,也导致额部分的linux应用无法在WSL1上运行。
    与虚拟机相比,wsl没有虚拟硬件的过程,而是直接在windows上虚拟一个linux内核,模拟linux系统调用,以运行linux执行文件。因此效率要比虚拟机高
    WSL2学习和使用汇集 - 图3
    wsl实现的组件涉及到了用户和内核模式。在Windows NT内核模式中,LXCore,LXSS这两个驱动提供了linux内核调用的实现,即将linux调用转化为对应的windows NT内核调用;还提供了两种文件系统:VolFs(挂载在/目录上,支持linux文件系统所有特性)和DriverFs(挂载在/mnt/c,/mnt/d等等windows分区,主要为了支持系统间的互操作性);驱动还会模拟内核的行为,对linux进程进行调度。
    在用户模式下,windows提供了一种特殊的进程类型:Pico进程,来支持linux进程的运行。windows会 “放松” 对该类型进程的控制,主要交由linux虚拟内核调用和管理,即隔离性(因此需要系统的支持,低版本的系统不能使用wls的功能)。pico会将ELF二进制可执行文件装入到自己的地址空间,然后执行在linux虚拟内核提供的兼容层上。一个pico对应一个linux进程,并且pico进程也是windows的一种特殊进程,因此你可以在任务管理器上看到linux进程。
    无论exe还是elf格式的二进制文件,原理上都可以在同架构的cpu上执行,只是结构不同操作系统不能解析罢了。而Pico能够解析ELF格式的二进制文件,只需要linux虚拟内核能够提供正确的系统调用,就能够运行大部分linux命令。
    LXSS管理服务主要用于协调windows和linux进程之间的关系,和给于Bash.exe(并不是shell,只是我们访问wsl的入口)调用linux命令的接口。所有的运行的linux进程都会被加入到叫Linux实例(应该有LXSS记录的)中,只有第一次请求访问linux进程时才会创建Linux实例,才会创建init进程;当window关机时,会自动关闭linux实例,即关闭linux所有进程。
    也就是wsl不会随windows系统自启而自启,同时没有使用发行版的init进程,导致wsl中没有服务的存在。

    WSL 2 是对基础体系结构的一次重大改造,它使用虚拟化技术和 Linux 内核来实现其新功能。 此更新的主要目标是提高文件系统性能和添加完全的系统调用兼容性。
    WSL 2 体系结构
    传统的 VM 体验可能启动速度慢,是独立的,消耗大量资源,需要你花费时间进行管理。 WSL 2 没有这些属性。
    WSL 2 有 WSL 1 的优点,包括 Windows 和 Linux 之间的无缝集成,启动时间短,资源占用量少,并且无需 VM 配置或管理。 虽然 WSL 2 确实使用 VM,但 VM 是在幕后管理和运行的,因此你将具有与 WSL 1 相同的用户体验。
    最大的不同是WSL2使用了轻量级虚拟机【https://docs.microsoft.com/en-us/windows/wsl/wsl2-about 】。这个虚拟机使用少量的内存,可以快速的启动,当运行进程需要更多内存时,虚拟机会动态增加内存,而且更好的是,内存是和主机共享的,不像其他普通的虚拟机,是独立暂用的内存。
    WSL2学习和使用汇集 - 图4
    WSL2运行时,运行的时真正的linux内核【 https: //github. com/microsoft/WSL2-Linux-Kernel 】。这就避免了WSL1中的方案的缺陷。
    多数场景下WSL2是更好的版本,不过也有2点需要主要
    1 WSL2的GPU和USB支持问题 【详细参考 https: //docs. microsoft. com/en-us/windows/wsl/wsl2-faq#can-i-access-the-gpu-in-wsl-2-are-there-plans-to-increase-hardware-support 】
    2 网络问题:WSL2通过独立的网卡适配器使用网络

    WSL2学习和使用汇集 - 图5
    WSL2采用了ext4文件系统,和传统的Hyper-V上玩Linux虚拟机没什么不同,最终都放在了虚拟硬盘文件中。我并不确定Windows NT子系统是否能够在Hypervisor中获取这些硬盘文件,但即便能够访问,对于Windows子系统来说,从这个文件中提取Linux主机上保存的某个文件这样的事情也真的太过于复杂。
    一个简单的办法就是文件共享,毕竟这是最为成熟的解决方案。但也许是复杂度的原因,MS并没有采用SMB协议,而是采纳了贝尔实验室的9P。简单说,9P是为分布式操作系统设计的网络协议,MS根据这个协议搞了一个子系统间的文件共享系统。

    WSL2学习和使用汇集 - 图6
    根据MS的规则,\WSL$\\<文件path> 就可以访问Linux子系统中的文件了。
    用dir命令查看Linux子系统中的文件
    既然Windows子系统和Linux子系统之间彼此独立,支持网络共享文件,那么也就是一定存在网络访问的方式喽。
    Linux子系统的网络配置
    WSL2学习和使用汇集 - 图7
    从上面的图可以看出,MS真的很大方,这个网络相当于16个C类网段。能看出,Linux虽然可以访问外网,但走的是WIndows子系统的转发。那么外面该如何访问Linux呢?当然是Windows端口代理了: netsh interface portproxy add ……
    MS实现了WIndows子系统中Localhost访问WSL2的能力(127.0.0.1不行),另外的坑就是WSL2的IP地址不能固定。虽然MS做了很多努力,但把两个子系统的网络完全整合到一起是不大可能实现的事情,起码短期无法解决。因为端口具有其特殊的含义,比如:22,443,80等等等等,而两个独立系统会有重叠的情况。还有转发的各种规则,加上实际的网络远比理论要复杂很多,灵活运用才是正道。

    假如OS 的构建号低于“18917”, 那系统安装的就是WSL1;高于“18917”的系统安装的就是WSL2
    如下图的19043的构建号就是WSL2,此时wsl -l -v就支持
    WSL2学习和使用汇集 - 图8
    WSL2学习和使用汇集 - 图9

    To run WSL 2, you need to be on version 1903 or higher with OS build 18362 or higher.必须运行 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11。
    winver查看windows版本
    WSL2学习和使用汇集 - 图10
    https://docs.microsoft.com/zh-cn/windows/wsl/install

    WSL2学习和使用汇集 - 图11

    Ø 方式1:
    n wsl. exe —install
    n 有的还不支持
    Ø 方式2:
    n dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    n dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

    **

    https://docs.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—-download-the-linux-kernel-update-package

    将 WSL 2 设置为默认版本
    打开 PowerShell,然后在安装新的 Linux 发行版时运行以下命令,将 WSL 2 设置为默认版本:
    wsl —set-default-version 2

    搜索linux
    WSL2学习和使用汇集 - 图12

    WSL2学习和使用汇集 - 图13
    WSL2学习和使用汇集 - 图14
    WSL2学习和使用汇集 - 图15

    WSL2学习和使用汇集 - 图16

    WSL2学习和使用汇集 - 图17
    PS C:\Users\Lenovo> wsl -d Ubuntu-20.04 cat /etc/issue
    Ubuntu 20.04.2 LTS \n \l

    WSL2学习和使用汇集 - 图18

    wsl —help

    [automount]
    enabled = true # control host drive mounting (e. g. /mnt/c)
    mountFsTab = true # process /etc/fstab for additional mounts
    root = /mnt/ # control where drives are mounted
    [interop]
    enabled = true # allow WSl to launch Windows processes
    appendWindowsPath = true # add Windows PATH to $PATH in WSL
    [network]
    generateHosts = true
    generateResolvConf = true
    [user]
    default=stuart

    详细参考地址
    https://docs.microsoft.com/en-us/windows/wsl/wsl-config#configure-per-distro-launch-settings-with-wslconf

    C: \Users\. wslconfig
    [wsl2]
    memory=4GB
    processors=2
    localhostForwarding=true
    swap=6GB
    swapFile=D: \Temp\WslSwap. Vhdx

    详细参考地址
    https://docs.microsoft.com/en-us/windows/wsl/wsl-config#configure-global-options-with-wslconfig

    https://docs.microsoft.com/zh-cn/windows/wsl/install-manual 命令行安装
    https://docs.microsoft.com/zh-cn/windows/wsl/wsl2-faq 常见问题

    https://docs.microsoft.com/en-us/windows/wsl/wsl-config

    https://hub.fastgit.org/PacktPublishing/Windows-Subsystem-for-Linux-2-WSL-2-Tips-Tricks-and-Techniques/tree/main/chapter-10

    为了方便如下的展示和统一使用体验,请参考“”在windows下安装好git bash带的shell环境,这样就可以统一使用bash来体验windows linux之间的无缝衔接了。
    先在git bash 中执行 $ wsl -d Ubuntu-20.04 bash 确保WSL Linux环境在运行,类似如下
    WSL2学习和使用汇集 - 图19
    可以看下linux的运行的进程
    WSL2学习和使用汇集 - 图20

    先看个最基础的例子
    WSL2学习和使用汇集 - 图21
    首先在windows系统的根C下启动个git-bash的命令行界面,
    输入pwd,可以看到windows的路径为/c,表示的就是c盘
    输入 wsl -d Ubuntu-20.04 bash -c “ls” ,表示启动了wsl的环境,此时在wsl的环境下看pwd,目录就变为从linux环境看到的Windows的c盘,默认被挂载到linux下的/mnt/c目录下

    windows系统直接可以访问linux系统的文件,只要输入 \wsl$ 即可看到当前机器上运行的WSL实例,如下的ubuntul例子,在资源管理器中输入 \wsl$\ubuntu20\opt 即可查看ubuntu20这个linux系统的/opt目录,当然也就可以进行文件的拷贝和传递
    WSL2学习和使用汇集 - 图22
    WSL2学习和使用汇集 - 图23
    如上是图形界面的形式可以在windows和linux之间互相拷贝

    当然由于有了windows bash环境,我们也可以通过桥接通过shell来做拷贝
    WSL2学习和使用汇集 - 图24
    如上直接使用wsl命令运行拷贝文件的shell将windows目录c:/temp下“前端.html”拷贝了wsl linux系统的/opt目录下

    通过c盘下temp/mq目录下的jar包文件格式,使用windows bash和wsl可以如下执行
    WSL2学习和使用汇集 - 图25
    【由于git bash中有wc命令,当然可以直接执行,find . -name “*.jar” | wc -l ,这是这个管道的作用不明显】

    WSL2学习和使用汇集 - 图26
    dir -s *.jar|wsl -d Ubuntu-20.04 bash -c ‘grep -ins “.jar” |wc -l’
    如上子所以加了grep的命令是因为dir输出的不规律,类似如下,使用grep统一规范下再计数【此时就可看到普通的windows命令结合wsl linux内的命令可以完成很多日常的工作】
    WSL2学习和使用汇集 - 图27

    WSL2学习和使用汇集 - 图28
    如上,wsl -d Ubuntu-20.04 bash -c “ls /usr/bin |cur -c1” 使用wsl linux命令查看/usr/bin下的文件,并截取第一个字符
    整个输出管道进入windows,然后使用windows的powershell命令Group-Object对上面的输出进行分组和计数

    WSL2学习和使用汇集 - 图29
    如上图
    nc -l 4000在wsl linux内启动了一个服务
    windows上gitbash中直接使用curl http://localhost:4000 可以看到可以直接访问
    当然其他的服务也一样

    **[

    参考如下 Dockerfile文件制作桌面版LINUX 像做好带桌面环境的LINUX
    系统启动后,可以看到其IP和网卡的情况,IP默认是动态分配的,占用接口eth0
    WSL2学习和使用汇集 - 图30

    如下可以直接查看当前的linux的IP地址
    PS C:\Users\Lenovo>wsl -d bcubuntu20 -u bc bash -c “
    Sleeping for 1 second to let systemd settle
    172.30.55.25
    PS C:\Users\Lenovo> ping 172.30.55.25**
    正在 Ping 172.30.55.25 具有 32 字节的数据:
    来自 172.30.55.25 的回复: 字节=32 时间<1ms TTL=64

    wsl -d bcubuntu20 -u bc bash -c “sudo systemctl start xrdp; systemctl status xrdp”

    echo “msstc”
    FOR /F “usebackq” %%i IN (wsl -d bcubuntu20 -u bc bash -c "ifconfig eth0 | grep 'inet '|cut -d' ' -f 10") DO @set IP=%%i
    echo %IP%

    start mstsc -v:%IP%

    @echo off
    @echo offsetlocal enabledelayedexpansion

    :: 启动xrdp
    wsl -d Ubuntu-20.04 -u wushifeng systemctl start xrdp

    :: 固定WSL IP的地址
    echo wsl started
    :: set wsl2 ip
    wsl -d Ubuntu-20.04 -u root ip addr | findstr “192.168.169.2” > nul
    if !errorlevel! equ 0 (
    echo wsl ip has set
    ) else (
    wsl -d Ubuntu-20.04 -u root ip addr add 192.168.169.2/28 broadcast 192.168.169.15 dev eth0 label eth0:1
    echo set wsl ip success: 192.168.169.2
    )

    :: set windows ip
    ipconfig | findstr “192.168.169.1” > nul
    if !errorlevel! equ 0 (
    echo windows ip has set
    ) else (
    netsh interface ip add address “vEthernet (WSL)” 192.168.169.1 255.255.255.240
    echo set windows ip success: 192.168.169.1
    )

    :: 远程连接
    echo “remote connect ubuntu”
    mstsc /v:192.168.169.2

    echo “done”

    在wsl Linux可见windows的磁盘是mount到/mnt下,c盘就是/mnt/c,d盘就是/mnt/d,依此类推
    WSL2学习和使用汇集 - 图31
    关于文件操作等和上面的一致


    wushifeng@DESKTOP-CBS9UO5:~$ echo $PATH
    /opt/apache-maven-3.8.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files/TortoiseSVN/bin:/mnt/c/HashiCorp/Vagrant/bin:/mnt/c/Program Files/nodejs/:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/ProgramData/DockerDesktop/version-bin:/mnt/c/Program Files/Git/cmd:/mnt/c/Python27/Scripts:/mnt/c/Python27:/mnt/c/Users/Lenovo/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/Lenovo/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/c/work/runtime/apache-maven-3.6.3/bin:/mnt/c/Program Files/JetBrains/IntelliJ IDEA 2021.1/bin:/mnt/c/Users/Lenovo/AppData/Roaming/npm:/mnt/c/tool/pmd-bin-6.33.0/bin

    由于环境变量已经存在,因此可以在wsl linux中直接执行Windowsd的命令。如想在wsl linux中访问windows的注册表信息,使用powershell命令直接可以在linux中运行
    powershell.exe -C “Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System”
    WSL2学习和使用汇集 - 图32

    管道的使用和上面基本一致。可以把windows下的命令程序输出的内容在wsl linux进行处理。
    powershell.exe -C “Get-Content c:/temp/前端.html” | wc -l
    如上,通过windows的powershell命令拿到文件的内容,然后通过管道在linux进行进行计数,输出结果类似如下
    WSL2学习和使用汇集 - 图33

    如上“MSTSC访问Linux桌面例子”可见wsl Linux的ip地址默认是动态的,而且wsl系统默认将本机没有的服务地址会nat转换到wsl linux上,因此windows访问linux的服务非常方便
    linux访问windows的服务稍微麻烦一些,下面以默认的动态ip为例说明:
    可以在WSL linux内定义两个变量,如下
    WSL_PATH=/mnt
    WSL_IP_WINSERVER=cat /etc/resolv.conf | grep nameserver | awk '{print $2}'
    其中
    WSL_PATH表示wsl Linux默认挂载的windows磁盘的位置
    WSL_IP_WINSERVER是wsl Linux启动后动态获取到的windows主机的IP
    有了如上的信息,就可以基于ip,访问windows的各种文件和服务了

    从微软store商店下载

    在已有的基础上增加自己的软件和内容,然后重新导出
    导出时注意更新下文件:/etc/wsl. conf
    sudo bash -c “echo -e ‘ \n[user] \ndefault=$(whoami) ‘ >> /etc/wsl. conf”

    导入和导出的命令类似如下
    wsl —export Ubuntu-18. 04 c: \temp\Ubuntu-18. 04. tar
    wsl —import Ubuntu-18. 04-Copy C: \wsl-distros\Ubuntu-18. 04-Copy C: \temp\Ubuntu-18. 04. tar

    wsl.exe —import bcubuntu20 ./distros ./ubuntu.20.04.tar
    bcubuntu20 导入的名字
    ./distros 保存导入后镜像文件的路径
    ./ubuntu.20.04.tar 镜像文件

    **[

    FROM ubuntu:20.04
    ARG USERNAME
    ARG PASSWORD

    USER root

    RUN useradd -m ${USERNAME}
    RUN bash -c ‘ echo -e “${PASSWORD}\n${PASSWORD}\n” | passwd ${USERNAME}’
    RUN bash -c ‘ echo -e “[user] \ndefault=${USERNAME}” > /etc/wsl.conf’
    RUN usermod -aG sudo ${USERNAME}

    # https源 No system certificates available. Try installing ca-certificates
    RUN apt-get update && apt-get -y install apt-transport-https ca-certificates

    COPY files/sources.list /etc/apt/
    # https://anonoz.github.io/tech/2020/04/24/docker-build-stuck-tzdata.html
    RUN apt-get update && DEBIAN_FRONTEND=noninteractive TZ=Asia/Singapore apt-get -qqy install sudo ubuntu-desktop
    RUN apt-get -y install xrdp gnome-tweaks curl net-tools

    #systemd的问题修正
    ADD files/ubuntu-wsl2-systemd-script /opt/ubuntu-wsl2-systemd-script
    RUN chmod +x /opt/ubuntu-wsl2-systemd-script/ubuntu-wsl2-systemd-script.sh && cd /opt/ubuntu-wsl2-systemd-script/;bash ubuntu-wsl2-systemd-script.sh

    # https://code.visualstudio.com/docs/setup/linux
    COPY files/vscode.list /etc/apt/sources.list.d/
    RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg —dearmor > /etc/apt/trusted.gpg.d/packages.microsoft.gpg && apt-get update; apt install code

    # DEV IDE
    ADD files/pkg/ideaIU-2020.3.3.tar.gz /opt/
    ADD files/pkg/apache-maven-3.8.1-bin.tar.gz /opt/
    COPY files/pkg/ide-eval-resetter-2.1.13-da33a93d.zip /opt/

    # DEV
    RUN apt-get install -y vim openjdk-8-jdk docker.io docker-compose && apt-get clean

    #快速的启动链接
    COPY fils/idea /usr/bin/
    COPY fils/ff /usr/bin/
    RUN chmod +x /usr/bin/idea; chmod +x /usr/bin/ff; mkdir -p /home/bc/.m2

    COPY files/settings.xml /root/.m2/
    COPY files/settings.xml /home/bc/.m2/
    COPY files/bash.bashrc /etc/
    # for pack systemd on wsl
    COPY files/svc.sh /opt/

    #Chinese
    RUN apt-get -y install language-pack-zh-hans
    #https://www.apull.net/html/20200604102131.html
    COPY files/locale.gen /etc/
    COPY files/locale /etc/default
    RUN locale-gen

    !/bin/bash
    set -euo pipefail
    BaseDir=$(cd “$(dirname “$0”)”; pwd)
    cd ${BaseDir}

    docker build -t ubuntu:20.04 -f Dockerfile —build-arg USERNAME=bc —build-arg PASSWORD=bc .

    docker images | grep ubuntu
    :<镜像安全检查
    Use ‘docker scan’ to run Snyk tests against images to find vulnerabilities and learn how to fix them
    PS C:\work\prod\bimdev\wsl> docker scan ubuntu:20.04
    EOF

    echo “export UBUNTU 20.04 docker image”
    #image格式wsl不认识
    #docker save ubuntu:20.04 -o ubuntu.20.04.tar
    #
    docker run —name ubuntu_instance ubuntu:20.04
    docker export -o ubuntu.20.04.tar ubuntu_instance
    docker rm ubuntu_instance

    echo “done”

    **WSL

    @echo off

    rem inet 172.18.248.76 netmask 255.255.240.0 broadcast 172.18.255.255

    echo “systemd pack”
    start wsl -d bcubuntu20 -u bc bash -x /opt/svc.sh
    sleep 2

    wsl -d bcubuntu20 -u bc bash -c “sudo systemctl start xrdp; systemctl status xrdp”
    wsl -d bcubuntu20 -u bc bash -c “sudo systemctl start docker; systemctl status docker”

    echo “msstc”
    FOR /F “usebackq” %%i IN (wsl -d bcubuntu20 -u bc bash -c "ifconfig eth0 | grep 'inet '|cut -d' ' -f 10") DO @set IP=%%i
    echo %IP%

    start mstsc -v:%IP%

    rem pause

    **

    如下使用这个软件mobaXterm【 具体参考 MobaXterm 】,其内置了x11 server
    WSL2学习和使用汇集 - 图34
    https://mobaxterm.mobatek.net/download.html free版本
    WSL2学习和使用汇集 - 图35
    WSL2学习和使用汇集 - 图36


    WSL2学习和使用汇集 - 图37

    WSL 不支持 systemd 而 Gnome 桌面又是基于 systemd,所以先解决这个问题。
    (参考:https://github.com/DamionGans/ubuntu-wsl2-systemd-script

    从SHELL中启动的GUI程序的命令
    - 资源管理器
    export DISPLAY=cat /etc/resolv.conf | grep nameserver | awk '{print $2}':0.0; nautilus
    - 系统监控
    export DISPLAY=cat /etc/resolv.conf | grep nameserver | awk '{print $2}':0.0; gnome-system-monitor

    export DISPLAY=cat /etc/resolv.conf | grep nameserver | awk '{print $2}':0.0; gnome-terminal

    WSL2学习和使用汇集 - 图38



    如下的命令即可实现,将wsl linux内的idea启动到windows桌面,更方便使用
    export DISPLAY=cat /etc/resolv.conf | grep nameserver | awk '{print $2}':0.0
    /opt/idea-IU-203.7717.56/bin/idea.sh

    https://devblogs.microsoft.com/commandline/wslg-architecture/
    WSL2学习和使用汇集 - 图39

    https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/deploy-containers/linux-containers
    WSL2学习和使用汇集 - 图40

    单独安装docker的方法【有些麻烦,由于docker的许可策略也变更,不建议使用,建议使用docker desktop安装】
    #以管理员身份运行 powershell 安装docker
    :<#docker ce:这个只能运行windows版本的容器
    #第一步安装docker支持模块,第二步安装docker,第三步重启计算机
    Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
    Install-Package -Name docker -ProviderName DockerMsftProvider
    #设置环境变量
    Env:DOCKER_HOST=”tcp://localhost:2375”
    [environment]::SetEnvironmentvariable(“DOCKER_HOST”,”tcp://localhost:2375”,[System.EnvironmentVariableTarget]::Machine)

    Restart-Service docker
    Restart-Computer -Force
    EOF
    # 默认安装的只能运行windows内核的镜像 https://hub.docker.com/search?q=&type=image&operating_system=windows
    # https://www.qedev.com/linux/333372.html
    # https://www.altaro.com/msp-dojo/linux-containers-windows-server-2019/
    :<运行Linux容器,为了和linux环境最大程度一致,我们使用这个
    #卸载当前的Docker CE:
    Uninstall-Package -Name docker -ProviderName DockerMsftProvider
    Uninstall-Package -Name docker -ProviderName DockerMSFTProvider
    #如果你使用在Hyper-V上运行的Linux虚拟机运行Docker容器,则启用嵌套虚拟化:
    #虚拟机处于关闭状态时,请在物理 Hyper-V 主机上运行以下命令。 这样可以实现虚拟机的嵌套虚拟化。
    Get-VM WinContainerHost | Set-VMProcessor -ExposeVirtualizationExtensions $true
    Set-VMProcessor -VMName winserver_default_1624511692570_62827 -ExposeVirtualizationExtensions $true

    #然后安装Docker EE的当前预览版本:
    Install-Module DockerProvider -Force
    Install-Package docker -ProviderName DockerProvider -RequiredVersion preview

    #启用LinuxKit系统以运行Linux容器:
    [Environment]::SetEnvironmentVariable(“LCOW_SUPPORTED”, “1”, “Machine”)
    #更改后重新启动Docker Service:
    Restart-Service dockeret-VM WinContainerHost | Set-VMProcessor -ExposeVirtualizationExtensions $true

    #要切换回运行的Windows容器,请运行:
    [Environment]::SetEnvironmentVariable(“LCOW_SUPPORTED”, “$null”, “Machine”)
    EOF

    **

    https://www.docker.com/products/docker-desktop
    这个工具很全,安装后docker docker-compose可以直接使用

    PS C:\Users\Lenovo> wsl -l -v
    NAME STATE VERSION
    * docker-desktop-data Running 2
    docker-desktop Running 2
    WSL2学习和使用汇集 - 图41
    WSL2学习和使用汇集 - 图42

    PS C:\Users\Lenovo> docker info
    Client:
    Context: default
    Debug Mode: false
    Plugins:
    app: Docker App (Docker Inc., v0.9.1-beta3)
    buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
    scan: Docker Scan (Docker Inc., v0.6.0)

    Server:
    Containers: 0
    Running: 0
    Paused: 0
    Stopped: 0
    Images: 15

    Storage Driver: overlay2
    Backing Filesystem: extfs
    Supports d_type: true
    Native Overlay Diff: true
    Logging Driver: json-file
    Cgroup Driver: cgroupfs
    Cgroup Version: 1
    Plugins:
    Volume: local
    Network: bridge host ipvlan macvlan null overlay
    Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
    Swarm: inactive
    Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
    Default Runtime: runc
    Init Binary: docker-init
    containerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
    runc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
    init version: de40ad0
    seccomp
    Profile: default
    Kernel Version: 5.4.72-microsoft-standard-WSL2
    Operating System: Docker Desktop
    OSType: linux
    Architecture: x86_64
    CPUs: 8
    Total Memory: 12.29GiB
    Name: docker-desktop
    ID: DRJS:GQTH:M7OJ:SOQQ:SWSV:ME6A:S5OQ:NKNN:3EVK:TLWX:OX42:65NN
    Docker Root Dir: /var/lib/docker
    Debug Mode: false
    Registry: https://index.docker.io/v1/
    Labels:
    Experimental: false
    Insecure Registries:
    127.0.0.0/8
    Registry Mirrors:
    [
    [
    ** [
    Live Restore Enabled: false
    PS C:\Users\Lenovo> docker version
    Cloud integration: 1.0.12
    Version: 20.10.5
    API version: 1.41
    Go version: go1.13.15
    Git commit: 55c4c88
    Built: Tue Mar 2 20:14:53 2021
    OS/Arch: windows/amd64
    Context: default
    Experimental: true

    Server: Docker Engine - Community
    Engine:
    Version: 20.10.5
    API version: 1.41 (minimum version 1.12)
    Go version: go1.13.15
    Git commit: 363e9a8
    Built: Tue Mar 2 20:15:47 2021
    OS/Arch: linux/amd64
    Experimental: false
    containerd:
    Version: 1.4.4
    GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
    runc:
    Version: 1.0.0-rc93
    GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
    docker-init:
    Version: 0.19.0
    GitCommit: de40ad0
    PS C:\Users\Lenovo> docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

    下例中以最基本的一个busybox镜像为例,没写版本的默认是latest版本
    运行的容器名称指定的也为busybox
    [busybox是精简的linux命令行工具,将linux的大部分命令都达到一个执行文件busybox中]
    Ø 基本名词
    n image: 系统的镜像
    n container: 运行的容器,可以理解为镜像的实例

    命令 例子
    run docker run -it busybox
    以默认的busybox的latest版本镜像运行容器,容器是随机名字
    docker run -it —name busybox busybox
    docker run -it —name busybox busybox:latest
    以默认的busybox的latest版本镜像运行容器,容器是busybox 名字
    docker run —rm -it —name busybox busybox:latest
    —rm 运行后推出shell时,容器自动删除

    docker run -it -v ./hostDir:/opt —name busybox busybox
    挂载主机的目录启动,-v 映射主机的./hostDi目录到容器的/opt下
    docker run -it -p hostPort:port —name busybox busybox
    使用NAT端口转换模式启动容器,这样容器的port这个服务端口就映射到宿主机的hostPort端口,宿主机直接访问localhost:hostPort即可访问容器内的服务
    -it是交互模式启动,启动后一般会进入shell

    docker run -d busybox
    守护方式启动,运行后命令直接返回,可以使用exec attach等进入shell
    exec docker exec -it busybox sh
    进入运行的容器busybox的shell环境
    attach docker attach busybox
    attach到一个已经运行的容器的stdin
    cp docker cp file busybox:/opt/
    将宿主机的file文件或目录拷贝到容器busybox的/opt目录下【如果file是目录的化,是将file下的所有文件拷贝到/opt,如果想保留目录,使用docker cp file busybox:/opt/file】
    容器和宿主机可以互相拷贝
    rm docker rm busybox -f
    强制删除命名容器busybox
    docker rm 9e -f
    强制删除命名容器编号为9e开头的容器
    start/stop docker start busybox
    docker stop busybox
    容器的启停命令
    查看容器运行相关的信息
    ps docker ps -a
    可以查看当前所有的容器,包括已经停止的容器
    docker ps
    查看当前所有运行中的容器
    logs docker logs busybox
    查看容器的日志信息
    stats docker stats busybox
    查看容器的统计信息
    inspect docker inspect busybox
    查看容器各种配置信息
    top docker top busybox
    查看该运行容器busybox内的top输出信息【注意直接在容器内执行top看到的是宿主机的信息】
    镜像相关
    save docker save busybox:lastest -o busy.tar
    导出镜像名为busybox的lastest版本的镜像为busy.tar,该镜像可以压缩分发【导入时需要对应解压】
    load docker load -i busy.tar
    导入 busy.tar的镜像文件
    build docker build -t busy:2021 .
    使用当前运行目录的Dockerfile文件构建一个busy镜像,版本号设置为2021
    系统级相关
    volume docker volume —help
    docker管理的本机卷
    system docker system prune -f
    清理docker使用的历史数据
    network docker network —help
    docker管理网络


    PS C:\Users\Lenovo> docker ps —format “table {{.ID}}\t{{.Names}}\t{{.Ports}}\t{{.Status}}” —no-trunc
    CONTAINER ID NAMES PORTS STATUS
    b946c788ffd2f44ec5ea8dd1047d34edcab17dc52c3ea344064b0ecf3a665ebe busybox Up 26 seconds

    docker exec -i -uroot oracledb bash -c “mkdir -p /app/oracle/oradata/orcl/; chmod 777 -R /app/oracle/oradata/orcl”

    **运行
    #https://hub.docker.com/r/owasp/dependency-check
    DC_VERSION=”6.1.5”
    DC_DIRECTORY=${BaseDir}/OWASP-Dependency-Check
    DC_PROJECT=”dependency-check scan: $(pwd)/web”
    DATA_DIRECTORY=”$DC_DIRECTORY/data”
    CACHE_DIRECTORY=”$DC_DIRECTORY/data/cache”
    SRC_DIRECTORY=”$DC_DIRECTORY/src”

    # 命令行参数
    https://jeremylong.github.io/DependencyCheck/dependency-check-cli/arguments.html
    USER=$(whoami)
    docker run —rm \
    -e user=$USER \
    -u $(id -u ${USER}):$(id -g ${USER}) \
    —volume $SRC_DIRECTORY:/src:z \
    —volume $DATA_DIRECTORY:/usr/share/dependency-check/data \
    —volume ${DC_DIRECTORY}/odc-reports:/report:z \
    owasp/dependency-check:$DC_VERSION \
    —scan /src/${WAR_FILE} \
    —format “CSV” —format “HTML”\
    —project $DC_PROJECT \
    —out /report -n —log /report/dc.log

    GRAPHD_IP=$(docker inspect —format=’{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ $(docker ps —format “{{.Names}} {{.Ports}}”|grep “9669->9669”|cut -d ‘ ‘ -f 1))
    echo “graphd server:${GRAPHD_IP}”

    https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/about/
    容器是一个隔离的轻型包,用于在主机操作系统上运行应用程序。 容器在主机操作系统的内核(可以将其视为操作系统的隐藏管道)上构建,如下图所示。
    WSL2学习和使用汇集 - 图43
    Microsoft 提供多个映像(称为基础映像),你可以从其着手构建自己的容器映像:
    Ø Windows - 包含整套 Windows API 和系统服务(服务器角色除外)。
    Ø Windows Server - 包含整套 Windows API 和系统服务。
    Ø Windows Server Core - 一个较小的映像,包含部分 Windows Server API - 即完整的 .NET Framework。 它还包括大部分服务器角色,但遗憾的是数目太少,不包括传真服务器。
    Ø Nano Server - 最小的 Windows Server 映像,支持 .NET Core API 和某些服务器角色。

    https://hub.docker.com/ docker官方提供的仓库
    其他仓库参考

    仓库 备注
    ghcr.io github开放的容器仓库
    container-registry.oracle.com oracle产品的容器镜像
    https://hub.fastgit.org/oracle/docker-images
    oracle官方提供的其产品容器镜像,可以直接使用体验
    registry.redhat.io redhat官方的镜像
    https://quay.io/ 这个也是redhat运营
    gcr.io 国内被墙,翻墙使用,也可以进行海外构建到自己的仓库使用
    国内的几个镜像地址 https://registry.docker-cn.com
    http://hub-mirror.c.163.com
    https://docker.mirrors.ustc.edu.cn

    类别 概要描述 优点 缺点
    docker registry
    官方的提供的镜像管理工具,比较简单易用
    https://docs.docker.com/registry/
    使用最简单 高级功能和安全等都没有
    nexus 3 时间长,管理的软件类别多
    https://www.sonatype.com/products/repository-oss-download
    产品历史比较长,开源版本3开始支持docker镜像,支持各种软件类别的管理,如maven nodejs ruby rpm等等 没有harbon功能完善和专业
    harbon Harbor是由VMware公司开源的企业级的Docker Registry管理项目,相比docker官方拥有更丰富的权限权利和完善的架构设计,适用大规模docker集群部署提供仓库服务。
    https://github.com/goharbor
    功能非常完善,适合企业级使用 比较复杂

    https://cr.console.aliyun.com/cn-beijing/instances
    WSL2学习和使用汇集 - 图44

    比如us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller:v0.34.1 这个镜像在翻墙的地址上,此时即可使用海外构建,构建到自己的仓库
    Ø 步骤1
    在github或者codeup等如下图阿里云可以访问的代码库上放上Dockerfile文件,如
    https://hub.fastgit.org/wushifeng/hub-k8s-artifacts-prod-ingress-nginx-controller
    Ø
    在个人的仓库中构建,类似如下界面,只要选上海外构建即可
    当让如果启用用户,可以选择自己的企业容器仓库,操作步骤一样
    WSL2学习和使用汇集 - 图45

    上载私有镜像的检测步骤
    # https://segmentfault.com/a/1190000015629878
    # https://www.cnblogs.com/jihongjun/p/8968901.html

    # 使用本地地址标记好
    docker tag busybox 127.0.0.1:8084/busybox:2020
    # 上传镜像
    docker login -u admin -p csbit2020 127.0.0.1:8084
    docker push 127.0.0.1:8084/busybox:2020

    Docker容器镜像本质上是堆积的文件,稍后将被实例化为正在运行的容器。 Docker利用联合文件系统(UnionFS)设计,其中文件按层分组在一起。 每一层可能包含一个或多个文件,并且每一层都位于上一层的顶部。 作为最终用户,我们体验了作为统一文件系统的所有层的所有内容的虚拟运行时合并:
    WSL2学习和使用汇集 - 图46
    A simplified view of UnionFS (Image by the author)
    UnionFS的底层实现向我们提供的最终文件系统视图(Docker通过可插拔存储驱动程序支持许多不同的视图)具有其所构成的所有层的总大小。 Docker为图像创建容器时,它将以只读格式使用镜像的所有层,并在它们之上添加一个薄的读写层。 这个薄的读写层使我们能够实际修改正在运行的Docker容器中的文件:
    WSL2学习和使用汇集 - 图47
    A running container adds a read-write layer on top of an image’s read-only layers.
    如果在上述第4层中删除了文件,会发生什么情况? 尽管已删除的文件不会再出现在观察到的文件系统中,但是由于该文件包含在较低的只读层中,因此它最初占用的大小仍将是容器占用空间的一部分。
    从一个小的应用程序二进制文件开始到以一个胖容器镜像结束是相对容易的。 在以下各节中,我们将探索不同的方法来使镜像的尺寸尽可能地薄。

    我们构建Docker镜像的最常见方式是什么?
    docker build .
    上面的命令告诉Docker我们将当前的工作文件夹视为构建过程的根文件系统路径。
    为了更好地理解发出上述命令时实际发生的情况,我们应该记住,Docker构建是一个客户端-服务器进程。 我们从中执行docker build命令的Docker CLI(客户端)使用基础Docker引擎(服务器)来构建容器镜像。 为了限制对客户端基础文件系统的访问,构建过程需要知道虚拟文件系统的根目录是什么。 正是在此确切路径下,Dockerifle中的任何命令都试图查找可能最终在正在生成的镜像中结束的文件资源。
    让我们考虑一下我们通常放置Dockerfile的位置。 在项目的根源中,也许吧? 好吧,将项目根目录中的Dockerfile与Docker构建相结合,我们已经有效地添加了完整的项目文件夹作为构建的潜在文件资源。 这可能会导致在构建上下文中不必要地添加多个MB和数千个文件。 如果我们不小心在Dockerfile中定义了ADD / COPY命令,则所有这些文件都可以成为最终镜像的一部分。 在大多数情况下,这不是我们所需要的,因为最终容器镜像中仅应包含一些选定的项目人工制品。
    始终检查是否为Docker构建提供了适当的构建路径,并且Dockerfile没有向镜像添加不必要的文件。 如果出于任何原因确实需要将项目的根目录定义为构建上下文,则可以通过.dockerignore有选择地包括/排除文件。

    **

    命令合并的另一种方法是使用Docker的squash命令构建镜像,尤其是在使用您不希望或无法修改的其他Dockerfile时。
    除非您使用的是非常老的Docker版本(<1.13),否则Docker允许我们将所有层压缩为一个层,从而有效地删除所有虚幻资源。 我们仍然可以将原始的,未更改的Dockerfile与许多单独的命令一起使用,但是这次我们通过--sqash选项执行构建:
    docker build —squash .
    再次对生成的镜像进行100%优化:
    WSL2学习和使用汇集 - 图48
    A 100% optimised image with image squash (Image by the author)
    这里需要注意的有趣一点是,由于我们的Dockerfile创建了一个添加文件的层,然后创建了另一个删除该文件的层,所以squash足够聪明,以至于无需创建任何层(我们只有9ccd9…层 我们正在使用的基本图片)。 然后,额外的荣誉就可以南瓜了。 但是,请注意,挤压图层可能会阻止您或您的镜像用户利用先前缓存的图层。
    注意:使用您不想更改的第三方Dockerfile时,一种最小化任何可能浪费空间的快速简便方法是使用—squash构建它。 您可以使用潜水工具检查图像的最终效率。

    您是否见过带有RUN指令非常长的Dockerfile,其中多个Shell命令与&&聚合在一起? 命令合并。
    通过合并命令,我们实际上是根据此单个long命令的结果创建了一个单独的层。 由于不存在用于添加文件并随后在另一层中删除文件的中间层,因此最后一层将不会为此类幻影文件使用任何空间。 让我们通过修改上述Dockerfile来了解这一点:
    FROM alpineRUN wget http://xcal1.vodafone.co.uk/10MB.zip -P /tmp && rm /tmp/10MB.zip
    现在我们有了一个优化的镜像:
    WSL2学习和使用汇集 - 图49
    A 100% optimised image with commands merge (Image by the author)
    当您完成构建Dockerfile时,请检查它以查看是否可以合并命令以减少可能的浪费空间。

    如果基础存储驱动程序支持,则镜像可以具有的最大层数为127。 如果确实需要,可以增加此限制,但是随后您可以缩小构建该映像的位置的选择(即,您需要在类似修改的基础内核上运行的Docker引擎)。
    正如上面有关Docker镜像层的部分中所讨论的,由于UnionFS,进入层的任何文件资源都保留在该层中,即使您在后一层中管理该文件也是如此。 我们来看一个示例Dockerfile:
    FROM alpineRUN wget http://xcal1.vodafone.co.uk/10MB.zip -P /tmpRUN rm /tmp/10MB.zip
    构建以上镜像:
    WSL2学习和使用汇集 - 图50
    Building a sample image with wasted space (Image by the author)
    并进行潜水检查:
    WSL2学习和使用汇集 - 图51
    Image is only 34% efficient (Image by the author)
    效率为34%表示图像中浪费了很多空间。 这将导致更长的图像获取时间,额外的带宽消耗和更慢的启动时间。
    我们如何摆脱这个浪费的空间?

    通常,当我们将应用程序容器化时,我们需要使用软件包管理器(例如apk,yum或apt)在生成的映像上提供额外的工具,库或实用程序。
    当我们通过缓存先前获取的软件包来安装软件包时,软件包管理器试图为我们节省时间和带宽。 为了使生成的Docker映像的尺寸尽可能小,我们不需要保留程序包管理器缓存。 毕竟,如果我们的容器需要其他映像,我们总是可以使用更新的Dockerfile重建映像。
    要删除上述三个流行的软件包管理器的软件包管理器缓存,我们可以在聚合(即命令合并)命令的末尾添加以下命令,例如:
    APK: … && rm -rf /etc/apk/cacheYUM: … && rm -rf /var/cache/yumAPT: … && rm -rf /var/cache/apt

    注意:在最终确定Docker镜像之前,请不要忘记删除构建期间使用的所有缓存以及容器正常运行所不需要的任何其他临时文件。

    每个Dockerfile都以FROM指令开头。 在此定义我们将在其上创建自己的图像的基础图像。
    如Docker文档中所述:
    “ FROM指令初始化一个新的构建阶段,并为后续指令设置基础映像。 因此,有效的Dockerfile必须以FROM指令开头。 该图像可以是任何有效的图像-从公共存储库中提取图像特别容易。”
    显然,有很多不同的基础图像可供选择,每个基础图像都有自己的优势和功能。 当涉及到您自己的Docker映像的最终大小时,选择一个足以提供应用程序运行所需的工具和环境的映像至关重要。
    正如您所期望的那样,不同的流行基本镜像的大小差异很大:
    WSL2学习和使用汇集 - 图52
    Popular Docker base images size (Image by the author)
    实际上,使用Ubuntu 19.10基本映像对应用程序进行容器化将至少增加73 MB,而使用Alpine 3.10.3基本映像的完全相同的应用程序只会使大小增加6 MB。 随着Docker缓存图像层,下载/带宽损失仅在您第一次使用该图像启动容器时适用(或者简单地,在拉取图像时)。 但是,增加的大小仍然存在。
    此时,您可能已经得出以下(非常合逻辑的)结论:”那么,我将永远使用Alpine!”。 如果在软件中只有那么清楚的话。
    您会发现,Alpine Linux背后的家伙还没有发现Ubuntu或Debian家伙仍在寻找的特殊秘密调味料。 为了能够创建比Debian小(例如)小的数量级的Docker映像,他们必须对Alpine映像中要包含的内容和不包含的内容做出一些决定。 在选择Alpine作为默认基本映像之前,应检查它是否提供了所需的所有环境。 此外,即使Alpine随附了软件包管理器,您也可能会发现Alpine中不提供您在(例如)基于Ubuntu的开发环境中使用的特定软件包或软件包版本。 在为项目选择最合适的基础映像之前,您应该了解这些权衡并进行测试。
    最后,如果您确实需要使用一个较胖的基础镜像,则可以使用镜像最小化工具(例如免费和开源DockerSlim)来减小最终映像的大小。
    注意:在尝试减小尺寸时,为自己的镜像选择适当的基础镜像很重要。 评估您的选择并选择一张镜像,该镜像可提供您所需的工具,以确保您可以承受的尺寸。

    如果您的应用程序可以在没有基础映像提供任何其他环境的情况下运行,则可以选择完全不使用基础映像。 当然,由于FROM在Dockerfile中是强制性的,因此您仍然必须拥有它并将其指向某个内容。 在这种情况下,您应该使用什么?
    从头开始,即:
    “一个明显为空的图像,特别是对于构建图像”从零开始”。 在构建基础映像(例如debian和busybox)或超小型映像(仅包含一个二进制文件以及它所需要的任何内容,例如hello-world)的上下文中,此映像最有用。 从头开始是Dockerfile中的一项禁止操作,并且不会在映像中创建额外的层。”
    注意:如果您的应用程序包含可以以独立方式运行的自包含可执行文件,则选择暂存基础映像可以使您尽可能减少容器的占用空间。

    构建镜像最具挑战性的一点是使镜像大小尽可能的小。Dockerfile中的每条指令都为图像添加了一个图层,您需要记住在移动到下一层之前清理任何不需要的工件。为了编写一个真正高效的Dockerfile,传统上需要使用shell技巧和其他逻辑来保持层尽可能小,并确保每个层都具有前一层所需的工件而不是其他任何东西。
    如下,为了减少镜像的层,将多条命令放在一起,就可以减小体积
    RUN go get -d -v golang.org/x/net/html \
    && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
    但如上方法缺点很多,因此,Docker在17.05以后引入多阶段构建的新特性,旨在解决编译和构建复杂的问题。减小镜像大小。
    FROM golang:1.7.3 as builder
    WORKDIR /go/src/github.com/alexellis/href-counter/
    RUN go get -d -v golang.org/x/net/html
    COPY app.go .
    RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

    RUN apk —no-cache add ca-certificates
    WORKDIR /root/
    COPY —from=builder
    CMD [“./app”]
    第二个FROM指令以alpine:latest image为基础开始一个新的构建阶段。
    COPY –from = 0行仅将前一阶段的构建文件复制到此新阶段。Go SDK和任何中间层都被遗忘,而不是保存在最终image中。

    centos 7.4.1708 9f266d35e02c 2 years ago 197MB
    alpine 3.13.6 12adea71a33b 7 weeks ago 5.61MB

    单机上编排时docker-compose是无可争议的好选择
    分布式编排是现在最热的是k8s

    使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具
    看下一个最简单的编排,如下例子启动了2个容器,1个是mysql,一个是redis,由这些配置可见,通过编排可以极大的简化多容器的配置和依赖等相关事项,虽然可以通过命令行一个个的启动容器达到同样效果,但docker官方的这个方案极大的解放了生产力
    docker-compose.yml 文件内容
    version: “2.2”

    services:
    mysql:
    container_name: mysql
    image: mysql:5.7.16
    ports:
    - 3306:3306
    environment:
    - MYSQL_USER=test
    - MYSQL_PASSWORD=test
    - MYSQL_DATABASE=bim-client
    - MYSQL_ROOT_PASSWORD=root
    command: —default-storage-engine=InnoDB —character-set-server=utf8 —collation-server=utf8_unicode_ci —innodb_large_prefix=on —skip-name-resolve

    redis:
    container_name: redis
    image: redis:5
    ports:
    - 6379:6379

    docker-compose默认使用当前运行目录的docker-compose.yml启动
    compose文档的格式约定的详细说明文档
    https://docs.docker.com/compose/compose-file/compose-file-v3/
    n container: 运行的容器,可以理解为镜像的实例

    命令 例子
    up docker-compose up
    使用默认的文件docker-compose.yml,构建并交互式启动容器
    docker-compose up -f my.yml
    使用文件my.yml,构建并交互式启动容器
    docker-compose up -d
    使用默认的文件docker-compose.yml,构建并守护方式启动容器
    down docker-compose down
    停止docker-compose.yml中的容器,并销毁相关资源
    docker-compose up -f my.yml
    停止my.yml中的容器,并销毁相关资源
    start docker-compose start
    对于已经stop的容器,可以直接启动,和up的差别是可以使用容器上次运行的历史数据
    docker-compose start eureka
    只启动eureka容器
    stop docker-compose stop
    停止docker-compose.yml中定义的所有容器
    docker-compose stop -f my.yml
    停止my.yml中定义的所有容器
    docker-compose stop eureka
    只停止eureka容器
    logs docker-compose logs
    查看docker-compose.yml中定义的运行状态

    Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。
    Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务。
    比较简单的集群,可以使用swarm来构建,配合portainer【https://www.portainer.io/】WEB界面可以快速的构建和运行。
    Ø 优点
    n 直接docker命令集成
    n 简单方便,对于有docker基础的门槛低,相比k8s使用更简单
    Ø 缺点
    n 相比k8s,对于存储、网络等差距比较大
    n 由于本身的政策问题,在和k8s的竞争中被拉下

    k8s全称kubernetes,这个名字大家应该都不陌生,k8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程。
    核心思想:基于声明式的开发模式,而不是命令式的方式
    主要优点和功能,具体来说,主要包括以下几点:
    服务发现与调度
    负载均衡
    服务自愈
    服务弹性扩容
    横向扩容
    存储卷挂载
    详细的参考资料可以参考k8s官网
    http://product.dangdang.com/29208639.html Kubernetes进阶实战(第2版)

    **

    Docker安全工具有很多,从多方面来维护容器的安全性,如运行时监控预警、取证、预生产分析、安装配置校验、信任管理等。本文主要关注于镜像在使用之前的扫描和审计,即预生产分析类的工具。这类工具主要从CVE漏洞与恶意镜像两方面来对镜像进行扫描。
    Ø Clair
    http://blog.nsfocus.net/docker-mirror-security/
    Clair的目标是能够从一个更加透明的维度去看待基于容器化基础框架的安全性,Clair是由CoreOS所推出的这样一款针对容器镜像的安全扫描工具。 Clair主要模块分为Detector、Fetcher、Notifier和Webhook,Clair首先对镜像进行特征的提取,然后再将这些特征匹配CVE漏洞库,若发现漏洞则进行提示,其功能侧重于扫描容器中的OS及APP的CVE漏洞。
    Ø Anchore
    Clair能扫描出一个镜像中的所有CVE漏洞,但现在有一种情况,黑客使用最新版无漏洞的OS镜像,然后在其之上安装后门木马,或执行恶意命令,这样Clair就不能检测其安全性了。
    这时就要介绍一个分析工具Anchorele,与Clair不同,Anchore侧重于对镜像的审计,其有强大的对镜像的解析能力。在分析之后可以对镜像进行多种操作,内置了许多脚本,用途广泛。

    trivy
    https://github.com/aquasecurity/trivy
    Clair
    https://hub.fastgit.org/quay/clair

    harbor支持的扫描器很完整,详细可以参考其官网
    https://goharbor.io/docs/2.3.0/install-config/harbor-compatibility-list/#scanner-adapters
    WSL2学习和使用汇集 - 图53

    Visual Studio Code(简称“VS Code”)是Microsoft在2015年4月30日Build开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代Web和云应用的跨平台源代码编辑器,可在桌面上运行,并且可用于Windows,macOS和Linux。它具有对JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言(例如C++,C#,Java,Python,PHP,Go)和运行时(例如.NET和Unity)扩展的生态系统。

    VS Code和Visual Studio区别
    1 本质不同
    Visual Studio(简称VS)是微软公司的开发工具包系列产品,是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等。通俗的讲,是一款编译器。
    visual studio code是美微软公司是一个项目:运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 云应用的跨平台源代码编辑器。通俗地讲,是一款编辑器。
    两套软件的代码完全不同,vs code是和atom编辑器有渊源起步的
    2 跨平台运行能力不一样。
    Visual Studio 各种功能只能在 Windows 和 macOS(Mac OS X )之上运行,不能跳跃各平台编辑。
    visual studio code是一款真正的跨平台编辑器,可以在用户习惯的平台上使用。增强的功能是通过各种插件进行支撑的。
    3 功能不一样
    Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。提供了高级开发工具、调试功能、数据库功能和创新功能,帮助在各种平台上快速创建当前最先进的应用程序,开发新的程序。
    visual studio code集成了所有一款现代编辑器所应该具备的特性,包括语法高亮,可定制的热键绑定,括号匹配以及代码片段收集,这款编辑器也拥有对 Git 的开箱即用的支持。

    如下以一个快速的虚拟体验环境为例说明,如何快速的使用WSL VSCode的开发
    首先在https://www.vagrantup.com/ 下载并安装vagant

    将如下内容保存到文件Vagrantfile中:

    # -- mode: ruby --
    # vi: set ft=ruby :

    ENV[‘VAGRANT_DEFAULT_PROVIDER’] = ‘hyperv’

    Vagrant.configure(“2”) do |config|
    #注意:如果自动下载box慢的化,可以先自行下载box文件,添加到vagrant库,如下的3步
    #1 参考官网 https://app.vagrantup.com/jborean93/boxes/WindowsServer2019
    #2 加入box vagrant box add C:\work\devtools\jborean93_win2019.box —name “jborean93/WindowsServer2019”
    #3 引用这个box jborean93/WindowsServer2019
    config.vm.box = “jborean93/WindowsServer2019”

    config.vm.provider “hyperv”
    config.vm.communicator =”winrm”
    #config.vm.hostname = “win2019”
    config.winrm.password = “vagrant” # the credentials specified during OS install
    config.winrm.username = “vagrant”

    config.vm.synced_folder “.”, “/vagrant”, disabled: true

    config.vm.provider “hyperv” do |h|
    h.memory = 5096
    h.cpus = 2
    h.enable_virtualization_extensions = true
    h.linked_clone = true
    end
    end

    在刚才保存的Vagrantfile目录下,Powershell管理员模式运行,输入vagrant up,具体的信息类似如下
    **PS tour
    Bringing machine ‘default’ up with ‘hyperv’ provider…
    ==> default: Verifying Hyper-V is enabled…
    ==> default: Verifying Hyper-V is accessible…
    ==> default: Importing a Hyper-V instance
    default: Creating and registering the VM…
    default: Successfully imported VM
    default: Please choose a switch to attach to your Hyper-V instance.
    default: If none of these are appropriate, please open the Hyper-V manager
    default: to create a new virtual switch.
    default:
    default: 1) VagrantSwitch
    default: 2) Default Switch
    default: 3) WSL
    default:
    default: What switch would you like to use? 3
    default: Configuring the VM…
    default: Setting VM Enhanced session transport type to disabled/default (VMBus)
    ==> default: Starting the machine…
    ==> default: Waiting for the machine to report its IP address…
    default: Timeout: 120 seconds
    default: IP: 169.254.116.217
    ==> default: Waiting for machine to boot. This may take a few minutes…
    default: WinRM address: 172.20.97.105:5985
    default: WinRM username: vagrant
    default: WinRM execution_time_limit: PT2H
    default: WinRM transport: negotiate
    ==> default: Machine booted and ready!

    在如下的windows2019虚拟机上,右键,连接即可进入系统,这个就是一个全新的干净windows环境
    WSL2学习和使用汇集 - 图54

    **VS C

    VS Code Remote提供了如下多种的远程开发模式 [ https://code.visualstudio.com/docs/remote/remote-overview ]
    Ø SSH
    Ø WSL
    Ø 容器
    Ø GitHub Codespaces

    Visual Studio Code Remote - WSL 扩展允许你直接借助 VS Code 令 「适用于 Linux 的 Windows 子系统」(WSL) 作为你的全职开发环境。你可以在基于 Linux 的环境中进行开发,使用 Linux 特有的的工具链和实用库,并在舒适的 Windows 中运行和调试基于 Linux 的应用程序。
    WSL2学习和使用汇集 - 图55
    VS Code扩展 Remote - WSL
    https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl
    Windows Server上的完整步骤

    适用于 Linux 的 Windows 子系统可供在 Windows Server 2019(版本 1709)和更高版本上安装。
    为了减少执行过程中出现的反复提示,建议关闭如下选项
    WSL2学习和使用汇集 - 图56
    **
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

    https://docs.microsoft.com/zh-cn/windows/wsl/install-manual
    https://aka.ms/wslubuntu2004 这个地址下载Ubuntu_2004.2020.424.0_x64.zip
    将文件解压
    WSL2学习和使用汇集 - 图57
    将如上路径加入环境变量
    **
    $userenv = [System.Environment]::GetEnvironmentVariable(“Path”, “User”)
    [System.Environment]::SetEnvironmentVariable(“PATH”, $userenv + “;C:\wsl\ubuntu20”, “User”)

    PS C:\Users\vagrant
    Installing, this may take a few minutes…
    Please create a default UNIX user account. The username does not need to match your Windows username.
    For more information visit: https://aka.ms/wslusers
    Enter new UNIX username: root
    adduser: The user `root’ already exists.
    Enter new UNIX username: wsl
    New password:
    Retype new password:
    passwd: password updated successfully
    Installation successful!
    To run a command as administrator (user “root”), use “sudo “.
    See “man sudo_root” for details.

    Welcome to Ubuntu 20.04 LTS (GNU/Linux 4.4.0-17763-Microsoft x86_64)

    Documentation: https://help.ubuntu.com
    Management: https://landscape.canonical.com
    * Support: https://ubuntu.com/advantage

    System information as of Wed Oct 20 05:23:57 DST 2021

    System load: 0.52 Processes: 7
    Usage of /home: unknown Users logged in: 0
    Memory usage: 45% IPv4 address for eth0: 172.20.97.105
    Swap usage: 1%

    0 updates can be installed immediately.
    0 of these updates are security updates.


    The list of available updates is more than a week old.
    To check for new updates run: sudo apt update


    This message is shown once once a day. To disable it please create the
    /home/wsl/.hushlogin file.
    wsl@WIN-0AFAUSK0R5Q:~$ sudo -s
    [sudo] password for wsl:
    root@WIN-0AFAUSK0R5Q:/home/wsl# pwd
    /home/wsl
    root@WIN-0AFAUSK0R5Q:/home/wsl# ls
    root@WIN-0AFAUSK0R5Q:/home/wsl# ls /mnt
    c
    root@WIN-0AFAUSK0R5Q:/home/wsl#

    安装成功后可以看到如下信息**
    C:\Users\vagrant>wslconfig /l /all
    Windows Subsystem for Linux Distributions:

    https://code.visualstudio.com/ 下载安装VScode
    为了防止出错,可以参考如下设置“VS Code管理员权限运行”
    WSL2学习和使用汇集 - 图58
    安装Remote开发插件,如图,输入Remote可以检索到相关的插件,其中Remote Development是3个组合插件,包含了SSH WSL Container部分
    WSL2学习和使用汇集 - 图59

    首先运行VSCode,过程中右下脚会看到vscode remote安装等操作
    正常后,选择“Remote Explorer”,即可进入WSL
    WSL2学习和使用汇集 - 图60
    如下就是运行在WSL Ubuntu中的完整的code开发环境
    WSL2学习和使用汇集 - 图61
    上图,注意左下脚,已经表示在WSL中运行了

    在如上的命令行下输入ps可以看到vscode在linux中启动方式明细

    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 1 0.0 0.0 8324 152 ? Ss 05:23 0:00 /init
    root 3 0.0 0.0 8328 152 tty1 Ss 05:23 0:00 /init
    wsl 4 0.0 0.0 18084 3584 tty1 S 05:23 0:00 -bash
    root 66 0.0 0.0 19168 2844 tty1 S 05:24 0:00 sudo -s
    root 67 0.0 0.0 17008 2372 tty1 S 05:24 0:00 /bin/bash
    root 216 0.0 0.0 8328 152 tty2 Ss 05:43 0:00 /init
    wsl 217 0.0 0.0 10656 688 tty2 S 05:43 0:00 sh -c “$VSCODE_WSL_EXT_LOCATION/scripts/wslServer.sh” 6cba118ac49a1b
    88332f312a8f67186f7f3c1643 stable .vscode-server 0
    wsl 218 0.0 0.0 10656 748 tty2 S 05:43 0:00 sh
    sl-0.58.2/scripts/wslServer.sh 6cba118ac49a1b88332f312a8f67186f7f3c1643 stable .vscode-server 0
    wsl 224 0.0 0.0 10656 716 tty2 S 05:43 0:00 sh /home/wsl/.vscode-server/bin/6cba118ac49a1b88332f312a8f67186f7f3c
    1643/server.sh —port=0 —use-host-proxy —without-browser-env-var —disable-websocket-compression —print-ip-address —enable-remot
    e-auto-shutdown
    wsl 226 0.8 0.9 929300 47028 tty2 Sl 05:43 0:04 /home/wsl/.vscode-server/bin/6cba118ac49a1b88332f312a8f67186f7f3c164
    3/node /home/wsl/.vscode-server/bin/6cba118ac49a1b88332f312a8f67186f7f3c1643/out/vs/server/main.js —port=0 —use-host-proxy —witho
    ut-browser-env-var —disable-websocket-compression —print-ip-address —enable-remote-auto-shutdown
    wsl 237 0.3 0.5 920896 28396 tty2 Rl 05:43 0:02 /home/wsl/.vscode-server/bin/6cba118ac49a1b88332f312a8f67186f7f3c164
    3/node /home/wsl/.vscode-server/bin/6cba118ac49a1b88332f312a8f67186f7f3c1643/out/bootstrap-fork —type=ptyHost
    wsl 414 0.6 1.6 845476 86088 tty2 Rl 05:45 0:02 /home/wsl/.vscode-server/bin/6cba118ac49a1b88332f312a8f67186f7f3c164
    3/node /home/wsl/.vscode-server/bin/6cba118ac49a1b88332f312a8f67186f7f3c1643/out/bootstrap-fork —type=extensionHost —uriTransformer
    Path=/home/wsl/.vscode-server/bin/6cba118ac49a1b88332f312a8f67186f7f3c1643/out/vs/server/uriTransformer.js —useHostProxy=
    wsl 421 0.0 0.4 752680 22156 tty2 Sl 05:45 0:00 /home/wsl/.vscode-server/bin/6cba118ac49a1b88332f312a8f67186f7f3c164
    3/node /home/wsl/.vscode-server/bin/6cba118ac49a1b88332f312a8f67186f7f3c1643/out/bootstrap-fork —type=watcherService
    wsl 477 0.0 0.0 18048 3512 pts/0 Ss 05:49 0:00 /usr/bin/bash
    root 795 0.0 0.0 19168 2860 pts/0 S 05:51 0:00 sudo -s
    root 810 0.0 0.0 17008 2392 pts/0 S 05:51 0:00 /bin/bash
    wsl 897 0.0 0.0 10656 688 tty2 S 05:52 0:00 /bin/sh -c “/home/wsl/.vscode-server/bin/6cba118ac49a1b88332f312a8f6
    7186f7f3c1643/out/vs/base/node/cpuUsage.sh” 477 795 810
    wsl 903 3.0 0.0 16664 1752 tty2 R 05:52 0:00 /bin/bash /home/wsl/.vscode-server/bin/6cba118ac49a1b88332f312a8f671
    86f7f3c1643/out/vs/base/node/cpuUsage.sh 477 795 810

    wsl@WIN-0AFAUSK0R5Q:~/demo$ uname -a
    Linux WIN-0AFAUSK0R5Q 4.4.0-17763-Microsoft #1432-Microsoft Mon Aug 18 18:18:00 PST 2020 x86_64 x86_64 x86_64 GNU/Linux

    如果对VSCode的运行感兴趣,可以使用Procexp工具【https://docs.microsoft.com/zh-cn/sysinternals/ 下载】查看下进程情况,如下
    WSL2学习和使用汇集 - 图62

    WSL内启动一个服务
    WSL2学习和使用汇集 - 图63
    在宿主机的浏览器访问http://localhost:3000/ 即可看到如上的信息

    具体为啥直接访问到WSL内的服务,WSL1 WSL2还不同
    netsh interface dump all

    **VS C

    https://code.visualstudio.com/docs/remote/containers
    WSL2学习和使用汇集 - 图64
    如图可见,这个的架构和WSL完全一样

    安装docker desktop即可使用
    安装后的运行部分实例如下
    WSL2学习和使用汇集 - 图65

    比如首先启动一个centos容器
    docker run -it —name centos centos
    WSL2学习和使用汇集 - 图66

    然后就可以连接进入这个容器内的环境进行开发,如下图
    WSL2学习和使用汇集 - 图67

    Docke Desktop的功能已经比较完整,如果想在VS Code中GUI形式查看docker的相关信息,可以安装这个插件
    https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker
    ms-azuretools.vscode-docker
    WSL2学习和使用汇集 - 图68
    当然如果docker命令行和docker-compose很熟悉了,这个也不需要安装了

    !/bin/bash
    # https://marketplace.visualstudio.com/
    # VSCODE must be installed
    code —version

    # install extenstion
    # —install-extension

    #Visual Studio Code plugin that autocompletes npm modules in import statements
    code —install-extension christian-kohler.npm-intellisense
    # Bracket Pair Colorizer
    code —install-extension CoenraadS.bracket-pair-colorizer

    code —install-extension donjayamanne.githistory
    code —install-extension eamodio.gitlens
    #Prettier - Code formatter
    code —install-extension esbenp.prettier-vscode
    #输入时有特效,好玩
    code —install-extension hoovercj.vscode-power-mode
    # docker docker-compose使用超方便
    code —install-extension ms-azuretools.vscode-docker
    #VUE
    code —install-extension octref.vetur
    code —install-extension mhutchie.git-graph
    code —install-extension sdras.vue-vscode-extensionpack
    code —install-extension sdras.vue-vscode-snippets
    code —install-extension xabikos.JavaScriptSnippets

    code —install-extension tombonnike.vscode-status-bar-format-toggle
    code —install-extension wmaurer.vscode-jumpy

    code —install-extension xykong.format-all-files
    code —install-extension xyz.local-history

    code —install-extension vscode-icons-team.vscode-icons
    code —install-extension dbaeumer.vscode-eslint

    # 习惯了英语,中文看起来有点别扭
    # code —install-extension MS-CEINTL.vscode-language-pack-zh-hans

    code —install-extension andrew-codes.cypress-snippets

    code —install-extension marcostazi.vs-code-vagrantfile
    # json - yaml的转换工具
    code —install-extension ahebrank.yaml2json

    #https://marketplace.visualstudio.com/search?target=VSCode&category=Extension%20Packs&sortBy=Installs
    #微软官方的开发语言包
    #Java Extension Pack
    code —install-extension vscjava.vscode-java-pack
    #C/C++
    code —install-extension ms-vscode.cpptools
    code —install-extension ms-vscode.cmake-tools

    #rest client .http的web请求
    code —install-extension humao.rest-client
    #toml
    code —user-data-dir /opt/vscode —install-extension be5invis.toml
    #
    code —user-data-dir /opt/vscode —install-extension visualstudioexptteam.vscodeintellicode
    #python
    code —install-extension ms-python.python
    code —install-extension ms-python.vscode-pylance

    echo “extension installed done, 开启界面操作下,然后package.sh”
    mkdir -p ~/.config/Code/User/
    cp -f settings.json ~/.config/Code/User/settings.json

    BASH是LINUX系统上常用的终端程序。Git bash是Windows环境下提供的git命令行体验工具包,里面就集成了bash的windows运行环境。git bash在windows环境下安装了bash命令行和相关的工具文件、git命令文件等等系列的软件工具。

    此处我们重点关注的是bash。git bash提供的工具包含了常用的linux命令,如下图
    【Git-2.33.0-64-bit.exe 版本安装包】
    WSL2学习和使用汇集 - 图69
    https://gitforwindows.org/
    https://git-scm.com/download/win
    如上图,默认的安装目录C:\Program Files\Git\usr\bin下默认安装的执行文件有274个,从名字我们即可看出和linux一致
    ‘[.exe’ gencat.exe msgen.exe shuf.exe ApkNormalized.exe getconf.exe msgexec.exe sleep.exe arch.exe getfacl.exe msgfilter.exe sort.exe awk.exe getopt.exe msgfmt.exe split.exe b2sum.exe gettext.exe msggrep.exe ssh.exe base32.exe gio-querymodules.exe msginit.exe ssh-add.exe base64.exe gkill.exe msgmerge.exe ssh-agent.exe basename.exe glib-compile-schemas.exe msgunfmt.exe sshd.exe basenc.exe gobject-query.exe msguniq.exe ssh-keygen.exe bash.exe gpg.exe mv.exe ssh-keyscan.exe bunzip2.exe gpg-agent.exe nano.exe ssh-pageant.exe bzcat.exe gpgconf.exe nettle-hash.exe ssp.exe bzip2.exe gpg-connect-agent.exe nettle-lfib-stream.exe stat.exe bzip2recover.exe gpg-error.exe nettle-pbkdf2.exe strace.exe captoinfo.exe gpgparsemail.exe ngettext.exe stty.exe cat.exe gpgscm.exe nice.exe sum.exe chattr.exe gpgsm.exe nl.exe sync.exe chcon.exe gpgsplit.exe nohup.exe tabs.exe chgrp.exe gpgtar.exe nproc.exe tac.exe chmod.exe gpgv.exe numfmt.exe tail.exe chown.exe gpg-wks-server.exe od.exe tar.exe chroot.exe grep.exe openssl.exe tee.exe cksum.exe groups.exe p11-kit.exe test.exe clear.exe gsettings.exe passwd.exe tic.exe cmp.exe gzip.exe paste.exe tig.exe column.exe hdiffz.exe patch.exe timeout.exe comm.exe head.exe pathchk.exe toe.exe cp.exe hmac256.exe perl.exe touch.exe csplit.exe hostid.exe perl5.34.0.exe tput.exe cut.exe hostname.exe pinentry.exe tr.exe cygcheck.exe hpatchz.exe pinentry-w32.exe true.exe cygpath.exe iconv.exe pinky.exe truncate.exe cygwin-console-helper.exe id.exe pkcs1-conv.exe trust.exe d2u.exe infocmp.exe pldd.exe tset.exe dash.exe infotocap.exe pluginviewer.exe tsort.exe date.exe install.exe pr.exe tty.exe dd.exe join.exe printenv.exe tzset.exe df.exe jq.exe printf.exe u2d.exe diff.exe kbxutil.exe ps.exe umount.exe diff3.exe kill.exe psl.exe uname.exe dir.exe ldd.exe ptx.exe unexpand.exe dircolors.exe ldh.exe pwd.exe uniq.exe dirmngr.exe less.exe readlink.exe unix2dos.exe dirmngr-client.exe lessecho.exe realpath.exe unix2mac.exe dirname.exe lesskey.exe rebase.exe unlink.exe dos2unix.exe link.exe recode-sr-latin.exe unzip.exe du.exe ln.exe regtool.exe unzipsfx.exe dumpsexp.exe locale.exe reset.exe users.exe echo.exe locate.exe rm.exe vdir.exe env.exe logname.exe rmdir.exe view.exe envsubst.exe ls.exe rnano.exe vim.exe ex.exe lsattr.exe runcon.exe vimdiff.exe expand.exe mac2unix.exe rview.exe watchgnupg.exe expect.exe md5sum.exe rvim.exe wc.exe expr.exe minidumper.exe scp.exe which.exe factor.exe mintty.exe sdiff.exe who.exe false.exe mkdir.exe sed.exe whoami.exe fido2-assert.exe mkfifo.exe seq.exe winpty.exe fido2-cred.exe mkgroup.exe setfacl.exe winpty-agent.exe fido2-token.exe mknod.exe setmetamode.exe winpty-debugserver.exe file.exe mkpasswd.exe sexp-conv.exe xargs.exe find.exe mktemp.exe sftp.exe xgettext.exe fmt.exe mount.exe sh.exe xxd.exe fold.exe mpicalc.exe sha1sum.exe yat2m.exe funzip.exe msgattrib.exe sha224sum.exe yes.exe gapplication.exe msgcat.exe sha256sum.exe ZipDiff.exe gawk.exe msgcmp.exe sha384sum.exe zipinfo.exe gawk-5.0.0.exe msgcomm.exe sha512sum.exe ZipPatch.exe gdbus.exe msgconv.exe shred.exe
    有了这些支持,已有的linux脚本文件就可以在windows上顺畅执行了。

    对于没有的命令,也可以找到执行对应的windows版本执行文件,放入这个目录,这样bash中就可以直接使用了。
    比如目前常用的json格式处理文件jq, git bash默认就没有安装,此时可以参考如下步骤安装
    首先在 https://stedolan.github.io/jq/ 网站下载windows版本执行文件
    然后将jq.exe放入C:\Program Files\Git\usr\bin\下
    这样就可以正常使用了
    WSL2学习和使用汇集 - 图70
    bash文件比bat文件支持丰富,而且可以在linux上执行,一些脚本和分析工具等最好使用shell文件来做。具体使用方法
    安装Git-2.31.1-64-bit后,在需要运行的目录处鼠标右键,选择“Git Bash Here”
    WSL2学习和使用汇集 - 图71
    在弹出的命令窗口中可以执行linux的shell各种命令了

    运行命令 “C:\Program Files\Git\git-bash.exe” —cd-to-home
    WSL2学习和使用汇集 - 图72
    注意
    Ø 该工具把windows系统的c:盘挂载到了/c/下,所有的文件都可在这个目录下查看
    Ø 如何自动运行windows下的shell文件
    比如在c:/temp/下有个demo.sh文件,内容如下
    #!/bin/bash
    echo “$1 $2”
    read -p “pause”
    命令行的执行方式就是
    “C:\Program Files\Git\git-bash.exe” /c/temp/demo.sh “arg1” “arg2”
    效果如下
    WSL2学习和使用汇集 - 图73
    Ø Windows新建shell时需要注意保存成unix格式【记事本软件编写是不行的,可以使用sublime或vscode编写】
    Ø 安装时这步选择需要注意下
    WSL2学习和使用汇集 - 图74
    不要选择默认的mintty,否则以后执行脚本如”docker exec -it centos bash”
    可能会遇到”the input device is not a TTY. If you are using mintty, try prefixing the command with ‘winpty’“错误

    【之所以使用git-bash 和Sublime主要是因为现有的加密软件对于linux下的命令授权很麻烦,因此一些辅助的分析等可以先使用明文的形式进行(之所以没选择vs code,因为公司内vscode默认是安全加密的进程,这样shell中的命令无法读取被加密的文件内容)】
    Ø 安装Terminus 插件
    n Preferences > Package Control -> Install Package 在弹出的窗口中输入Terminus
    Ø Terminus 插件设置默认git-bash
    n Preferences > Package Settings > Terminus > Settings 在弹出的窗口中设置类似如下【保存后即可使用shell了】
    {
    “shell_configs”: [
    {
    “name”: “Git Bash”,
    “cmd”: [“cmd.exe”, “/k”, “C:/Program Files/Git/bin/bash.exe”],
    “env”: {},
    “enable”: true,
    “default”: true,
    “platforms”: [“windows”]
    }
    ]
    }
    Ø 打开窗口:
    WSL2学习和使用汇集 - 图75

    Ø 采用UTF8编码
    Ø 使用了UNIX回车设置:文件统一使用LF(unix),不能使用windows的CRLF换行【这个格式的脚本无法运行】
    sublime的设置参考,设置后,以后建立的文件自动就使用了这个设置
    WSL2学习和使用汇集 - 图76
    Ø 每个文件开头有一段标准的头,类似
    #!/bin/bash
    set -euo pipefail
    BaseDir=$(
    cd “$(dirname “$0”)”
    pwd
    )
    cd ${BaseDir}
    if [ ! -z ${DEBUG+x} ]; then
    echo “DEBUG on”
    set -x
    fi
    大体的含义如下
    set -u就用来改变这种行为。脚本在头部加上它,遇到不存在的变量就会报错,并停止执行。
    set -e从根本上解决了这个问题,它使得脚本只要发生错误,就终止执行。
    set -o pipefail用来解决这种情况,只要一个子命令失败,整个管道命令就失败,脚本就会终止执行。
    set -x用来在运行结果之前,先输出执行的那一行命令。这对于调试复杂的脚本是很有用的。
    例如想调试一个脚本hello.sh
    export DEBUG; ./hello.sh 即可

    更多的注意可以参考这篇文章
    https://blog.didispace.com/minimal-safe-bash-script-template/ 如何写出安全的、基本功能完善的Bash脚本

    Windows terminal终端比cmd强大许多,其中可以包含cmd和powershell甚至ubuntu子系统,同时还可以进行个性化,打造更精美的终端。
    开源地址: https://github.com/microsoft/terminal
    Windows Terminal提供了更多的选择,新的应用功能主要点:
    Ø 支持WSL2,SSH,Powershell,cmd和其他命令行
    Ø 多个选项卡和拆分窗格
    Ø 搜索框
    Ø 自定义键绑定
    Ø GPU加速文字渲染
    Ø 美观的新字体Cascadia Code
    Ø 资源使用率低(每个选项卡通常10MB)
    Ø 自动更新(如果使用Microsoft Store)
    Ø 好的文档
    Ø 它是开源的!

    如下设置,设置多个标签页,这样,一个软件中就可以直接使用CMD, PowerShell, WSL, 和git-bash等命令行
    WSL2学习和使用汇集 - 图77
    更多的详细信息可参考 https://zhuanlan.zhihu.com/p/272082726

    **[

    https://mobaxterm.mobatek.net/download.html

    PowerShell 是一种跨平台的任务自动化解决方案,由命令行 shell、脚本语言和配置管理框架组成。 PowerShell 在 Windows、Linux 和 macOS 上运行。
    PowerShell 是新式命令 shell,其中包括其他常用 shell 的最佳功能。 与大多数仅接受并返回文本的 shell 不同,PowerShell 接受并返回 .NET 对象。 shell 包括以下功能:
    Ø 可靠的命令行历史记录
    Ø Tab 自动补全和命令预测
    Ø 支持命令和参数别名
    Ø 用于链接命令的管道
    Ø 控制台内帮助系统,类似于 Unix man 页面

    PowerShell 脚本语言包含以下功能:
    Ø 可通过函数、类、脚本和模块进行扩展
    Ø 便于输出的可扩展格式系统
    Ø 用于创建动态类型的可扩展类型系统
    Ø 对常用数据格式(例如 CSV、JSON 和 XML)的内置支持

    如果想高效的管理windows系统,powershell是必学的内容,如果主要的操作还是linux生态的系统,可以对这个了解也可以,这样主要使用LINUX SHELL进行日常的运维和管理。

    !/bin/bash

    #https://docs.microsoft.com/zh-cn/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7.1

    # Update the list of packages
    sudo apt-get update
    # Install pre-requisite packages.
    sudo apt-get install -y wget apt-transport-https software-properties-common
    # Download the Microsoft repository GPG keys
    wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
    # Register the Microsoft repository GPG keys
    sudo dpkg -i packages-microsoft-prod.deb
    # Update the list of products
    sudo apt-get update
    # Enable the “universe” repositories
    sudo add-apt-repository universe
    # Install PowerShell
    sudo apt-get install -y powershell

    # Start PowerShell
    #pwsh

    取进程Get-Process | Sort-Object
    Get-InstalledModule
    Get-InstalledScript
    Get-Alias

    如下的脚本使用powershell建立一个hyperv的虚拟交换机,设置固定的地址和网关,这样使用这个交换机的其他机器即可指定IP

    https://hub.fastgit.org/hashicorp/vagrant/issues/8384
    # https://superuser.com/questions/1354658/hyperv-static-ip-with-vagrant

    # Remove-VMSwitch -SwitchName “VagrantSwitch”
    # Remove-NetNAT -Name “NATVagrantSwitch”

    $mustRestart = 0
    # Set Hyper-V
    If (“VagrantSwitch” -in (Get-VMSwitch | Select-Object -ExpandProperty Name) -eq $FALSE) {
    Write-Host ‘Creating Internal-only switch named “VagrantSwitch” on Windows…’

    New-VMSwitch -SwitchName “VagrantSwitch” -SwitchType Internal | out-null
    sleep 2
    $mustRestart = 1
    }

    #if (“VagrantSwitch” -in (Get-VM -Name $vmName | Get-VMNetworkAdapter | Select-Object -ExpandProperty SwitchName) -eq $FALSE) {
    # Write-Host ‘Associate VagrantSwitch to the VM…’
    # Get-VM -VMNAME $vmName | Get-VMNetworkAdapter | Connect-VMNetworkAdapter -SwitchName “VagrantSwitch”
    # sleep 2
    # $mustRestart = 1
    #}
    If (“10.1.1.1” -in (Get-NetIPAddress | Select-Object -ExpandProperty IPAddress) -eq $FALSE) {
    Write-Host ‘Registering new IP gateway address 10.1.1.1 for VagrantSwitch on Windows…’
    New-NetIPAddress -IPAddress 10.1.1.1 -PrefixLength 24 -InterfaceAlias “vEthernet (VagrantSwitch)” | out-null
    sleep 2
    $mustRestart = 1
    }
    If (“10.1.1.0/24” -in (Get-NetNAT | Select-Object -ExpandProperty InternalIPInterfaceAddressPrefix) -eq $FALSE) {
    Write-Host ‘Registering new NAT adapter for 10.1.1.0/24 on Windows…’
    New-NetNAT -Name “NATVagrantSwitch” -InternalIPInterfaceAddressPrefix 10.1.1.0/24 | out-null
    sleep 2
    $mustRestart = 1
    }

    SHELL历史
    bash
    cshell
    powershell
    工具
    windows terminal
    cmd
    mobaxterm
    规范的shell的常用参考