M1 和 Docker 谈了个恋爱
出于开源项目的需要,我准备把之前在 windows 下运行的开源项目移植到 Mac 上跑得试下,但是 Mac M1 芯片并不能很好地支持 Docker,这不,发现 Docker 也正式
支持 Mac 了,M1 看了 Docker 的芳容,竟悄悄爱上了 Docker。
本文主要内容如下:
一、官宣
1.1 官宣版
之前 Docker 只支持在 Intel 芯片的 X86 架构上运行,Docker 已经正式支持苹果 M1 芯片了,而 M1 芯片是 ARM 架构的,所以说 Docker 真的是太强大了,短短几个月就适配了苹果最新的系统!
这不就是官宣 Docker 帅哥要追 M1 妹纸么?
悟空到官网上看了下,2021-04-15 发布的正式版:Docker Desktop 3.3.1,而且可以直接下载。
这个 Desktop 包含很多功能:
- Docker Engine
- Docker CLI client
- Docker Compose
- Notary
- Kubernetes
- Credential Helper
另外在 M1 上运行 Docker 还有些条件需要满足。
1.2 要求
因为 M1 比较前卫,所以需要安装 Rosetta 软件来进行兼容。
必须安装 Rosetta ,因为某些二进制文件仍是Darwin / AMD64。要从命令行手动安装Rosetta 2,请运行以下命令:
softwareupdate --install-rosetta
Docker 官方有望在将来的版本中修复此问题。
1.3 磨合
Docker 和 M1 还有许多地方需要磨合:
- 并不是所有镜像都可以用于 M1 的 ARM64 架构,比如 mysql 镜像就不适合。但可以通过使用 mariadb 镜像来解决此问题。
我试了下,确实没有合适的 mysql 镜像。
- 由于QEMU有时无法运行容器,因此在 Apple Silicon计算机上运行基于Intel的容器可能会导致崩溃。我们建议您在Apple Silicon计算机上运行 ARM64 容器。与基于Intel的容器相比,这些容器还更快并且使用的内存更少。
ping
从容器内部到 Internet 的连接无法正常工作。要测试网络,我们建议使用curl
或wget
。- 当TCP流半关闭时,用户有时可能会遇到数据丢失的情况。
二、手拉手
2.1 左手拉右手
之前在 Linux 环境安装 Docker 是通过命令行安装的,但是在 Mac 上有客户端可以使用,确实方便很多。安装 Mac 版的 Docker非常方便,下载完成后的文件名叫做 Docker.dmg。双击文件后,弹出如下界面,把 Docker.app 图标拖到右边 Appliactions 就可以了,就像左手拉右手
。
Docker 帅哥成功牵手 M1。
安装完成后,在应用程序中找到 Docker,双击打开就可以了。
接着就可以看到 Docker 在菜单栏中有显示。
2.2 启动容器
打开的界面,会提示没有容器正在运行,客户端提示执行以下命令启动一个新的容器。
docker run -d -p 80:80 docker/getting-started
我们将命令拷贝到控制台后运行,如下图所示:
然后我们来check 下容器是否创建和启动成功。通过以下命令来查看 docker 容器的运行状态。
docker ps
我们同样可以通过 Docker 客户端来查看容器状态:容器正在运行中,对应的端口号是 80。如下图所示:
另外我们也可以看下有哪些镜像已经下载好了,如下图所示,目前有一个镜像:docker/getting-started。
2.3 Intel & Apple
我们打开活动监视器,可以看到打开的 docker 进程既有 Apple 架构的,也有 Intel 架构的,比如桌面 UI 用的是 Intel 架构的,但 Docker 核心应用程序用的 Apple 架构,说明虽然有部分用的 Intel 架构,但核心还是 Apple 架构,不影响使用。
再来看下内存使用情况,12 个进程,总共占用 430 M 内存,说明占用的内存并不高,性能还是可以的。
三、暖男
Docker 客户端还有一系列人性化的配置,优质暖男一枚。来看下有什么配置吧。
3.1 通用偏好设置
Docker 客户端,有很多人性化的通用设置。如下图所示:
- 自动检查更新:默认情况下,Docker Desktop配置为自动检查较新版本。如果您作为组织的一员安装了Docker Desktop,则可能无法自己更新 Docker Desktop。在这种情况下,请将您现有的组织升级为团队计划,然后清除此复选框以禁用自动检查更新。
- 登录时启动 Docker Desktop:打开会话时自动启动Docker Desktop。
- 在 Time Machine 备份中包括 VM:选择此选项以备份 Docker Desktop 虚拟机。默认情况下未勾选此选项。
- 使用 gRPC FUSE 进行文件共享:清除此复选框可改用旧版 osxfs 文件共享。
- 发送使用情况统计信息:Docker Desktop发送诊断、崩溃报告和使用情况数据。此信息可帮助Docker 改善应用程序并进行故障排除。
- 显示每周提示:显示有关使用Docker的有用建议。
- 启动时打开 Docker Desktop 仪表板:启动 Docker Desktop 时自动打开仪表板。
3.2 资源高级配置
还有些关于资源的高级配置也非常强大,来瞧一瞧吧。
- CPU:默认情况下,Docker Desktop设置为使用主机上可用处理器数量的一半。要提高处理能力,请将其设置为更高的数字。
- 内存:默认情况下,Docker Desktop设置为使用
2
GB运行时内存,该内存是从Mac上的总可用内存分配的。要增加RAM,请将其设置为更大的数字,如果要减少它,请降低数字。 - 交换:根据需要配置交换文件的大小,默认值为1 GB。
- 磁盘映像大小:指定磁盘映像的大小。
- 磁盘映像位置:指定Linux卷的容器和映像的存储位置。
3.3 K8S
Docker Desktop 竟然直接支持 kubernets(K8S) ,太酷了吧!
Docker Desktop 包含一个可在 Mac 上运行的独立 Kubernetes 服务器,因此可以测试在Kubernetes上部署 Docker 的工作负载。要启用Kubernetes支持并安装作为Docker容器运行的Kubernetes独立实例,请选择Enable Kubernetes。
还有很多非常有用的功能,这里就不一一介绍了,感兴趣的可以到官网上查看哦~
Docker 对于 M1 来说,绝对是优质暖男一枚!实锤了!
四、约会
说了 Docker 的那么多优点,M1 终于愿意和 Docker 谈恋爱了,他们第一个约会活动
就是实战 Redis。
4.1 下载 Redis 镜像
先让 Docker 下载个 Redis 镜像试下:
sudo docker pull redis
我们可以通过 Docker 客户端来看下镜像是否下载成功,如下图所示,确实下载成功。另外也可以通过命令 docker ps 查看。
4.2 启动 Redis
- 启动 redis
docker run -d -p 6379:6379 redis
4.3 连接redis
docker exec -it <容器 id> redis-cli
需要通过 docker ps 找到 redis 容器 id,我的机器上运行的 redis 容器 id 是 17c...,命令中可以简写,只要能识别这个容器就可以。
连接成功后,会进入到 redis 命令行。
4.4 测试 Redis
设置a=100,返回OK
set a 100
获取a的值,返回"100"
get a
说明 docker 在 M1 上 完美运行 Redis。
另外我的开源项目中要用 Elasticsearch 和 Kibana,但是都没有适配的镜像,这就很难受了啊!
看来 Docker 和 M1 还有很长的路要走,谈恋爱磕磕碰碰
很正常,需要磨合
的还有很多,但悟空相信他们最终一定会走到一起,并过上幸福的日子~
参考资料:
www.passjava.cn
https://github.com/Jackson0714/PassJava-Platform
https://docs.docker.com/docker-for-mac/apple-silicon
M1 和 Docker 谈了个恋爱的更多相关文章
- 和redis谈一场恋爱(第二天约会了解彼此)
最近使用了Memcache,带来的便利已经让我欣喜若狂.开启了另一种又快又好的方式存储和读取数据.中间经过了一番折腾,学习了mysql,终于有学到了redis. Redis的全名是Remote Dic ...
- 和redis谈一场恋爱(第一天邂逅)
前几天玩了下Memcache,发现挺好用.知道redis是Memcache的妹妹.我本着大公无私和博大的胸怀,看着redis孤零零的躺在角落里,委实觉得可怜.心里总有个声音在说,你既然已经爱上了Mem ...
- 对大一新生开始学习C语言课程谈几点看法
大家好,首先祝贺大家进入了大学,迈入了大学的校门,也意味着开始了新的征程,希望大家能够有一个美好的大学四年. 先做下自我介绍,我叫李帅阳,(大家可以称呼我 李老师,或是班助,或是...)这是在邹欣老师 ...
- [Linux容器]当我们谈容器的时候,我们在谈什么
Docker在当下很火,那么,当我们谈Docker,谈容器的时候,我们在谈什么? 或者说,你对Docker,对容器了解吗?容器,到底是怎么一回事儿? 这篇文章着重来讲一下Linux容器,为什么强调Li ...
- 追MM的各种算法
原文:http://blog.sae.sina.com.cn/archives/3542#more-3542 看到一篇文章把算法描述的相当的好,先收藏了! 动态规划 基本上就是说:你追一个MM的时候, ...
- 【管理心得之三十二】PMP杂谈---------爱情必胜术
这次一反常态,没有场景设计,我想借此文普及一下PMP是什么? 但我不知道这样枯燥的话题能否能引起你的兴趣,我不得不套用“标题党”<爱情必胜术>来博你眼球. 我真没有说谎,此文是献给那些孤身 ...
- 算法实质【Matrix67】
动态规划 :你追一个MM的时候,需要对该MM身边的各闺中密友都好,这样你追MM这个问题 就分解为对其MM朋友的问题,只有把这些问题都解决了,最终你才能追到MM. 因此,该问题适用于聪明的MM,懂得“看 ...
- barabasilab-networkScience学习笔记6-evolving networks
第一次接触复杂性科学是在一本叫think complexity的书上,Allen博士很好的讲述了数据结构与复杂性科学,barabasi是一个知名的复杂性网络科学家,barabasilab则是他所主导的 ...
- [转载] 散列表(Hash Table) 从理论到实用(下)
转载自: 白话算法(6) 散列表(Hash Table) 从理论到实用(下) [澈丹,我想要个钻戒.][小北,等等吧,等我再修行两年,你把我烧了,舍利子比钻戒值钱.] ——自扯自蛋 无论开发一个程序还 ...
随机推荐
- 简单比较 @EnableEurekaClient 和 @EnableDiscoveryClient 两个注解
@EnableEurekaClient 和 @EnableDiscoveryClient 都是让eureka发现该服务并注册到eureka的注解 相同点: 它们都能让注册中心Eureka发现 , 并将 ...
- Vue脚手架中默认的margin怎么清除
问题情景:开发中发现我的项目四周有白边,但是并没有设置样式 问题原因:vue脚手架中静态文件夹public中的index.html造成的 解决方案:找到vue脚手架中index.html页面,设置ma ...
- 简单&&大数取模
Big Number Problem Description As we know, Big Number is always troublesome. But it's really importa ...
- 后端程序员之路 44、Redis结合protobuf
protobuf序列化速度不错,在往Redis里存对象时,用protobuf序列化可以节省内存,省去写序列化反序列化代码的工作. google protocol buffer 与 redis 结合使用 ...
- 大括号之谜:C++的列表初始化语法解析
有朋友在使用std::array时发现一个奇怪的问题:当元素类型是复合类型时,编译通不过. struct S { int x; int y; }; int main() { int a1[3]{1, ...
- WPF 基础 - Binding 的源与路径
1. 源与路径 把控件作为 binding 源与 binding 标记拓展: 控制 Binding 的方向及数据更新: Binding 的路径 Path: 没有路径的 Binding: 为 Bindi ...
- Go语言中利用append巧妙的删除slice切片中的元素
package main import ( "fmt" ) //删除函数 func remove(s []string, i int) []string { return appe ...
- css盒布局-省份选择盘的实现
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- BeautifulSoup爬取微博热搜榜
获取url 设定请求头 requests发出get请求 实例化BeautifulSoup对象 BeautifulSoup提取数据 import requests 2 from bs4 import B ...
- Spring 声明式事务与编程式事务详解
本文转载自IBM开发者论坛:https://developer.ibm.com/zh/articles/os-cn-spring-trans 根据自己的学习理解有所调整,用于学习备查. 事务管理对于企 ...