一个计算机技术爱好者与学习者

0%

好好学Docker:Win10安装配置Linux和Docker

1. Win10安装配置Docker的方法

在Win10中安装配置Docker,有四种方法:
(1)在Win10上安装Docker Desktop。Docker Desktop 利用了 Windows 10 的 Hyper-V 虚拟化技术,来创建一个轻量级的 Linux 虚拟机(VM),并在其中运行 Docker 引擎和容器。这样,用户就可以在 Windows 上享受到 Linux 上的 Docker 功能和性能。
(2)在Win10上安装Docker Toolbox。Docker Toolbox 是一种适用于不支持 Hyper-V 的旧版 Windows 系统的替代方案,它使用了 Oracle VirtualBox 来创建一个 Linux VM,并在其中运行 Docker 引擎和容器。Docker Toolbox 需要用户手动配置一些网络和存储设置,以便让 Windows 和 VM 之间进行通信和数据交换。
(3)使用VirtualBox等虚拟化工具启动一个Linux虚拟机(与方法(2)类似),然后在虚拟机中安装使用Docker。
(4)在Win10上安装一个WSL2 Linux系统,然后在Linux系统中安装Docker。

无论哪种方法,想要在 Windows 上运行 Docker,都需要一个 Linux VM 来托管 Docker 引擎和容器,因为 Docker 是基于 Linux 内核的技术,而不能直接在 Windows 内核上运行。但是,用户可以通过命令行或图形界面来操作和管理 Docker 容器,就像它们是本地应用程序一样。

方法(1),Docker Desktop的安装配置方法,参考文档《Win10安装配置Docker Desktop》
方法(2),Docker Toolbox的安装配置方法,参考文档《K8S入门篇》
方法(3),虚拟机中安装使用Docker的方法,和Linux中安装使用Docker的方法没有区别,参考文档《Docker入门篇》

本文中,我们学习方法(4),在Win10中安装Linux,并在Linux中安装Docker。

2. WSL2简介

WSL全拼是Windows Subsystem for Linux,WSL2是适用于Linux的Windows子系统体系结构的一个新版本。
WSL2是基于Hyper-V虚拟化技术的,它在Windows上启动一个真正的Linux系统,使用一个定制的Linux内核。这个内核支持完整的Linux系统调用,所以可以在WSL2中运行任何Linux应用程序。

WSL2和Windows之间相当于两台处于一个网络中但分别独立的主机,我们称这个网络为WSL网络。我们可以在Windows主机上使用ipconfig命令来查看Windows主机在WSL网络中的地址,相应地,在WSL2中你可以使用ifconfig命令来查看WSL2在WSL网络中的地址2。这样我们就可以在两个系统之间进行网络通信,比如访问Web服务或数据库等。

WSL2还保留了WSL1的无缝集成特性,比如我们可以从Windows资源管理器中访问Linux文件系统,或者从Linux终端中运行Windows应用程序等。我们还可以通过wsl命令来管理和配置WSL2。

参考文档:

3. 安装WSL2

1、打开PowerShell
搜索PowerShell,以管理员身份运行

2、启用适用于 Linux 的 Windows 子系统

1
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

3、启用虚拟机功能

1
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

4、下载 Linux 内核更新包
下载Linux 内核更新包,双击安装。

5、将WSL2设置为默认版本

1
wsl --set-default-version 2

4. Win10中安装Ubuntu18

参考文档:

4.1. 安装Ubuntu18

打开Microsoft Store,搜索Ubuntu,选择Ubuntu18版本,获取
或者直接打开Ubuntu 18.04 LTS,获取

首次启动新安装的 Linux 发行版时,将打开一个控制台窗口,系统会要求你等待一分钟或两分钟,以便文件解压缩并存储到电脑上。 未来的所有启动时间应不到一秒。

然后,需要为新的 Linux 发行版创建用户帐户和密码。

4.2. 设置WSL2默认发行版

1
2
wsl -l -v
wsl --set-default Ubuntu-18.04

设置默认WSL2默认发行版之后,就不用使用指定-d指定发行版了。

详情参阅WSL 文档的基本 comands

4.3. 登录Ubuntu18

方法一:搜索Ubuntu,打开Ubuntu 18.04.5 on Windows,会直接登录到发行版内部

方法二:PowerShell中执行wsl命令登录进入发行版内部

1
2
3
wsl -l -v
wsl -d Ubuntu-18.04
wsl -d Ubuntu-18.04 -u root

PS:docker-desktop-data 发行版是不支持 wsl -d 登录的。

4.4. 磁盘路径说明

C盘对应Ubuntu18路径/mnt/c,D盘对应Ubuntu18路径/mnt/d

4.5. 配置SSH登录

参考文档:Win10安装Ubuntu

4.6. 配置远程登录

