不借助 Docker Desktop 在Mac上開發容器應用

哈哈哈hh發表於2021-11-30

映象下載、域名解析、時間同步請點選  阿里巴巴開源映象站

Docker Desktop是最為流行的開發者工具,Docker公司在 8/31 宣佈對Docker Desktop的使用者協議進行了變更,對個人開發者繼續免費,但是對商業開發者採取了收費策略。最近很多同學來諮詢我相關的問題,我也就此做一個說明

解決方案

關於為 Docker Desktop 付費流程,我們已經和集團採購團隊進行溝通,但是Docker公司的License授權有些複雜,如果是採購Pro版本,需要每個開發者自己付費,不支援批次採購。而Business版本,支援批次採購,但是我們們也不需要。還在跟進其他可行性,我們會持續和大家溝通。 如果您只是需要執行K8s環境,用阿里雲容器服務ACK是最推薦的方案,沒有之一 :-) 如果您需要一個免費的本地開發環境,也有較好的動手能力,可以參考本文內容

Minikube 簡介

Minikube是社群一個流行的開源Kubernetes開發環境。為了幫助國內的同學可以更加高效和無障礙地使用minikube進行日常開發,Minikube可以支援阿里雲作為容器映象的mirror site。進一步,在v1.24.0的官方 Minikube 中,已經合併了由阿里雲團隊提交的一個方案,可以完美支援 Minikube 豐富的 addon 元件!

Minikube可以藉助不同的 driver 實現,在MacOS/Windows/Linux環境中建立Kubernetes執行環境。

本文將藉助 hyperkit驅動來在MacOS上建立一個虛擬機器來配置Minikube環境。

首先解除安裝 Docker Desktop

開啟 Preference -> TroubleShoot 頁面,點選 Uninstall

安裝配置 Minikube以及相應 Docker 環境

安裝 hyperkit, Minikube,以及 Docker 命令列工具 (注:不包含執行時環境)

$ brew install hyperkit
$ brew install minikube
$ brew install docker

體驗 Minikube 下面的 Kubernetes

建立Kubernetes環境最簡單的方案是使用如下命令

minikube start --image-mirror-country='cn'

minikube start 命令提供了非常多的配置引數,

常用配置引數如下

  • --cpus=2: 為minikube虛擬機器分配CPU核數
  • --memory=2048mb: 為minikube虛擬機器分配記憶體數
  • --registry-mirror=***: 為了提升拉取Docker Hub映象的穩定性,可以為 Docker daemon 配置映象加速,參考  相關加速器配置
  • --kubernetes-version=***: minikube 虛擬機器將使用的 kubernetes 版本。比如,建立 minikube 環境並且調整預設資源配置

建立 minikube 執行環境

$ minikube start --image-mirror-country='cn'
  Darwin 11.6 上的 minikube v1.24.0
✨  自動選擇 hyperkit 驅動
✅  正在使用映象儲存庫 registry.cn-hangzhou.aliyuncs.com/google_containers
  Starting control plane node minikube in cluster minikube
  Creating hyperkit VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
  正在 Docker 20.10.8 中準備 Kubernetes v1.22.3…
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
  Verifying Kubernetes components...
    ▪ Using image registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v5
  Enabled addons: storage-provisioner, default-storageclass
  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

開啟 Kubernetes 控制檯

$ minikube dashboard
  正在開啟 dashboard ...
    ▪ Using image registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.7
    ▪ Using image registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard:v2.3.1
  正在驗證 dashboard 執行情況 ...
  Launching proxy ...
  正在驗證 proxy 執行狀況 ...
  Opening 
	```
![file](~tplv-k3u1fbpfcp-zoom-1.image)
Minikube 也提供了豐富的 Addon 元件,比如我們開啟了 metrics-server 元件,就可以監控 Pod 的資源使用情況。
$ minikube addons enable metrics-server
▪ Using image registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.4.2

啟動 'metrics-server' 外掛 ``` 

如果大家需要使用 Ingress,可以參考   來學習使用

更多關於 Minikube 的使用資訊可以參考 

建立不執行 Kubernetes 的 Minikube

對不需要使用 Kubernetes的開發者,Minikube 在 v1.24 版本之後也提供對不執行 Kubernetes 的 Minikube 環境的支援。可以更加節省資源。

$ minikube start --no-kubernetes
  Darwin 11.6 上的 minikube v1.24.0
    ▪ MINIKUBE_ACTIVE_DOCKERD=minikube
✨  自動選擇 hyperkit 驅動
  Starting minikube without Kubernetes minikube in cluster minikube
  Creating hyperkit VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
  Done! minikube is ready without Kubernetes!
  Done! minikube is ready without Kubernetes!
╭───────────────────────────────────────────────────────────────────────────────────────╮
│                                                                                       │
│                         Things to try without Kubernetes ...                        │
│                                                                                       │
│    - "minikube ssh" to SSH into minikube's node.                                      │
│    - "minikube docker-env" to point your docker-cli to the docker inside minikube.    │
│    - "minikube image" to build images without docker.                                 │
│                                                                                       │
╰───────────────────────────────────────────────────────────────────────────────────────╯

配置 Docker 環境

首先配置 Docker 命令列工具的環境變數

$ eval $(minikube docker-env)

然後就可以利用熟悉的Docker命令列工具快樂地玩耍了

$ docker ps
$ docker images

建立如下的一個Dockerfile

FROM nginx
RUN echo 'Hello World!' > /usr/share/nginx/html/index.html

構建並執行映象

$ docker build -t test .
$ docker run -d -p 8080:80 test

測試映象,

$  curl $(minikube ip):8080
Hello World!

注意: Docker暴露出的host埠是在Minikube虛擬機器上,所以需要使用minikube ip獲得虛擬機器所在的IP。Docker Desktop進一步最佳化了開發者體驗,讓暴露的端點可以直接對映到本地。

我們如何將本地檔案卷掛載到Docker容器中呢? 這個就是有點繞。首先,我們要知道Docker環境是執行在Virtual Machine的虛擬機器上,我們需要首先將本地卷,掛載到 Minikube 虛擬機器上。

$ mkdir test
$ echo 'Just for test!' > test/test.txt
$ minikube mount ./test:/test

然後,我們可以在Docker映象中掛載Minikube 虛擬機器上的卷,並進行訪問

$ docker run --rm -it -v /test:/inside busybox cat /inside/test.txt
Just for test!

注意:Docker Desktop在這個場景下也提供了良好的使用者體驗,讓使用者忽略底層實現的複雜性。

總結

對於動手能力比較強的開發者,抱著生命不息,折騰不止的態度,不借助 Docker Desktop,也可以進行本地的容器和Kubernetes開發。阿里雲團隊也為國內開發者提供了良好的網路訪問體驗。如果大家有問題可以到Github上提Issue.

但是對於普通開發者,Docker Desktop 在開發體驗上有很多的最佳化,每個月 Pro版本 5$ 的價格也就是一杯星巴克咖啡,可以節省一些折騰的時間。

原文來源: https://developer.aliyun.com/article/815063


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70003733/viewspace-2844878/,如需轉載,請註明出處,否則將追究法律責任。

相關文章