Docker-machine-parallels

本文於453天之前發表,文中內容可能已經過時。如有疑問,請在評論區留言。

起因

  • 因 Docker on MAC 的 IO 會很慢的瓶頸,查資料大致可分為以下幾種解法:

    1. Disktop Tool 改使用 docker ce edge 版本
    2. 改用 docker-machine-parallels
    3. 使用 docker-sync 改善 IO
  • 本次使用 edge 版本、Docker-machine-parallels 還有 NFS 掛載來加速可由 14s 縮減到 4s

環境說明

  • docker-machine 並不包含 client command (也就是 docker),所以仍需要安裝 Docker Edge CE Version
  • 檔案系統需要是大小寫區分才能編譯
  • 需要 Parallels Desktop Pro 版本才支援 docker-machine-parallels
  • NFS 因 Macbook 本身有內建服務,所以採用本服務,但有搭配 docker-machine-nfs 套件進行設置
  • 架構概念
    • 因為若直接用 docker -v volumeDir:containDir 掛載檔案系統(APFS)會有過慢的問題,所以volumeDir 是改成掛在 NFS Share Dir 下
    • 所以實際上掛載關係是:
      1. docker container 掛載 Volume(nfsmount)
      2. Volume 透過 docker volume create 綁定到 NFS Share Dir
      3. NFS Service 將 APFS Dir 設定分享並指定連線權限(此部份由 docker-machine-nfs 協助)

安裝 Docker Edge CE Version

Docker Edge for Mac 官方下載點

Docker-machine-parallels 安裝

  • 安裝 docker-machine-parallels

    1
    brew install docker-machine-parallels
  • 建立 docker-parallels machine

    • 指令完成後會在 Parallels 生成一個叫做 prl-dev 的 Linux 核心的虛擬機

    • 指令: docker-machine create –driver=parallels prl-dev

      1
      2
      3
      4
      5
      6
      7
      8
      9
      docker-machine create --driver=parallels --engine-storage-driver=overlay2 --parallels-disk-size=120000  --parallels-cpu-count=8 --parallels-memory=32768 prl-dev

      Creating CA: /Users/fanka/.docker/machine/certs/ca.pem
      Creating client certificate: /Users/fanka/.docker/machine/certs/cert.pem
      Running pre-create checks...
      (prl-dev) Image cache directory does not exist, creating it at /Users/fanka/.docker/machine/cache...
      (prl-dev) No default Boot2Docker ISO found locally, downloading the latest release...
      (prl-dev) Latest release for github.com/boot2docker/boot2docker is v19.03.5
      (prl-dev) Downloading /Users/fanka/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v19.03.5/boot2docker.iso...
  • 關閉後調整系統資源(CPU, Ram)

    • 因預設只會給 1 顆 CPU, 4G Ram 的資源,所以需要關閉後進行調整(有提供參數,但是使用後都說不支援,所以改用手動)

    • 指令:

      1
      2
      3
      4
      5
      //調整前重起虛擬機
      docker-machine stop prl-dev

      //調整後重起虛擬機
      docker-machine start prl-dev
  • 取得 docker 環境

    • 需要執行以下指令將環境變數載入
      1
      2
      docker-machine env prl-dev
      eval $(docker-machine env prl-dev)
  • 載入 Image

    1
    cat ImageName.tar | docker import - ImageName
  • 後需都會以 root 權限載跑,不影響 host 主機處理(看到的都是本機用戶權限,跳過不管)