Ubuntu18支持SSH登录了,但是只能从Win10宿主机上登录,相同局域网的其他主机还不能访问到Ubuntu18。
本节配置使局域网其他主机也可以访问到Ubuntu18,操作步骤如下:
1、固定Ubuntu18的IP地址
2、配置端口转发,发往Win10特定端口的请求转发给Ubuntu18
3、关闭Win10防火墙

参考文档:

4.6.1. 固定IP地址

每次重启WSL2 Ubuntu18重启后,IP地址都会发生变化,无法固定路由规则,因此需要配置固定IP。

参考文档:

1、编写 setip.bat 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off
setlocal enabledelayedexpansion

:: set windows ip
ipconfig | findstr "172.29.128.1" > nul
if !errorlevel! equ 0 (
echo windows ip has set
) else (
netsh interface ip add address "vEthernet (WSL)" 172.29.128.1 255.255.240.0
echo set windows ip success: 172.29.128.1
)

:: set wsl2 ip
wsl -d Ubuntu-18.04 -u root ip addr | findstr "172.29.132.34" > nul
if !errorlevel! equ 0 (
echo wsl2 ip has set
) else (
wsl -d Ubuntu-18.04 -u root ip addr add 172.29.132.34/20 broadcast 172.29.143.255 dev eth0 label eth0:1
echo set wsl2 ip success: 172.29.132.34
)

pause

2、以管理员身份运行脚本

3、登录到Ubuntu18,查看IP和网关

1
2
ifconfig
route -n

正常的话,可以查看到IP地址为172.29.132.34,网关为172.29.128.1(Win10虚拟网卡的IP)。

注意:这里配置固定IP不能使用常规方法(《Ubuntu18配置静态IP》),因为常规方法会报错:System has not been booted with systemd as init system (PID 1). Can’t operate.

4.6.2. 配置端口转发

Win10中以管理员身份打开PowerShell,执行

1
2
3
4
5
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=172.29.132.34 connectport=22

netsh interface portproxy show v4tov4

#netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=22

参考文档:Netsh interface portproxy 命令

配置路由规则之后,本地访问本机IP:22端口,会自动转发到172.29.132.34:22

如果局域网中其他主机也想要访问到172.29.132.34:22,那么本机还需要关闭局域网防火墙(专有网络防火墙)。

4.6.3. 关闭防火墙

搜索“防火墙”,选择Windows Defender 防火墙,启用或关闭Windows Defender防火墙,关闭防火墙。

或者操作开放端口,参考文档:WIN10电脑怎么开放可访问端口

关闭防火墙之后,使用局域网内的其他主机尝试远程登录Ubuntu18进行测试。

5. 配置开机自启动

5.1. 配置开机自启动概述

配置开机自启动的常用方法包括:

  • Startup目录中放入快捷方式,快捷方式可能链接到bat脚本或者exe程序
  • Startup目录中放入vbs脚步
  • 任务计划程序中添加要执行的程序,配置触发器
  • 使用第三方配置开机自启动的程序,例如NSSMFireDaemon

5.2. 启动ssh

参考文档:

方法一:使用 vbs 脚本

1、创建 vbs 脚本
在 Windows 中,开始-运行,输入shell:startup,进入Startup目录
创建 ubuntu18.vbs 脚本,内容为:

1
2
Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu-18.04 -u root /etc/init.d/ssh start", vbhide

2、重启机器测试
重启机器后,打开任务管理器,详细信息,启动,可以看到 ubuntu18.vbs 被调用了。

方法二:使用快捷方式

1、创建快捷方式
在 Windows 中,开始-运行,输入shell:startup,进入Startup目录
新建快捷方式,起始位置为D:\Windows\System32,目标为wsl.exe -d Ubuntu-18.04 -u root /etc/init.d/ssh start

2、重启机器测试
重启机器后,打开任务管理器,详细信息,启动,可以看到 wsl.exe 被调用了。

5.3. 配置固定IP地址

方法一:使用启动目录

1、编写Win10开机自启动脚本 ubuntu18-init.bat
功能包括:自动设置固定IP地址、配置路由规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@echo off
setlocal enabledelayedexpansion

:: set windows ip
ipconfig | findstr "172.29.128.1" > nul
if !errorlevel! equ 0 (
echo windows ip has set
) else (
netsh interface ip add address "vEthernet (WSL)" 172.29.128.1 255.255.240.0
echo set windows ip success: 172.29.128.1
)

:: set wsl2 ip
wsl -d Ubuntu-18.04 -u root ip addr | findstr "172.29.132.34" > nul
if !errorlevel! equ 0 (
echo wsl2 ip has set
) else (
wsl -d Ubuntu-18.04 -u root ip addr add 172.29.132.34/20 broadcast 172.29.143.255 dev eth0 label eth0:1
echo set wsl2 ip success: 172.29.132.34
)

