欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

不借助 Docker Desktop 在Mac上开发容器应用

程序员文章站 2022-03-13 13:56:28
...

不借助 Docker Desktop 在Mac上开发容器应用

镜像下载、域名解析、时间同步请点击 阿里巴巴开源镜像站

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运行环境。

不借助 Docker Desktop 在Mac上开发容器应用

本文将借助 hyperkit驱动来在MacOS上创建一个虚拟机来配置Minikube环境。

首先卸载 Docker Desktop

打开 Preference -> TroubleShoot 页面,点击 Uninstall

不借助 Docker Desktop 在Mac上开发容器应用

安装配置 Minikube以及相应 Docker 环境

安装 hyperkit, Minikube,以及 Docker 命令行工具 (注:不包含运行时环境)

  1. $ brew install hyperkit
  2. $ brew install minikube
  3. $ brew install docker

体验 Minikube 下面的 Kubernetes

创建Kubernetes环境最简单的方案是使用如下命令

  1. 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 运行环境

  1. $ minikube start --image-mirror-country='cn'
  2. Darwin 11.6 上的 minikube v1.24.0
  3. 自动选择 hyperkit 驱动
  4. 正在使用镜像存储库 registry.cn-hangzhou.aliyuncs.com/google_containers
  5. Starting control plane node minikube in cluster minikube
  6. Creating hyperkit VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
  7. 正在 Docker 20.10.8 中准备 Kubernetes v1.22.3
  8. Generating certificates and keys ...
  9. Booting up control plane ...
  10. Configuring RBAC rules ...
  11. Verifying Kubernetes components...
  12. Using image registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v5
  13. Enabled addons: storage-provisioner, default-storageclass
  14. Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

开启 Kubernetes 控制台

  1. $ minikube dashboard
  2. 正在开启 dashboard ...
  3. Using image registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper:v1.0.7
  4. Using image registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard:v2.3.1
  5. 正在验证 dashboard 运行情况 ...
  6. Launching proxy ...
  7. 正在验证 proxy 运行状况 ...
  8. 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

  1. Using image registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.4.2
  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 环境的支持。可以更加节省资源。

  1. $ minikube start --no-kubernetes
  2. Darwin 11.6 上的 minikube v1.24.0
  3. MINIKUBE_ACTIVE_DOCKERD=minikube
  4. 自动选择 hyperkit 驱动
  5. Starting minikube without Kubernetes minikube in cluster minikube
  6. Creating hyperkit VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
  7. Done! minikube is ready without Kubernetes!
  8. Done! minikube is ready without Kubernetes!
  9. ╭───────────────────────────────────────────────────────────────────────────────────────╮
  10. Things to try without Kubernetes ...
  11. - "minikube ssh" to SSH into minikube's node. │
  12. │ - "minikube docker-env" to point your docker-cli to the docker inside minikube. │
  13. │ - "minikube image" to build images without docker. │
  14. │ │
  15. ╰───────────────────────────────────────────────────────────────────────────────────────╯

配置 Docker 环境

首先配置 Docker 命令行工具的环境变量

  1. $ eval $(minikube docker-env)

然后就可以利用熟悉的Docker命令行工具快乐地玩耍了

  1. $ docker ps
  2. $ docker images

创建如下的一个Dockerfile

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

构建并运行镜像

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

测试镜像,

  1. $ curl $(minikube ip):8080
  2. Hello World!

注意: Docker暴露出的host端口是在Minikube虚拟机上,所以需要使用minikube ip获得虚拟机所在的IP。Docker Desktop进一步优化了开发者体验,让暴露的端点可以直接映射到本地。

我们如何将本地文件卷挂载到Docker容器中呢? 这个就是有点绕。首先,我们要知道Docker环境是运行在Virtual Machine的虚拟机上,我们需要首先将本地卷,挂载到 Minikube 虚拟机上。

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

然后,我们可以在Docker镜像中挂载Minikube 虚拟机上的卷,并进行访问

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

注意:Docker Desktop在这个场景下也提供了良好的用户体验,让用户忽略底层实现的复杂性。

总结

对于动手能力比较强的开发者,抱着生命不息,折腾不止的态度,不借助 Docker Desktop,也可以进行本地的容器和Kubernetes开发。阿里云团队也为国内开发者提供了良好的网络访问体验。如果大家有问题可以到Github上提Issue.

但是对于普通开发者,Docker Desktop 在开发体验上有很多的优化,每个月 Pro版本 5$ 的价格也就是一杯星巴克咖啡,可以节省一些折腾的时间。

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