云原生必备知识: 容器镜像

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 容器运行时所需要的所有的文件集合称之为容器镜像。

所属技术领域:

云原生

| 名词定义|

容器运行时所需要的所有的文件集合称之为容器镜像。

| 发展历程|

2008年,以Google公司开发人员为主导实现的Linux Container(即LXC)功能在被merge到Linux内核中。LXC是一种内核级虚拟化技术,主要基于Namespaces和Cgroups技术,实现共享一个操作系统内核前提下的进程资源隔离,为进程提供独立的虚拟执行环境,这样的一个虚拟的执行环境就是一个容器。本质上说,LXC容器与现在的Docker所提供容器是一样的。Docker也是基于Namespaces和Cgroups技术之上实现的,Docker的创新之处在于其基于Union File System技术定义了一套容器打包规范,真正将容器中的应用及其运行的所有依赖都封装到一种特定格式的文件中去,而这种文件就被称为镜像(即image),原理见下图(引自Docker官网): 图片.png

图1:Docker镜像原理
自从2013年dotCloud公司(现已改名为Docker Inc)发布Docker容器技术以来,到目前为止已经有四年多的时间了。这期间Docker技术飞速发展,并催生出一个生机勃勃的、以轻量级容器技术为基础的庞大的容器平台生态圈。作为Docker三大核心技术之一的镜像技术在Docker的快速发展之路上可谓功不可没:镜像让容器真正插上了翅膀,实现了容器自身的重用和标准化传播,使得开发、交付、运维流水线上的各个角色真正围绕同一交付物,“test what you write, ship what you test”成为现实。

| 技术特点|

容器镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”

适用场景:

应用打包
制作过RPM、GEM等软件包的同学可能很清楚,每一个软件包依赖于哪个库的哪个版本,
往往需要明确的写在依赖列表里。而依赖又往往分为编译时依赖和运行时依赖。
在传统的基础设施环境下,为了保证所生成的软件包在其它机器上可正常安装且运行,
一般需要在打包之前创建个干净的虚拟机,或者手工创建个chroot环境,
然后在这个干净的环境下安装安全各种依赖包,然后执行打包脚本。
生成软件包以后,需要再创建一个干净的环境安装、运行这个软件包,来验证是否符合预期。
这样虽然也能完成打包工作,但至少有以下缺点:
耗时耗力
依赖关系容易漏掉,比如:在干净的环境中经过多次调试,把缺少的依赖包一个一个的装上了,但最后写spec文件时却忘记添加某个依赖,导致下次打包时需要重新调试或者打包后软件包无法使用等问题。
通过docker可以很好的解决打包问题。具体作法如下:
“干净的打包环境”很容易准备,docker官方提供的ubuntu、centos等系统镜像天生就能作为纯净无污染的打包环境使用
Dockerfile本身能起到文档固化的作用,只要写好Dockerfile,创建好打包镜像,以后就能无限次重复使用这个镜像进行打包
多版本混合部署
随着产品的不断更新换代,一台服务器上部署多个应用或者同一个应用的多个版本在企业内部非常常见。
但一台服务器上部署同一个软件的多个版本,文件路径、端口等资源往往会发生冲突,造成多个版本无法共存的问题。
如果用docker,这个问题将非常简单。由于每个容器都有自己独立的文件系统,所以根本不存在文件路径冲突的问题;
对于端口冲突问题,只需要在启动容器时指定不同的端口映射即可解决问题。
升级回滚
一次升级,往往不仅仅是应用软件本身的升级,通过还会包含依赖项的升级。
但新旧软件的依赖项很可能是不同的,甚至是有冲突的,所以在传统的环境下做回滚一般比较困难。
如果使用docker,我们只需要每次应用软件升级时制作一个新的docker镜像,升级时先停掉旧的容器,
然后把新的容器启动。需要回滚时,把新的容器停掉,旧的启动即可完成回滚,整个过程各在秒级完成,非常方便。
多租户资源隔离
资源隔离对于提供共享hosting服务的公司是个强需求。
如果使用VM,虽然隔离性非常彻底,但部署密度相对较低,会造成成本增加。
docker容器充分利用linux内核的namespaces提供资源隔离功能。
结合cgroup,可以方便的设置某个容器的资源配额。
既能满足资源隔离的需求,又能方便的为不同级别的用户设置不同级别的配额限制。
但在这种应用场景下,由于容器中运行的程序对于hosting服务提供方来说是不可信的,
所以需要特殊的手段来保证用户无法从容器中操作到宿主机的资源(即:越狱,尽管这种问题发生的概率很小,但安全无小事,多一层防护肯定让人更加放心)。
安全及隔离性加固方面,可考虑以下措施:
通过iptables阻断从容器到所有内网IP的通信(当然如果需要也可以针对特定的IP/端口开放权限)2. 通过selinux或者apparmor限制某个容器所能访问的资源3. 对某些sysfs或者procfs目录,采用只读方式挂载4. 通过grsec来加固系统内核5. 通过cgroup对内存、CPU、磁盘读写等资源进行配额控制6. 通过tc对每个容器的带宽进行控制
另外我们在实际测试中发现系统的随机数生成器很容易因熵源耗尽而发生阻塞。
在多租户共享环境下需要在宿主机上启用rng-tools来补充熵源。
这个应用场景下有很多工作是docker本身所不能提供的,并且实施起来需要关注的细节比较多。
为此我们提供了安全加强版docker管理平台,可完美解决以上问题。
需要的朋友可以通过csphere官网了解更多细节。
内部开发环境
在容器技术出现之前,公司往往是通过为每个开发人员提供一台或者多台虚拟机来充当开发测试环境。
开发测试环境一般负载较低,大量的系统资源都被浪费在虚拟机本身的进程上了。
docker容器没有任何CPU和内存上的额外开销,很适合用来提供公司内部的开发测试环境。
而且由于docker镜像可以很方便的在公司内部分享,这对开发环境的规范性也有极大的帮助。
如果要把容器作为开发机使用,需要解决的是远程登录容器和容器内进程管理问题。
虽然docker的初衷是为“微服务”架构设计的,但根据我们的实际使用经验,
在docker内运行多个程序,甚至sshd或者upstart也是可行的。
这方面csphere也有成熟的产品及解决方案,欢迎感兴趣的朋友试用反馈。

