Docker 公司于 2021-08-31 宣布 Docker Desktop 对大型组织来说将不再是一个免费产品。为此我们需要寻找一个可以方便替换 Docker Desktop
且对我们工作影响较小的工具,如 minikube,Hyperkit,podman。
版权声明:本文为博主 xwi88 的原创文章,遵循 CC BY-NC 4.0 版权协议,禁止商用,转载请注明出处,欢迎关注 https://github.com/xwi88
术语说明
- Docker Inc 一家总部设在美国的公司,开发了一些开源和非开源软件,这让开发、测试和在容器中运行应用更容易。
- Docker Engine Docker 背后的核心技术。它是一个作为守护进程运行在 Linux 上的开源软件,使在 Linux 内核上运行容器成为可能。它负责容器的生命周期和容器可以访问的物理资源(计算、内存、存储)的隔离。这个引擎可以在物理或者虚拟机上运行,但是它只能在 Linux 内核上运行,也就是说,在任何 Linux 风格的操作系统上。理解这一点很重要。Docker 引擎只能在 Linux 上运行。
- Docker CLI CLI 通常被开发人员用来与 docker 引擎交互。这包括
docker
和 docker-compose
命令。再次强调,这是一款开源软件。
- Docker Desktop 由于 Docker Engine 只能在 Linux 上运行,使用 Windows 和 macOS 进行软件开发的开发人员只有在启动运行 Linux 的虚拟机(VM)之后才能运行该引擎。这就是 Docker Desktop 的用武之地。Docker Desktop 是一个专有软件,它允许 Windows/macOS 开发者在开发环境中无缝地使用容器技术,而无需管理操作 VM 的复杂性和随之而来的所有细节(网络、虚拟化、 linux 知识等)。Docker Desktop 是为了在软件开发过程中使用而设计的,它在类似于生产环境的容器中不起作用,在这种环境中只有
Docker Engine
参与。
技巧
继续在 macOS 上运行和构建容器应用程序的方法是在 Linux VM
上运行 Docker Engine
。
环境要求
环境安装
如果确定以后不需要在 docker desktop
中运行 image,请删除所有 docker
docker desktop
相关的配置。
示例
推荐 Homebrew 方式安装
1
2
3
4
5
|
brew install docker
brew install docker-compose # 根据需要,可选安装
brew install hyperkit
brew install minikube
|
技巧
如果通过 brew 安装 minikube
失败,可以尝试手动安装
1
2
|
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube
|
检查安装
执行 which minikube
警告
brew 方式安装后执行 which minikube
,如果失败可执行以下命令
1
2
|
brew unlink minikube
brew link minikube
|
remove the old minikube links and link the newly installed binary
Drivers 说明
minikube
在 mac/windows
下启动需要依赖 Linux VM
,这里也就是我们配置的 driver,如果配置 --driver=docker
则需要安装相应版本的 Docker Desktop
借助已安装的 linux vm
。
否则需要选择其他,具体支持的 drivers 参考如下:
Linux
- Docker - container-based (preferred)
- KVM2 - VM-based (preferred)
- VirtualBox - VM
- None - bare-metal
- Podman - container (experimental)
- SSH - remote ssh
macOS
- Docker - VM + Container (preferred)
- Hyperkit - VM
- VirtualBox - VM
- Parallels - VM
- VMware Fusion - VM
- SSH - remote ssh
Windows
- Hyper-V - VM (preferred)
- Docker - VM + Container (preferred)
- VirtualBox - VM
- VMware Workstation - VM
- SSH - remote ssh
警告
如果配置了 --driver=docker
需要区分 standard
, rootless
docker
Standard Docker
1
2
3
4
5
6
7
8
|
# need: install Docker 18.09 or higher
# amd64 or arm64 system.
# Start a cluster using the docker driver:
minikube start --driver=docker
# To make docker the default driver:
minikube config set driver docker
|
Rootless Docker
1
2
3
4
5
6
7
|
# Requirements
# Docker 20.10 or higher, see https://rootlesscontaine.rs/getting-started/docker/
# Cgroup v2 delegation, see https://rootlesscontaine.rs/getting-started/common/cgroup2/
dockerd-rootless-setuptool.sh install -f
docker context use rootless
minikube start --driver=docker --container-runtime=containerd
|
The --container-runtime
flag must be set to containerd
or cri-o
.
更多 drivers
配置及用法请查看: minikube drivers
配置命令
minikube config SUBCOMMAND [flags] [options]
minikube config help
minikube config defaults PROPERTY_NAME [flags]
list displays all valid default settings for PROPERTY_NAME
minikube config view [flags]
Display values currently set in the minikube config file.
minikube config set PROPERTY_NAME PROPERTY_VALUE [flags]
Sets an individual value in a minikube config file
minikube config get PROPERTY_NAME [flags]
Returns the value of PROPERTY_NAME from the minikube config file
minikube config unset PROPERTY_NAME [flags]
unsets PROPERTY_NAME from the minikube config file.
技巧
minikube config --help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
config modifies minikube config files using subcommands like "minikube config set driver kvm2"
Configurable fields:
* driver
* vm-driver
* container-runtime
* feature-gates
* v
* cpus
* disk-size
* host-only-cidr
* memory
* log_dir
* kubernetes-version
* iso-url
* WantUpdateNotification
* WantBetaUpdateNotification
* ReminderWaitPeriodInHours
* WantNoneDriverWarning
* WantVirtualBoxDriverWarning
* profile
* bootstrapper
* insecure-registry
* hyperv-virtual-switch
* disable-driver-mounts
* cache
* EmbedCerts
* native-ssh
Available Commands:
defaults Lists all valid default values for PROPERTY_NAME
get Gets the value of PROPERTY_NAME from the minikube config file
set Sets an individual value in a minikube config file
unset unsets an individual value in a minikube config file
view Display values currently set in the minikube config file
Usage:
minikube config SUBCOMMAND [flags] [options]
Use "minikube <command> --help" for more information about a given command.
Use "minikube options" for a list of global command-line options (applies to all commands).
|
示例
1
2
3
4
5
6
7
8
9
10
11
|
minikube config set driver hyperkit
minikube config set cpus 2
minikube config set memory 2000mb
minikube config set disk-size 20gb
# insecure-registry 测试未生效, 启动时指定!
minikube config set insecure-registry https://docker.mirrors.ustc.edu.cn,https://reg-mirror.qiniu.com,https://mirror.ccs.tencentyun.com
# minikube config set kubernetes-version <>
# The name of the minikube VM being used. This can be set to allow having multiple instances of minikube independently. (default "minikube")
minikube config set profile
|
快捷启动
1
2
3
4
5
6
7
8
9
10
11
|
minikube start # minikube start --container-runtime=docker
# Tell Docker CLI to talk to minikube's VM
eval $(minikube docker-env)
# Save IP to a hostname
# echo "`minikube ip` docker.local" | sudo tee -a /etc/hosts > /dev/null
# control panel, must start minikube with cluster model, without flag --no-kubernetes
minikube dashboard
# stop kubernetes related
minikube pause
# test
docker run hello-world
|
高级启动
commands start
启动命令
- 某些配置更新后需要执行:
minikube delete
然后重新启动
示例
minikube start --driver=hyperkit
或 minikube start --driver=docker
或其他驱动
推荐使用类似配置,后续不用进入 minikube vm
修改相关配置,主要配置:
--insecure-registry
--registry-mirror
--mount
挂载本地主机目录到 minikube vm
- 当前 MacOS 下,默认将挂载
/Users:/minikube-host/
- 挂载路径最好保持完全一致,避免程序有路径依赖而无法正常启动
- 建议使用
--mount-string
按需挂载
--mount-string
指定挂载目录
--no-kubernetes
--cpus
--memory
--image-mirror-country
minikube start --no-kubernetes --registry-mirror=https://docker.mirrors.ustc.edu.cn,https://reg-mirror.qiniu.com,https://mirror.ccs.tencentyun.com --mount /var/lib/minikube:/var/lib/docker
如果要使用 minikube dashboard,可这样启动:
minikube start --cpus=2 --memory=2000mb \ --registry-mirror=https://docker.mirrors.ustc.edu.cn,https://reg-mirror.qiniu.com,https://mirror.ccs.tencentyun.com
Tell Docker CLI to talk to minikube’s VM: eval $(minikube docker-env)
eval $(minikube docker-env)
可以直接配置到对应 shell 如: ~/.zshrc
或 ~/.bashrc
中,以避免每次输入
可能出现的问题
警告
如果你在 Docker Desktop
基础上启动 minikube
,直接借助它的 vm
及配置。由于资源限制,可能导致无法正常启动 minikube
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
😄 minikube v1.24.0 on Darwin 12.2.1
✨ Using the docker driver based on existing profile
⛔ Docker Desktop only has 1986MiB available, you may encounter application deployment failures.
💡 Suggestion:
1. Click on "Docker for Desktop" menu icon
2. Click "Preferences"
3. Click "Resources"
4. Increase "Memory" slider bar to 2.25 GB or higher
5. Click "Apply & Restart"
📘 Documentation: https://docs.docker.com/docker-for-mac/#resources
❗ You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.
👍 Starting minikube without Kubernetes minikube in cluster minikube
|
minikube delete
调整 docker 资源后,删除重建,重新启动即可
1
2
3
|
🔥 Deleting "minikube" in docker ...
🔥 Removing ~/.minikube/machines/minikube ...
💀 Removed all traces of the "minikube" cluster.
|
启动后环境检查
示例
启动命令: minikube start --no-kubernetes --insecure-registry=https://docker.mirrors.ustc.edu.cn,https://reg-mirror.qiniu.com,https://mirror.ccs.tencentyun.com
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
minikube v1.24.0 on Darwin 10.15.7
▪ MINIKUBE_ACTIVE_DOCKERD=minikube
✨ Using the hyperkit driver based on user configuration
👍 Starting minikube without Kubernetes minikube in cluster minikube
🔥 Creating hyperkit VM (CPUs=2, Memory=2000MB, Disk=20480MB) ...
🏄 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. │
│ │
╰───────────────────────────────────────────────────────────────────────────────────────╯
|
eval $(minikube docker-env)
让 Docker CLI 与 minikube’s VM 交互
技巧
Add this line to .bash_profile
or .zshrc
or … if you want to use minikube’s daemon by default (or if you do not want to set this every time you open a new terminal).
docker info
查看我们现在终端的 docker 信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
Kernel Version: 4.19.202
Operating System: Buildroot 2021.02.4
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.894GiB
Name: minikube
ID: STNM:GBUS:PMHK:ASTU:BZHZ:WIEY:L6F3:YOMH:M432:S5XK:PAT5:IU2D
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
provider=hyperkit
Experimental: false
Insecure Registries:
reg-mirror.qiniu.com
docker.mirrors.ustc.edu.cn
mirror.ccs.tencentyun.com
10.96.0.0/12
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
|
新打开一个终端查看本机(未卸载 docker desktop 机器,仅做对比) docker info
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
Kernel Version: 5.10.76-linuxkit
Operating System: Docker Desktop
OSType: linux
Architecture: x86_64
CPUs: 3
Total Memory: 4.083GiB
Name: docker-desktop
HTTP Proxy: http.docker.internal:3128
HTTPS Proxy: http.docker.internal:3128
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://registry-1.docker.io/
https://hub-mirror.c.163.com/
https://mirror.baidubce.com/
https://registry.cn-hangzhou.aliyuncs.com/
https://docker.mirrors.ustc.edu.cn/
https://mirror.ccs.tencentyun.com/
https://registry.docker-cn.com/
https://reg-mirror.qiniu.com/
https://dockerhub.azk8s.cn/
|
镜像源修改
不建议进入 minikube 环境做此修改,建议在启动时指定参数进行配置: minikube start --image-mirror-country='cn'
等参数, 详见 minikube start 或 高级启动
示例
minikube ssh
连入 minikube node
sudo mkdir -p /etc/docker
创建 docker 目录
vi /etc/docker/daemon.json
修改配置
daemon.json
daemon.json 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
{
"registry-mirrors": [
"https://registry-1.docker.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://registry.cn-hangzhou.aliyuncs.com",
"http://f1361db2.m.daocloud.io",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.ccs.tencentyun.com",
"https://registry.docker-cn.com",
"https://reg-mirror.qiniu.com",
"https://dockerhub.azk8s.cn"
]
}
|
sudo systemctl daemon-reload
sudo systemctl restart docker
Dashboard
minikube dashboard
示例
minikube start --driver=hyperkit --cpus=2 --memory=2000mb --registry-mirror=https://docker.mirrors.ustc.edu.cn,https://reg-mirror.qiniu.com,https://mirror.ccs.tencentyun.com
minikube dashboard
目录挂载
This will start the mount daemon and automatically mount files into minikube.
minikube mount <local directory>:<host directory>
映射/挂载关系: 本地主机 volumes
<->docker desktop VM volumes
<->docker container volumes
Driver 默认挂载路径
Some hypervisors, have built-in host folder sharing. Driver mounts are reliable with good performance, but the paths are not predictable across operating systems or hypervisors:
Driver |
OS |
HostFolder |
VM |
VirtualBox |
Linux |
/home |
/hosthome |
VirtualBox |
macOS |
/Users |
/Users |
VirtualBox |
Windows |
C://Users |
/c/Users |
VMware Fusion |
macOS |
/Users |
/mnt/hgfs/Users |
KVM |
Linux |
Unsupported |
|
HyperKit |
Linux |
Unsupported (see NFS mounts) |
|
These mounts can be disabled by passing –disable-driver-mounts to minikube start.
本机应用启动
如果你使用了目录映射,则必须开启挂载,且一定要注意挂载路径,否则会出现文件或者配置找不到问题。
文件或配置找不到
警告
原因:
- 使用
docker desktop
时,自动帮我们做了映射:本地主机 volumes
<->docker desktop VM volumes
<->docker container volumes
- 当我们使用
minikube
在本地运行 docker run
或 docker-compose up
实际相当于在 minikube vm
中运行,但是 minikube vm
中无本地本机的源码映射
解决方案
在本地本机进行工作目录映射/挂载:
minikube mount $HOME/workspace:$HOME/workspace
- minikube vm 内部映射路径一定要注意: 挂载路径务必与实际路径保持一致
- 注意目录权限问题,正常挂载当前用户目录不涉及权限问题
- 可设置挂载多个目录
技巧
可将你的源码放在一个统一的工作目录,这样方便挂载及代码查找,目录结构参考如下:
$HOME/workspace
源码工作空间,可整个挂载
$HOME/workspace/git.company.com
公司源码工作空间,仅公司代码
$HOME/workspace/github.com
github 源码工作空间
$HOME/workspace/gitee.com
开机启动
--mount --mount-string=$HOME/workspace:$HOME/workspace
可能存在问题,推荐启动后用命令 minikube mount
挂载
仅挂载当前项目目录
- 优: 挂载目录少,占空间较小
- 缺: 如果切换项目需要重新挂载,太过麻烦
尽量挂载整个工作目录(注意控制规模),切换项目不用额外操作
1
2
3
4
5
6
7
8
|
# --mount --mount-string=$HOME/workspace:$HOME/workspace
#minikube delete
minikube start --no-kubernetes --driver=hyperkit --cpus=2 --memory=2gb --disk-size=20gb \
--image-mirror-country=cn \
--registry-mirror=https://docker.mirrors.ustc.edu.cn,https://reg-mirror.qiniu.com,https://mirror.ccs.tencentyun.com
eval $(minikube docker-env)
minikube mount ${PWD}:${PWD}
|
挂载整个工作目录
1
2
3
4
5
6
7
8
9
|
# issues here {单独 --mount 将挂载: /Users:/minikube-host/; --mount-string 仅挂载指定目录,此时不需要添加 --mount, 推荐方式}
# --mount --mount-string=$HOME/workspace:$HOME/workspace
#minikube delete
minikube start --no-kubernetes --driver=hyperkit --cpus=2 --memory=2gb --disk-size=20gb \
--image-mirror-country=cn \
--registry-mirror=https://docker.mirrors.ustc.edu.cn,https://reg-mirror.qiniu.com,https://mirror.ccs.tencentyun.com
eval $(minikube docker-env)
minikube mount ${HOME}/workspace:${HOME}/workspace
|
挂载整个工作目录且后台运行
1
2
3
4
5
6
7
8
|
# --mount --mount-string=$HOME/workspace:$HOME/workspace
#minikube delete
minikube start --no-kubernetes --driver=hyperkit --cpus=2 --memory=2gb --disk-size=40gb \
--image-mirror-country=cn \
--registry-mirror=https://docker.mirrors.ustc.edu.cn,https://reg-mirror.qiniu.com,https://mirror.ccs.tencentyun.com
eval $(minikube docker-env)
nohup minikube mount ${HOME}/workspace:${HOME}/workspace &
|
注意事项
- minikube 启动后配置
eval $(minikube docker-env)
- minikube 启动后挂载目录 应用启动目录挂载问题
- 启动时指定
--driver
,如果是 docker
务必确保 docker daemon
已运行
- 如果启动参数 mount 设置错误,则需要
minikube mount --kill
,且 minikube vm
移出相应目录
minikube delete 不用每次都运行
更多
参考