标题绕口。 我之前一直使用 Virtualbox 和 homestead 来运行我的 PHP 开发环境。最近决心开始尝试 DevOps,使得开发、部署容器化,来化解人为操作失误和环境不兼容等问题造成的各种损失。就打算开始用比较成熟的 Docker 来做。

但众所周知在 windows 环境下,Docker 和 Virtualbox 有冲突,一山不容二虎(

于是决定用 Virtualbox 虚拟个 Debian 命令行系统,然后在 Debian 里面跑 Docker 这样大家就都没意见了。

整体思路:

  1. 安装 Virtualbox
  2. 新建个虚拟机,安装 Debian。
    这里推荐虚拟机开两个网卡,一个 Nat 模式,一个 HostOnly 模式。这样方便 windows 主机用 SSH 工具登入虚拟机进行管理。再把 HostOnly 那个网卡配一个静态 IP , windows 主机的 hosts 也加一个域名比如 dockerhost 指向它就更方便了。
  3. 在 Debian 里面装 Docker
  4. 在 Virtualbox,配置 Debian 虚拟机的共享目录。我选择的是 E:\dockerHostShare, 你选择你自己的目录。记得把 Auto-mount 和 Make Permanent 打上勾
  5. 在 Debian 里面装 VBoxGuestAdditions 服务官网流程: https://virtualboxes.org/doc/installing-guest-additions-on-debian/参考 BSalita 的回答: https://serverfault.com/questions/674974/how-to-mount-a-virtualbox-shared-folder要注意的是你可能需要把当前用户添加入 vboxsf 用户组(需要重启)。如果你是 root 就无所谓了。为了方便你可以 ln -s /media/sf_dockerHostShare ~/dockerHostShare 就不用每次都到 media 里面找了。
  6. 在 windows 主机的 E:\dockerHostShare 目录下可以添加你任何项目目录,项目目录里添加 Dockerfile, 然后你就可以在 Debian 虚拟机里执行这些 Dockerfile 了。

追加

以上安装方法可能导致 docker 跑的 Nginx 总是 404,原因是共享目录的用户组是 root:vboxsf , 通常的 nginx 镜像里是没有 vboxsf 用户组的, 且大部分的 docker 镜像里面的程序都是用 gid 为 1000 的用户/用户组执行的。

所以此时需要你手工修改 Debian 里的 /etc/group 将 vboxsf 的 gid 改为 1000, 把另一个 gid 是 1000 的改成别的数(下称 default_gid)。别忘了也要将 /etc/passwd 里面原来是 1000 的 gid 调整为 default_gid,否则默认用户会混乱。

然后到 VirtualBox 控制面板,删掉原来的共享目录,再重新添加共享目录。回到 Debian 查看这个目录的权限 ls -lan 就会发现用户/用户组变成了 0 1000 (其实还是 root vboxsf, 只是 gid 改了)

主要思路就是这样。如果遇到哪些镜像使用的用户/用户组和 0:1000 不匹配,请自行在他的 Dockerfile 里添加 RUN addgroup -gid 1000 vboxsf \ && adduser 镜像里的执行用户名 vboxsf 这样就能让镜像里的执行用户有权限访问共享目录了。