资料来源:

  1. 名词定义:https://developer.aliyun.com/lesson_1651_13082?
  2. 发展历程:
    https://zhuanlan.zhihu.com/p/60128631?utm_source=wechat_session&utm_medium=social&utm_oi=1125120119982186496
  3. 技术特点:https://www.cnblogs.com/wuhaidong/articles/10561358.html
  4. 适用场景:https://www.ucloud.cn/yun/26380.html
相关实践学习
通过ACR快速部署网站应用
本次实验任务是在云上基于ECS部署Docker环境,制作网站镜像并上传至ACR镜像仓库,通过容器镜像运行网站应用,网站运行在Docker容器中、网站业务数据存储在Mariadb数据库中、网站文件数据存储在服务器ECS云盘中,通过公网地址进行访问。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
114 1
云原生信息提取系统:容器化流程与CI/CD集成实践
|
10月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
5月前
|
关系型数据库 MySQL Docker
|
5月前
|
Kubernetes Cloud Native 区块链
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
153 0
|
9月前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
498 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
10月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
385 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
10月前
|
存储 人工智能 调度
容器服务:智算时代云原生操作系统及月之暗面Kimi、深势科技实践分享
容器技术已经发展成为云计算操作系统的关键组成部分,向下高效调度多样化异构算力,向上提供统一编程接口,支持多样化工作负载。阿里云容器服务在2024年巴黎奥运会中提供了稳定高效的云上支持,实现了子弹时间特效等创新应用。此外,容器技术还带来了弹性、普惠的计算能力升级,如每分钟创建1万Pod和秒级CPU资源热变配,以及针对大数据与AI应用的弹性临时盘和跨可用区云盘等高性能存储解决方案。智能运维方面,推出了即时弹性节点池、智能应用弹性策略和可信赖集群托管运维等功能,进一步简化了集群管理和优化了资源利用率。
|
9月前
|
监控 安全 Cloud Native
阿里云容器服务&云安全中心团队荣获信通院“云原生安全标杆案例”奖
2024年12月24日,阿里云容器服务团队与云安全中心团队获得中国信息通信研究院「云原生安全标杆案例」奖。
|
10月前
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
本文基于2024云栖大会演讲,探讨了软件供应链攻击的快速增长趋势及对企业安全的挑战。文中介绍了如何利用阿里云容器服务ACK、ACR和ASM构建云原生软件供应链安全,涵盖容器镜像的可信生产、管理和分发,以及服务网格ASM实现应用无感的零信任安全,确保企业在软件开发和部署过程中的安全性。
|
10月前
|
人工智能 Kubernetes Cloud Native
阿里云容器服务,智算时代云原生操作系统
2024云栖大会,阿里巴巴研究员易立分享了阿里云容器服务的最新进展。容器技术已成为云原生操作系统的基石,支持多样化的应用场景,如自动驾驶、AI训练等。阿里云容器服务覆盖公共云、边缘云、IDC,提供统一的基础设施,助力客户实现数字化转型和技术创新。今年,阿里云在弹性计算、网络优化、存储解决方案等方面进行了多项重要升级,进一步提升了性能和可靠性。

相关产品

  • 容器镜像服务