:: set portproxy
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=172.29.132.34 connectport=22
echo set set protproxy success: 22 -> 172.29.132.34:22

:: start sshd
wsl -d Ubuntu-18.04 -u root /usr/sbin/service ssh start
echo start sshd success: port 172.29.132.34:22

pause

2、创建快捷方式
右键 ubuntu18-init.bat,创建快捷方式。
右键快捷方式,属性,高级,勾选用管理员身份运行。

3、设置开机自启动
ubuntu18-init.bat 的快捷方式,放入到 Startup 目录中,开机后会自动执行它。

win+R打开运行,输入shell:startup,进入Startup目录。
Startup 目录全路径为 C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

4、重启机器测试
重启机器后,打开任务管理器,详细信息,启动,可以看到 ubuntu18-init.bat 被调用了。

PS:这个设置开机自启动的方法,不止适用于 bat 脚本,对于常见的应用程序也是可行的,比如QQ、微信等。

方法二:使用计划任务

参考文档:Windows开机启动bat文件

1、打开任务计划程序
按键盘上的Windows + R键以打开运行,然后键入taskschd.msc,回车。

2、创建任务
点击创建任务,进行任务配置。

常规参数:

  • 名称:ubuntu18-init
  • 勾选不管用户是否登录都要运行
  • 勾选不存储密码。该任务将只有访问本地计算机资源的权限。
  • 勾选使用最高权限运行。

触发器,新建,开始任务选择启动时,延迟任务时间选择1分钟,勾选已启用,确定。
操作,新建,操作选择启动程序,程序或脚本通过浏览选中ubuntu18-init.bat,添加参数空白,起始于空白(在哪个路径中执行),确定。

3、查看任务
右键任务计划程序库,刷新,即可看到新增的任务。

4、重启机器测试

手动测试计划任务:
1、在powershell或者cmd中执行计划任务中定义的命令和参数
2、单击计划任务,点击右侧开始

6. Ubuntu18中安装Docker

安装方法参考文档:《Docker入门篇》

6.1. 启动Docker

使用service命令启动Docker

1
service docker start

6.2. 使用示例

以安装MySQL为例:

1
2
3
4
5
6
7
8
9
10
docker pull mysql:8.0.28

docker run --name mysql -d \
-p 3306:3306 \
-v /opt/mysql/mysql-files:/var/lib/mysql-files \
-v /opt/mysql/conf.d:/etc/mysql/conf.d \
-v /opt/mysql/data:/var/lib/mysql \
-v /opt/mysql/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=voidking \
mysql:8.0.28

更多内容参考文档:《使用Docker安装配置MySQL》

7. 更改Ubuntu18数据盘到D盘

参考文档:WSL2下修改Docker Desktop镜像存放路径

1、关闭Ubuntu18

1
2
3
wsl -l --all
wsl -l -v
wsl -t Ubuntu-18.04

2、导出Ubuntu18备份文件到D:\Ubuntu18(需要提前创建目录)

1
wsl --export Ubuntu-18.04 D:\Ubuntu18\Ubuntu-18.04.tar

3、注销Ubuntu18

1
wsl --unregister Ubuntu-18.04

5、导入Ubuntu18

1
wsl --import Ubuntu-18.04 D:\Ubuntu18\ D:\Ubuntu18\Ubuntu-18.04.tar --version 2

6、启动Ubuntu18

1
wsl -d Ubuntu-18.04

8. 服务探活

8.1. 交互式探活

1
2
3
4
5
6
7
@echo off
set /p host="Enter IP: "
set /p port="Enter PORT: "

powershell -Command "if((Test-NetConnection -ComputerName %host% -Port %port%).TcpTestSucceeded){write-host 'connect to %host%:%port% success'}else{write-host 'connect to %host%:%port% failed'}"

pause

8.2. 一键探活

假设 Ubuntu-18.04 中安装了MySQL和Redis,想要在Win10中一键探活,那么可以使用下面的脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off

REM 探测MySQL状态
set mysql_host=172.29.132.34
set mysql_port=3306

powershell -Command "if((Test-NetConnection -ComputerName %mysql_host% -Port %mysql_port%).TcpTestSucceeded){write-host 'connect to mysql %mysql_host%:%mysql_port% success'}else{write-host 'connect to mysql %mysql_host%:%mysql_port% failed'}"

REM 探测Redis状态
set redis_host=172.29.132.34
set redis_port=6379

powershell -Command "if((Test-NetConnection -ComputerName %redis_host% -Port %redis_port%).TcpTestSucceeded){write-host 'connect to redis %redis_host%:%redis_port% success'}else{write-host 'connect to redis %redis_host%:%redis_port% failed'}"

pause