Docker-machine-parallels
本文於453天之前發表,文中內容可能已經過時。如有疑問,請在評論區留言。
起因
因 Docker on MAC 的 IO 會很慢的瓶頸,查資料大致可分為以下幾種解法:
- Disktop Tool 改使用 docker ce edge 版本
- 改用 docker-machine-parallels
- 使用 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 下
- 所以實際上掛載關係是:
- docker container 掛載 Volume(nfsmount)
- Volume 透過 docker volume create 綁定到 NFS Share Dir
- NFS Service 將 APFS Dir 設定分享並指定連線權限(此部份由 docker-machine-nfs 協助)
安裝 Docker Edge CE Version
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
9docker-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
2docker-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
22docker-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
14docker 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
測試讀寫速度
測試用指令:
- 測試磁碟的IO寫速度: time dd if=/dev/zero of=test.dbf bs=8k count=300000
- 測試磁碟的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
9userid@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
9userid@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 totalParallels
1
2
3
4
5
6
7
8UserID@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)