2021
Sep
10

docker toolbox 的功能是整合 Virtualbox (以下简称 VM) ,自动帮你装好一个小型的 linux 并安装 docker server ,在 Mac / Windows 你可以使用 docker 指令直接操作 linux 里的 docker,但是 2020 年 docker toolbox 就不再维护, 新电脑也无法再装 toolbox ,而只能用 docker Team 提供的 docker desktop ,使用 docker desktop 的经验很不好,尤其是常常遇到 cpu 使用率超过 100%,电脑风扇转到快爆炸,这里问题已经发生好多年了,可以在网路上查到很多人反应这个问题, 但一直没有解决。

免费版的 docker destop 又会自动强迫更新,好不容易设定好可以正常运作的 docker destop ,很可能因为自动更新又发生 cpu 爆表的状况。

docker toolbox

先说明一下 docker toolbox 的原理,它会自动帮你安装 VirtualBox 跟一个小型的 unix os,并在 os 上面安装 docker engine,提供 docker-machine 跟 docker 两种 command 来控制 VirtualBox and docker,了解 toolbox 的运作原理,我们就可以手动完成上面的软体安装,实现从 Mac docker command 直接操作 unix docker engine。

- VirtualBox : 安装 unix os 并可以用 docker-machine command 操作
- Unix os: 安装 docker engine ,并可以用 docker command 操作

下面将说明如何自已安装 VirtualBox / Linux / Docker ,并且让 Mac docker 与 VM docker 直接沟通

安装 VirtualBox 跟 Linux

我是选择安装 Centos 8
dnf install -y docker-ce
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Guest Addition 目的是要在 VM mount Mac 上的资料夹
在无 UI linux 上安装 Guest Addition 比较麻烦,如果你有遇到问题可以在下方留言问我
  • 在 VM 启动 docker daemon 并绑 localhost port 2375
sudo dockerd -H tcp://localhost:2375 &
  • 在 VM 建 SSH Tunnel 解决 VPN 环境无法连进 vm local ip (192.168.x.x 是你的 Mac IP)
ssh -vv -N -R 8882:localhost:22 192.168.x.x &
ssh -vv -N -R 2375:localhost:2375 192.168.x.x &
  • mount 个人目录 ,我的个人开发档案全部放个人目录,所以只要 mount 个人目录就可以了,如果你习惯挡案放别的路径,可以自已多 mount 几个,注意 Mac 与 VM 的路径要一模一样,不然 VM 中的 docker 会找不到档案
Mac /User/yourName
VM /User/yourName
  • 修改 VM user 权限,资料夹 mount 需要先从 Mac mount 到 VM ,再从 VM mount 到 docker container ,很容易会发生权限问题,解法是去修改 VM /etc/group ,把你的个人帐号加进 vboxsf 后面
vboxsf:x:991:${your account}
  • Mac 设定环境变数 DOCKER_HOST="tcp://0.0.0.0:2375"
export DOCKER_HOST="tcp://0.0.0.0:2375"
docker 有支援 UNIX Domain socket (/var/run/docker.sock),我们可以透过 socket 来直接跟 docker engine 沟通
另外 docker 还支援 tcp socket ,我们可以透过 ip / port 跟 docker engine 沟通,这里我是选择使用 tcp socket
  • Mac 直接下 docker ps command 就可以操作 VM 中的 docker engine

以下是我的 VM start script 范例

Example
  1. # start agent
  2. /usr/bin/ssh-agent
  3. ssh-add .ssh/your_key.local
  4.  
  5. # start docker
  6. #sudo service docker start
  7. sudo dockerd -H tcp://localhost:2375 &
  8.  
  9.  
  10. # to create tunnel
  11. ssh -vv -N -R 8882:localhost:22 192.168.x.x &
  12. ssh -vv -N -R 2375:localhost:2375 192.168.x.x &

VPN

前面的步骤中,有一步是建立 Linux Tunnel,为的就是解决 VPN 环境的问题,在 VPM 环境中,Mac 所有的 routing rule 都会被 VPN 软体控制,预设大多数的 Requests 都会经由 VPN 连线出去 (这跟公司 IT VPN 设定有关系) ,造成我无法在 MAC 直接用 local ip 连到 VM docker,我的解决方式是从 VM 建一条 Reverse SSH tunnel 到 MAC , VM 的网路连到 Mac local ip 并不会受到 VPN 影响。

Example
  1. ssh -vv -N -R 8882:localhost:22 192.168.x.x &
  2. ssh -vv -N -R 2375:localhost:2375 192.168.x.x &

其它参考

docker 支援同时建立多种 socket ,我们可以同时建立 unix domain socket (/var/run/docker.sock) 跟多个 tcp socket

sudo dockerd -H unix:///var/run/docker.sock -H tcp://192.168.59.106 -H tcp://10.10.10.2

回應 (Leave a comment)