天天看點

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

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

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

解決方案

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

Minikube 簡介

Minikube是社群一個流行的開源Kubernetes開發環境。為了幫助國内的同學可以更加高效和無障礙地使用minikube進行日常開發,Minikube可以支援阿裡雲作為容器鏡像的mirror site。進一步,在v1.24.0的官方 Minikube 中,已經合并了由阿裡雲團隊送出的一個

方案

,可以完美支援 Minikube 豐富的 addon 元件!

Minikube可以借助不同的 driver 實作,在MacOS/Windows/Linux環境中建立Kubernetes運作環境。

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

本文将借助 hyperkit驅動來在MacOS上建立一個虛拟機來配置Minikube環境。

首先解除安裝 Docker Desktop

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

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

安裝配置 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 http://127.0.0.1:49996/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...           
不借助 Docker Desktop 在Mac上開發容器應用

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' 插件           
不借助 Docker Desktop 在Mac上開發容器應用

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

https://minikube.sigs.k8s.io/docs/handbook/addons/ingress-dns/

來學習使用

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

https://minikube.sigs.k8s.io/

建立不運作 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$ 的價格也就是一杯星巴克咖啡,可以節省一些折騰的時間。

繼續閱讀