在WSL中搭建环境:WSL + Docker Toolbox(docker-machine) + docker-compose
我們將使在 Windows 上構建的 Docker Toolbox 的 Docker Machine 可以通過 WSL 內的 docker-compose 命令進行操作。
安裝Windows所需的東西
我会用Chocolatey来进行各种安装。并非必须使用Chocolatey。
由于Docker Toolbox需要VirtualBox,所以需要安装它。另外,更新VirtualBox后,Docker Machine有很大概率无法运行,因此需要固定版本(先卸载,再安装)。
choco install -y virtualbox
choco pin add -n virtualbox
安装Docker Toolbox。
choco install -y docker-toolbox
安装WSL所需的内容
在 WSL 上安装 Docker。由于有适用于Ubuntu的软件包仓库,我们将从该仓库进行安装。
- https://docs.docker.com/install/linux/docker-ce/ubuntu/#set-up-the-repository
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
请在您的系统上安装docker-compose和docker-machine。您可以前往它们在Github上的构建页面下载编译好的二进制文件,并将其放置在正确的路径下。
-
- https://github.com/docker/compose/releases/latest
- https://github.com/docker/machine/releases/latest
创建 Docker Machine
在Windows上创建Docker Machine是关键。指定–virtualbox-share-folder参数非常重要,否则将无法与WSL的路径相对应。详细信息将在后面说明。
docker-machine.exe create default --driver=virtualbox \
--virtualbox-hostonly-cidr '192.168.99.1/24' \
--virtualbox-share-folder 'c:\Users:/mnt/c/Users'
然后,通过WSL的docker-machine命令,将在上述操作中构建的Docker Machine导入,以便进行操作。当指定–driver=generic时,可以通过SSH进行docker-machine控制运行中的主机。通过–generic-ip-address或–generic-ssh-key参数,可以指定Windows端的Docker Machine。
docker-machine create default --driver=generic \
--generic-ssh-user="docker" \
--generic-ip-address="$(docker-machine.exe ip)" \
--generic-ssh-key="/mnt/c/Users/$USER/.docker/machine/machines/default/id_rsa"
这并非必需。虽然被称为导入,但是使用 –driver=generic 无法执行 docker-machine start 或 docker-machine stop 命令,所以我认为只会使用 docker-machine ip 和 docker-machine ssh。仅使用这些命令而已,执行 Windows 端的 docker-machine.exe ip 等指令也没有太大区别。
我会设置环境变量,以便于在WSL中使用docker命令。
docker-machine env > "$HOME/.docker/env"
echo 'source "$HOME/.docker/env"' >> ~/.bash_profile
source "$HOME/.docker/env"
确认能够从WSL的docker命令访问到Windows的docker-machine。
docker ps
docker run --rm hello-world
我要确认一下,您也可以表达类似的意思。
docker run -v $PWD:/app:ro --rm alpine ls /app
最后,将WSL端的Docker Machine的密钥、证书等文件复制到Windows端的Docker Machine中。
rsync ~/.docker/machine/machines/default/ \
"/mnt/c/Users/$USER/.docker/machine/machines/default/" \
--exclude config.json -av
当在WSL上使用`–driver=generic`导入Docker Machine时,由于正在运行的Docker Engine在Docker Machine中访问其密钥和证书发生更新,因此直接使用Windows上的docker-machine.exe命令将无法执行某些操作。
然而,即使没有私钥和证书,也可以使用docker-machine.exe start和docker-machine.exe stop,所以并不会遇到太多困扰(在Windows上使用docker-machine.exe时,只需进行这些操作即可)。
创业企业
在创业公司中使用Docker Machine是一个不错的选择。您可以通过以下步骤打开启动文件夹…
explorer.exe shell:startup
如果注册以下这样的快捷方式,就可以了。
docker-machine.exe start
关于密码。
docker-machine 在默认情况下,将主机(Windows)的目录挂载到客户机(VirtualBox)上,例如将 c:\Users 挂载为 /c/Users。
只要在Windows上使用docker-compose命令,这就足够了。docker-compose会自动将类似于c:\Users的路径转换为/c/Users(前提是设置了COMPOSE_CONVERT_WINDOWS_PATHS=true环境变量,而这个环境变量在docker-machine.exe env中已经包含了)。
然而,如果在WSL中使用,则此方法并不方便。在WSL中,主机的目录会被挂载为c:\Users -> /mnt/c/Users的方式。
因此,为了在WSL中指定/mnt/c/Users/ore/vol等作为挂载点,需要在VirtualBox中将c:\Users挂载到/mnt/c/Users。
因此,在创建docker-machine时,使用 –virtualbox-share-folder 参数指定如下。
docker-machine.exe create default --driver=virtualbox \
--virtualbox-hostonly-cidr '192.168.99.1/24' \
--virtualbox-share-folder 'c:\Users:/mnt/c/Users'
需要注意的是,如果按照上述步骤创建Docker Machine,那么在Windows上使用docker-compose.exe时,路径无法对应,因此变得无法使用。在PhpStorm中设置docker-compose时要注意,因为它使用的是Windows上的docker-compose.exe。
也许可以通过在WSL的设置中将主机目录 c:\Users 挂载到 /c/Users,这样可以同时使用WSL和Windows的docker-compose(未经确认)。
最后
Docker for Windows需要Hyper-V,而Hyper-V无法与VirtualBox共存,而VirtualBox是vagrant所需,因此我不使用Docker for Windows。所以我不知道能否通过WSL使用Docker for Windows。
由于我几乎不再使用Vagrant了,如果在WSL上可以使用Docker for Windows,可能最好转而使用Docker for Windows(但不确定是否能解决路径问题)。