为什么会有容器?

前言

每项技术的出世都是有原因的,都是为了解决问题。所以了解它所要解决的问题,对学习这项技术将事半功倍。下面就谈谈容器产生的背景,所要解决的问题。

下面说的是根据我自己的理解,可能会有问题,欢迎指正!

虚拟机和容器的区别

很多人都会有这个疑问。有这个问题的大多是对于虚拟机和容器所解决问题理解不到位导致的。按我的理解,虚拟机是在解决这样的问题:避免资源浪费、充分使用资源、方便、统一管理。

以前每人一台个人计算机,随着CPU算力、内存、存储性能等持续上升,通常个人绝对用不了尤其是对于大型服务器。其次每人一台实体设备,设备数量越来越多,对于管理和运维成本直线上升等等原因促使了虚拟化技术。通过虚拟化技术将物理机虚拟出多个虚拟机,每个虚拟机使用物理机的资源,每个虚拟机都是独立的操作系统,对用户来说和个人计算机没有任何区别。

对于容器,只说一句就能准确知道它的不同之处:容器运行起来后只是系统中的一个进程。这个进程之所以和其他进程看上去不一样(其实都是一样的)是因为这个进程在独立的资源里面运行,比如:在系统中运行的所有进程都是共享CPU的,内核来切换进程来使得进程使用CPU,而容器是使用系统中独立的资源,这个资源是从宿主机隔离出来的。也就是容器是为了隔离而产生的,在宿主机中隔离出一块独立的区域来运行进程。通过资源隔离和限制技术,如Linux中的namespace、cgroup等将CPU、内存、文件系统、网络从宿主机中隔离出来单独使用,避免受到影响。由于容器的运行环境都是由容器运行时(容器服务如dockerd,从系统中隔离抽象出来的运行环境)决定的,也就方便了容器的迁移,因为容器的运行时都是由容器服务来控制的,保证了跨平台运行。

容器的优势

(1)资源隔离和限制:使用namespace实现文件系统、网络、进程、用户的隔离。使得容器看上去就是一个独立的系统,不会和宿主机或者其他容器混在一起。使用cgroup来实现容器使用资源的限额。

(2)易于大规模部署和迁移:由于容器是在容器运行时(如docker)上运行的,相当于是在操作系统上抽象了一层,使得程序对系统的依赖减弱了很多,这样对迁移很友好,其次容器相对独立,部署起来很简单。

(3)易于持续集成和版本控制:直接使用容器作为程序的版本控制的基本单位。kubernetes、docker compose等容器编排系统的使用,可以进一步提升生产力。

镜像

【下面的示例都以CentOS下的docker容器为例】

镜像和容器的区别

镜像和容器都是文件系统,不同的是镜像是可读了而容器是可读写的。

一个镜像就是一个只读文件,这个文件是分层结构,docker支持通过扩展现有镜像来创建新的镜像。docker hub中99%的镜像都是通过在其他已有镜像的基础上安装和配置所需软件创建出来的。使用镜像创建容器后,其实是在镜像最上面加了一个可读写的容器层。容器运行期间都在容器层修改。

可以使用如下命令来查看镜像历史:

docker history --no-trunc 镜像id

 如下图可以看到,镜像是一层一层叠加上去的,每一层通过CREAYED_BY中的命令创建

镜像的来源

上面说了99%的镜像都是在基础镜像上制作的,那么第一个基础镜像是什么?我想第一个基础镜像是docker官方提供的。我们平时只会在其他镜像上去创建我们自己的镜像。

我们平时使用的基础镜像来自于:公共镜像仓库(如:docker官方的docker hub)或者 自己搭建的私有镜像仓库。

镜像的制作方式

(1)基于已有的容器创建

将容器层加到镜像中,从而形成新的镜像。

# 基于已有镜像的容器创建
# 使用docker commit [options] container repository:tag 
# 已有容器ID: a8715620937
# 在容器中进行修改后,提交为一个新镜像
docker commit -m "change" a8715620937 myhub:5000/test:1.0
# 之后可以推到私有仓库或者公有仓库

(2)基于本地模板文件创建

 # 基于本地模板文件创建
 # 使用docker import [options] file | url | - repository:tag 命令创建
 # 已有本地模板文件:centos_aaa.tar
 docker import centos_aaa.tar myhub:5000/test:1.0
 # 之后可以推到私有仓库或者公有仓库

(3)基于dockerfile创建

# 基于dockerfile创建
# dockerfile是一个文本格式的配置文件,用户使用 dockerfile来快速创建自定义的镜像
# 基本结构
# dockerfile 有一行一行命名语句组成,支持 以 “#” 开头的注释行
# dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行命令
# 使用 docker build -t repository:tag -f dockerfile  path 命令创建
# 已有:btmsys_base_image dockerfile文件
cat btmsys_base_image

docker build -t myhub:5000/btmsys/base:1.0 -f btmsys_base_image .

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值