NFS Volume 設定

  • 安裝模組

    1
    brew install docker-machine-nfs
  • 建立 NFS 分享節點(prl-dev 是 docker-machine 名稱)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    docker-machine-nfs prl-dev --shared-folder=/System/Volumes/Data/Users/fanka/ProjectWorkDir
    [INFO] Configuration:

    - Machine Name: prl-dev
    - Shared Folder: /Users/fanka/ProjectWorkDir
    - Mount Options: noacl,async,nfsvers=3
    - Force: false

    [INFO] machine presence ... OK
    [INFO] machine running ... OK
    [INFO] Lookup mandatory properties ... OK

    NFS already mounted.

    --------------------------------------------

    The docker-machine 'prl-dev'
    is now mounted with NFS!

    ENJOY high speed mounts :D

    --------------------------------------------
  • 將 NFS 分享節點設定成 Volume 以給 Container 掛載

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    docker volume rm nfsmount
    docker volume create --driver local \
    --opt type=nfs --opt o=addr=10.211.55.2,rw,nolock,noacl,async,nfsvers=3 \
    --opt device=:/Users/fanka/Project/ProjectWorkDir nfsmount

    docker volume inspect nfsmount


    docker volume rm nfsvsm
    docker volume create --driver local \
    --opt type=nfs --opt o=addr=10.211.55.2,rw,nolock,noacl,async,nfsvers=3 \
    --opt device=:/Users/fanka/Project/ProjectWorkDir2 nfsvsm

    docker volume inspect nfsvsm
  • 建立 Container

    • 指定 登入用戶 ID

      1
      docker run -itd --name=ProjectNameDev -v nfsmount:/home/userid/ProjectWorkDir --privileged=true -u 1000:1000 ImageName:latest bash
    • 不指定 登入用戶 ID

      1
      docker run -itd --name=ProjectNameDev -v nfsmount:/home/userid/ProjectWorkDir --privileged=true ImageName:latest bash
  • 進入 Container(19 是 Container ID)

    1
    docker exec -u 1000:1000 -it 19 bash

測試讀寫速度

  • 測試用指令:

    1. 測試磁碟的IO寫速度: time dd if=/dev/zero of=test.dbf bs=8k count=300000
    2. 測試磁碟的IO讀速度: time dd if=test.dbf bs=8k count=300000 of=/dev/null
  • Container With Volume ( Host 目錄 掛載成 Container 內的目錄)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    userid@a568c6f08902:~/ProjectWorkDir$ time dd if=/dev/zero of=test.dbf bs=8k count=300000
    300000+0 records in
    300000+0 records out
    2457600000 bytes (2.5 GB) copied, 14.7852 s, 166 MB/s

    real 0m14.880s
    user 0m0.510s
    sys 0m7.852s
    userid@a568c6f08902:~/ProjectWorkDir$
  • Container With NFS

    1
    2
    3
    4
    5
    6
    7
    8
    9
    userid@f8d45c431341:~/ProjectWorkDir$ time dd if=/dev/zero of=test.dbf bs=8k count=300000
    300000+0 records in
    300000+0 records out
    2457600000 bytes (2.5 GB) copied, 4.16525 s, 590 MB/s

    real 0m4.263s
    user 0m0.283s
    sys 0m1.860s
    userid@f8d45c431341:~/ProjectWorkDir$
  • Macbook APFS

    1
    2
    3
    4
    5
    [20:09:14] fanka@FankaMBP16 ~/ProjectWorkDir %>time dd if=/dev/zero of=test.dbf bs=8k count=300000
    300000+0 records in
    300000+0 records out
    2457600000 bytes transferred in 1.726226 secs (1423683730 bytes/sec)
    dd if=/dev/zero of=test.dbf bs=8k count=300000 0.15s user 1.51s system 92% cpu 1.788 total
  • Parallels

    1
    2
    3
    4
    5
    6
    7
    8
    UserID@vmName:~$ time dd if=/dev/zero of=test.dbf bs=8k count=300000
    300000+0 records in
    300000+0 records out
    2457600000 bytes (2.5 GB, 2.3 GiB) copied, 2.23421 s, 1.1 GB/s

    real 0m2.237s
    user 0m0.081s
    sys 0m2.055s

結論: Macbook APFS(1.788s, 1.4GB/S )< Parallels (2.237s, 1.1GB/S) < Container With NFS (4.263s, 590MB/s) < Container With Volume (14.880, 166 MB/s)

avatar
RamDisk On Macbook

  1. 1. 起因
    1. 1.1. 環境說明
    2. 1.2. 安裝 Docker Edge CE Version
    3. 1.3. Docker-machine-parallels 安裝
    4. 1.4. NFS Volume 設定
    5. 1.5. 測試讀寫速度