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