利用WSL与Docker在Windows上快速部署开发环境

前言

很多课程的实践要求在*nix系统下进行某些程序的运行和软件编译,同时某些软件在Windows的环境配置繁琐的让人很绝望,一般实践课的要求是使用VMware系列的虚拟机来搭建环境,其实WSL和Docker在这种轻量使用的情形下是更好的选择.特别是Docker,在同桌还在配置OTP时,我两行代码拉取了Rabbitmq-Management_Alpline,岂不美哉XD

搭建WSL2

请参照Windows系统的官方文档:适用于 Linux 的 Windows 子系统安装指南,WSL并非某个发行版,而是一套类似虚拟机的机制,因此你可以自行选择喜欢的发行版.甚至你可以自行编译,例如 ArchWSL.

请注意,只有版本 1903 或更高版本的Windows10 非家庭版 可以使用全部功能.

更换包管理器源

注意,WSL也需要按照对应的发行版更换镜像源以获得更好的速度.

安装Docker

下载Docker For Windows安装即可,注意Docker倾向于使用WSL2作为后端虚拟机而非Hyper-V以提高性能,因此注意要安装上文指南中提到的安装补丁.

使用Docker Hub镜像

在任务栏托盘 Docker 图标内右键菜单选择 Settings,打开配置窗口后在左侧导航菜单选择 Docker Engine,在右侧像下边一样编辑 json 文件,在registry-mirrors数组中加入镜像地址,之后点击 Apply & Restart 保存后 Docker 就会重启并应用配置的镜像地址了。

你可以在这里看到Docker Hub镜像站的可访问情况.

 "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]

Hyper-V 与Idea系的端口冲突

在使用Hyper-V后端的Docker时,可能会出现与Idea占用了同一个动态端口的情况,此时Idea无法启动,提示

Internal error. Please report to http://jb.gg/ide/critical-startup-errors
java.net.BindException: Address already in use: bind

解决方法为:

  1. 停用Hyper-V.
    可以使用命令行:
dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
  1. 手动设置端口

    netsh int ipv4 add excludedportrange protocol = tcp startport = 6942 numberofports = 1
  2. 启用Hyper-V

    dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

Docker实践

请参考Gitbook项目 Docker — 从入门到实践.

与VSCode协同

作为MS自家的重量级 富文本编辑器 VSCode对WSL的支持十分完善,只需要安装Remote Development拓展包,(在这里),就可以远程接入DockerWSLSSH远端环境.在安装对应语言的拓展(VSCode中)和对应编译器环境(Docker或WSL中),就可以进行调试和编译了.同时,打开文件项目,输入终端命令也和本机没有什么区别.

VSCode 打包的Docker

VSCode也提供了一些几乎即开即用的语言编译调试环境Docker镜像,已经安装Remote Development中的Remote-Containers后,在命令面板输入 Remote-Containers: Try a Sample...,会出现准备好的语言环境.image-20201123154247832

对于特定的Docker 镜像,VSCode还自动侦测可转发的端口,并提供端口转发服务,特别是在Web相关的应用中(官方以Node与PHP为例)格外有用.请参阅官方指南获知更多功能.

与Clion协同

目前我遇见更多的需求是调试C程序,因此我更多的使用Clion中的远程调试功能,虽然没有VSCode与WSL2 深度集成的功能,但是也足够满足一般的调试需要.

Clion 与WSL通信的方式是使用SSH,为了防止对Windows造成影响,一般将SSH端口更改为非22端口,如Jetbrains推荐改为2222.

这里,你可以找到比较完善的指南.

注意,对于Clion,在第一次连接远程环境时进行头文件的搜索与同步,可能耗费较长时间.以后也可以在工具菜单中选择与远程重新同步.

tag(s): none
show comments · back · home
Edit with markdown