IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> docker 最小镜像(scratch:latest)与golang程序结合,从零构建后端镜像 -> 正文阅读

[系统运维]docker 最小镜像(scratch:latest)与golang程序结合,从零构建后端镜像

docker 最小镜像(scratch:latest)

一、简介:

Scratch镜像很赞,它简洁、小巧而且快速,它没有bug、安全漏洞、延缓的代码或技术债务。除了被Docker添加了metadata (译注:元数据为描述数据的数据)之外,它基本上是空的。

我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像。优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包。

如果我们的需求是在构建一个符合我们实际业务需求的Docker镜像的前提下,确保镜像尺寸尽可能的小,应该怎么做呢?

思路是使用空镜像scratch,可以说是真正的从零开始构建属于自己的镜像

二、跨越平台:从零开始

我们知道,构建镜像的过程一般都是从父镜像开始的,但父镜像依赖于指令集架构。所以有没有可能我们跨越平台架构来构建精简的镜像呢?那就需要用到scratch了。

为镜像进一步减重,减到尽可能的小,把所有不必要的东西都拆掉:仅仅保留能支撑我们应用运行的必要库,命令,其余的一律不纳入目标镜像。
当然不仅仅是Size上的原因,小镜像还有额外的优势,比如:内存占用小,启动速度快,更加高效;因为它不包含额外不必要的工具,所以它更安全,不会因为其他不必要的工具、库的漏洞而被攻击,减少了“攻击面”。

scratch构建镜像精简到可以只在scratch上面加一层可执行的二进制文件。

三、容器镜像结构原理

  1. scratch:docker 中最基础的镜像,可以简单的理解为 kernel ,debian、ubuntu 和 centos 等都基于 scratch 之上
  2. base:不依赖其他镜像,从 scratch 构建,base镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS等;其他镜像(nginx\tomcat)可以之为基础进行扩展

四、Linux 操作系统由内核空间和用户空间组成

  1. 内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉。
  2. 用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录。
  3. 对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。
  4. base 镜像只是在用户空间与发行版一致,kernel 版本与发型版是不同的。
  5. 如果 本机系统为是 Ubuntu 16.04,内核为kernel:4.x.x,那么在 CentOS7 容器中使用的实际是是本机 4.x.x 的 kernel。

五、使用方法

1、制作大小为0 的镜像
	tar cv --files-from /dev/null | docker import - scratch
2、编译go程序
	CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags " -w" -o ./sg-admin main.go
3、编写 Dockerfile文件
	macbook:01 houchaoyue$ cat Dockerfile
		FROM scratch
		ADD admin /
		CMD ["/admin"]
4、生成对应的容器镜像
	macbook:01 houchaoyue$ docker build -t sg-admin:v1 .
5、运行容器即可
	docker run --name sg-admin -d sg-admin:v1

注意事项:
1)在构建二进制可执行文件的时候,需要进行静态编译链接,因为scratch中没有我们需要的动态链接库
2) 在 macbook 中只能编译时只能指定 linux 系统才能正常使用
3)如果你的Go应用程序需要子处理用到其他程序(例如,git)或者它几乎使用任何使用CGo的库(这些库几乎总是依赖于libc,如果不是其他库),则此方法将不起作用。

用途
1)scratch 是一个空镜像,使用docker 把main 函数拉起来,服务小,做升级,降级,版本管理的优势大。
2)选择scratch的最大原因是安全性-减少攻击面。

遇到的问题:
1、不需要使用rootfs也可运行golang编译的二进制文件。
虽然 macOS 内核结合了微内核(Mach)和宏内核(BSD)的特性,但 Linux 只是一个宏内核。宏内核负责管理 CPU、内存、进程间通信、设备驱动程序、文件系统和系统服务调用( LCTT 译注:原文为 system server calls,但结合 Linux 内核的构成,译者认为这里翻译成系统服务调用更合适,即 system service calls)。容器运行使用的是本机的宏内核,在宏内核之上可运行rootfs,rootfs中存在的是一些常见的使用命令,因此可运行go程序

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:36:42  更:2021-08-25 12:39:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:21:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码