在Windows子系统Linux(WSL)上安装和配置Docker

先决条件


在开始之前,请确保您的系统具有以下大致配置:

  • Windows 10版本1803内部版本1734及更高版本
  • 适用于WSL 16.0.4 LTS或类似功能的Ubuntu(您的版本可能会略有不同)

重要的是,Windows的版本和内部版本不得低于此处指示的版本。事实是,从这些数字开始,对Windows WSL内核进行了根本性的更改,允许使用cgroup(控制组-在2008年添加到Linux内核)。对于Docker而言,它们在容器中管理系统资源是必需的。



安装Docker-CE 09.17.0


我们将安装Docker Community Edition 17.09.0(因为在撰写本文时,在WSL上安装的最新版本已经下降)。

我们要做的第一件事是摆脱所有以前的Docker安装(如果有)。为此,运行bash终端并编写以下内容:

$ sudo apt-get remove docker docker-engine docker.io containerd runc


现在安装Docker CE的存储库。通过apt-get,我们可以安装必需的版本,而不必自己从源代码中构建它。按照Docker官方网站上建议,我们编写以下命令:

#   
$ sudo apt-get update
#   ,   apt    HTTPS
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common

#      GPG   Docker
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#  Docker   :
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

#        Docker    
$ sudo apt-get update

如果您曾经使用apt添加了新的存储库,那么总体上所有这些都是您熟悉的。如果没有,我希望您仍然与我在一起:)

接下来,安装Docker:

$ sudo apt-get install docker-ce=17.09.0~ce-0~ubuntu

如果您未使用Ubuntu风格的WSL,则可以看到可用版本的列表,如下所示:

$ apt list -a docker-ce


...或者如果您放弃了APT,则使用其他库中的类似命令。

最后,您需要将当前用户添加到docker组中,以便能够正确使用应该在您的系统上运行的Docker Engine。作为根。

sudo usermod -aG docker $USER

在Windows上运行Docker


现在已经安装了Docker,每次启动Windows时,我们都需要使用一种相当棘手的方法将其作为WSL中的服务启动。这并不像看起来那样容易。我们需要代表超级用户采取行动,并以提升的特权运行命令外壳程序,这使任务变得有些复杂。

为了稍微简化该过程,请在/ usr / local / sbin /中创建一个新文件-该脚本包含用于启动Docker服务的适当命令:

$ sudo nano /usr/local/sbin/start_docker.sh

具有以下内容:

#!/usr/bin/env bash
sudo cgroups-mount
sudo service docker start

第一个sudo命令是挂载cgroups(它将在重新引导时执行),第二个sudo命令将docker服务提供给systemd(这是用于初始化和管理服务的Ubuntu子系统)。

现在运行脚本并运行它:

$ sudo chmod +x /usr/local/sbin/start_docker.sh
#  
$ sudo chmod 755 /usr/local/sbin/start_docker.sh
$ /bin/sh /usr/local/sbin/start_docker.sh

但是,Docker服务无法启动有两个原因:

  1. 该脚本以超级用户身份进行调用,因此脚本本身必须以超级用户权限运行才能正常工作。从理论上讲,执行此操作就像编写任何sudo命令一样简单,但是为此,用户必须在每次下载后输入其数据,这非常烦人。
  2. 挂载cgroup的第一个命令必须在具有提升特权的bash中运行。要在没有用户输入的情况下运行它,我们必须使用Windows Task Scheduler。

全清?然后要点...

在没有用户输入的情况下以root特权运行脚本


在Linux操作系统家族中,/ etc / sudoers文件确定可以使用超级用户特权运行的用户和对象。让我们对其进行修改,以便您的用户可以调用脚本,而不必不断输入root密码。(但是请小心使用此文件!如果您不知道自己在做什么,很容易将自己从系统中删除!)

$ sudo nano /etc/sudoers

在文件末尾添加新行。在这种情况下,您必须完全知道您的用户名(如果不确定,请运行echo $ USER):

<your username here> ALL=(ALL:ALL) NOPASSWD: /bin/sh /usr/local/sbin/start_docker.sh

现在我们可以以root用户身份启动Docker服务,而无需用户输入:

$ sudo /bin/sh /usr/local/sbin/start_docker.sh 

同志们!

在Windows启动时正确启动Docker


现在,当系统启动时,我们将能够使用不需要用户交互的单独命令以管理员身份启动Docker。



启动Windows Task Scheduler,然后在左窗格中选择Task Scheduler库。然后在右窗格中选择“ 创建任务 ”。



接下来,将提示您编辑任务的基本设置。给您的任务起一个清晰的名称,并确保其余设置与我的匹配。选择“以最高特权运行”非常重要



在“ 触发器”选项卡中,添加一个新触发器,触发器将在本地用户登录后立即启动任务。



切换到“ 动作”选项卡,创建一个将运行bash的新动作,并立即使用-c开关执行脚本

-c "sudo /bin/sh /usr/local/sbin/start_docker.sh"


请注意,这必须使用提升的特权来完成,因此请选中常规”选项卡上的“以最高特权运行”复选框 其余参数主要取决于个人偏好,但我将显示我的设置。如果需要,可以复制它们。如果您坐在静止的汽车上,某些电源设置可能不会出现。我个人使用笔记本电脑。 好吧,一切都按我们的预期进行。如果您在上一步中没有使用提升特权的命令启动Docker,请右键单击我们在“任务计划程序”中创建的任务,然后选择“运行”!就这样!









检查一切正常


为了安全起见,请重启计算机(是的,为此您必须关闭浏览器选项卡一段时间),启动bash并输入:

$ docker run --rm hello-world

如果一切顺利,您将看到Docker的标准问候语。该服务将自动直接在WSL中启动!恭喜你!

四舍五入


您刚刚在WSL中安装并启动了Docker。这意味着您的容器现在可以共享已在系统上运行的Ubuntu。因此,无需像Windows的常规Docker一样部署新的(虚拟化)操作系统。

到目前为止,[在撰写本文时] Docker在WSL中的性能很差,但是随着平台的发展和Windows更新的发布,它只会有所改善。


  1. onomatopellan GitHub: https://github.com/Microsoft/WSL/issues/2291#issuecomment-383698720
  2. Official Docker Documentation: https://docs.docker.com/install/linux/docker-ce/ubuntu/
  3. cgroupfs-mount: https://github.com/tianon/cgroupfs-mount
  4. Bash Command Line Interface: https://docs.microsoft.com/en-us/windows/wsl/reference


All Articles