多平台镜像使用场景

我们知道Docker镜像是支持多平台(不同的操作系统/架构)的,比如linux/amd64,linux/arm64,linux/riscv64等,当我们需要在不同平台使用容器运行我们的镜像的时候,通常可能会考虑分别编译各个平台的镜像文件,然后打上不同的tag用来区分平台,使用的时候也同样需要根据实际运行的平台在配置文件中选择不同的tag,这样就导致配置文件无法良好的共用,使用起来相当的不方便。

多平台镜像就是解决此问题的一个方案,那么什么是多平台镜像呢?我们以MySQL的官方镜像为例(Docker Hub上的大多数Docker官方镜像都提供了多平台镜像)

1.png

可以看到,该镜像支持在linux/amd64和linux/arm64平台下运行,通过执行相同的命令docker pull mysql:8.0获取镜像,docker会自动根据manifest的描述找到并下载适合当前系统架构的镜像文件。

如此,便可以在多个平台之间共用同一份配置文件,而无需多余的处理,是不是方便很多呢?


如何构建多平台镜像

接下来介绍两种构建多平台镜像的方法

方法一(推荐)

此方法需要开启docker的containerd-snapshotter特性

开启containerd-snapshotter

修改/etc/docker/daemon.json文件,添加

1
2
3
"features": {
"containerd-snapshotter": true
}

2.png

重启docker服务

注意:开启该配置以后,会导致原来下载的镜像文件被隐藏,开启和关闭该配置情况下的镜像文件是隔离存储的(OrbStack下验证)

OrbStack在设置里面的Docker功能页添加

Docker Desktop也可以参考https://docs.docker.com/desktop/containerd/

阅读全文 »

0

Serverless

Serverless 是一种云计算模型,它使开发人员能够构建和运行应用程序,而无需关心底层的服务器基础设施。在传统的应用程序开发中,开发人员需要管理服务器的配置、扩展和维护等任务。而在 Serverless 模型中,这些任务都由云服务提供商来处理,开发人员只需专注于编写应用程序的业务逻辑。

Serverless 模型适用于许多应用场景,如 Web 应用程序、移动后端、数据处理和物联网等。常见的 Serverless 平台包括:
国外:AWS Lambda、Azure Functions 和 Google Cloud Functions等
国内:阿里云的函数计算 FC,腾讯云的云函数

本文以阿里云的函数计算FC为例(阿里云每个月有免费的额度)

Cloudflare

Cloudflare 是一家提供云计算和网络安全服务的公司。它提供了一系列的网络基础设施和安全功能,帮助网站和应用程序提供更快的加载速度、增强的安全性和高可靠性。

Cloudflare 的核心服务包括:CDN(内容分发网络),DDOS 保护,Web 应用程序防火墙(WAF),DNS服务,TLS 加密和边缘计算等。

本文需要使用到其中的DNS服务TLS加密服务

应用准备

首先要准备好应用的部署文件,云服务厂商一般支持通过文件上传和容器镜像的方式进行部署。
如果是文件上传的方式部署,还需要选择运行环境,不同厂商支持的运行环境有所不同,需要提前了解好。
而镜像的方式就比较简单,只需要提供打包好的镜像即可。
所以个人推荐使用镜像的方式,这样可以拥有对运行环境完整的控制权,也方便版本管理。

本文接下来也将以镜像方式部署举例,其中镜像为已开源的一个微信聊天机器人项目

阅读全文 »

安装前准备

确保本地已经安装并启动好了Docker Desktop

拉取k8s镜像(如果本地网络好可以正常拉取到k8s官方镜像,可以跳过这一步)

克隆git仓库到本地

1
git clone https://github.com/gotok8s/k8s-docker-desktop-for-mac.git

进入项目目录,执行

1
./load_images.sh

等待所有镜像拉取完成
1.png

部署k8s

进入Docker Decktop的设置页面,勾选Kubernetes设置页的配置,点击右下角的Apply & Restart按钮,等待k8s完成部署
2.png

完成以后可以验证一下部署状态

1
2
3
4
5
kubectl cluster-info

kubectl get nodes

kubectl describe node
阅读全文 »

本文涉及以下内容

  • 开启NMT查看JVM内存使用情况
  • 通过pmap命令查看进程物理内存使用情况
  • smaps查看进程内存地址
  • gdb命令dump内存块

背景

最近收到运维反馈,说有项目的一个节点的RSS已经是Xmx的两倍多了,因为是ECS机器所以项目可以一直运行,幸亏机器内存充足,不然就可能影响到其他应用了。

排查问题

通过跳板机登录到目标机器,执行top命令,再按c,看到对应的进程所占用的RES有8个多G(这里当时忘记截图了),但是实际上我们配置的Xmx只有3G,而且程序还是正常运行的,所以不会是堆占用了这么多,于是就把问题方向指向了非堆的内存。

首先想到通过Arthas查看内存分布情况,执行dashboard命令,查看内存分布情况

1

发现堆和非堆的内存加起来也就2个G不到,但是这里看到的非堆只包含了code_cache和metaspace的部分,那有没有可能是其他非堆的部分有问题呢?

阅读全文 »

学习背景

近些年,如果你是一名开发,那么Docker这个热门的技术名词你一定听说过,我也不例外,但是因为平时没接触过,所以一直都没动力去了解使用。最近在折腾自己维护在github上的项目的时候,发现项目所依赖的外部环境比较多,比如zookeeper、redis、elasticsearch等等,如果都安装一遍的话比较麻烦,而且因为是自己整理平时积累用的项目,对数据也没什么要求,只要有这样一个环境能保证项目运行起来就行了。第一时间想到的就是利用docker容器,这样自己不但可以顺便学习一下这个热门技术,还可以把搭建成果作为这个项目的一部分让有兴趣研究的项目关注者直接在接触到这个项目的时候可以快速把环境搭建起来,可谓是一举两得。

有兴趣的朋友可以访问项目地址:https://github.com/MartinDai/SpringBoot-Project


安装 Docker Desktop

参考 https://www.docker.com/get-started,安装并启动后就可以使用下面的这些命令了

docker 命令

查看docker版本

docker --version

查看当前docker版本,可以顺便验证docker是否安装成功且启动好了

1

查看帮助

docker --help

查看docker命令帮助,包含所有支持的操作命令使用规则及简介

2

还可以看某个指令的详细帮助,如:docker images --help,docker所有命令都可以在最后加上--help来查看该命令的使用帮助

阅读全文 »
0%