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
- 安装 VirtualBox https://www.virtualbox.org/
- 下载 unix 并安装 https://www.centos.org/download/
我是选择安装 Centos 8
- 在 VM 中安装 Docker & Docker-compose https://docs.docker.com/compose/installs
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
- 在 VM 安装 Guest Addition https://www.tecmint.com/install-virtualbox-guest-additions-in-centos-rhel-fedora/
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,你的 Mac 也要装 docker command ,不然就没有 docker 这个指令
- brew install docker docker-compose
以下是我的 VM start script 范例
- # start agent
- /usr/bin/ssh-agent
- ssh-add .ssh/your_key.local
- # start docker
- #sudo service docker start
- sudo dockerd -H tcp://localhost:2375 &
- # to create tunnel
- ssh -vv -N -R 8882:localhost:22 192.168.x.x &
- 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 影响。
- ssh -vv -N -R 8882:localhost:22 192.168.x.x &
- 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