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)