01-认识容器:容器的基本操作和实现原理

本文仅作为学习记录,非商业用途,侵删,如需转载需作者同意。

1、运行一个镜像

# docker run -d centos/httpd:latest

解释:
run 表示启动一个容器
-d : daemon的首字母,表示后台运行
centos/httpd:latest : 表示具体启动哪个镜像,默认从dockerhub上下载

镜像就是一个特殊的文件系统,提供了容器中程序执行所需的所有文件

容器中包含应用程序启动需要三类文件:
1、相关的程序可执行文件
2、库文件
3、配置文件

容器运行的时候就不再依赖宿主机上的文件操作系统类型和配置了

2、dockerfile

#cat Dockerfile
FROM centos:8.1.1911
RUN yum install -y httpd
COPY file1 /var/www/html/
ADD file2.tar.gz /var/www/html/
CMD ["/sbin/httpd", "-D", "FOREGROUND"]

解释:
在一个centos基准镜像上安装好httpd的包,把文件拷贝到指定的目录里,最后容器启动后自动运行httpd服务

构建成镜像

# docker build -t registry/httpd:v1 -f ./Dockerfile

-t 指定生成后的镜像的名称
-f 指定dockerfile文件

查看镜像信息

# docker images

查看容器情况

# docker ps

执行命令,查看容器中的情况 c5a9ff78d9c1 是容器的id,是通过docker ps 查看出来的值

# docker exec c5a9ff78d9c1 ps -ef
# docker exec c5a9ff78d9c1 ls /var/www/html

在这里插入图片描述

和虚拟机相比,没有各种复杂的硬件虚拟层,没有独立的Linux内核。
容器所有的进程调度,内存访问,文件的读写都直接跑在宿主机的内核上。

3、容器是什么

容器:Namespace和Cgroups 可以让程序在一个资源可控的独立(隔离)环境中运行

4、Namespace 环境隔离

4.1、容器中和宿主机看到进程PID不同的原因

容器中启动httpd之后,分别在容器中和宿主机上执行 ps -ef 查看进程情况。
发现都有 5个 httpd的进程,最大的不同就是进程的的PID 不一样

在这里插入图片描述

Linux 在创建容器的时候,会建出一个 PID Namespace 。每建立出一个namespace 就会单独对进程进行编号,都是从 1 开始。

不同的Namespace 之间看不到对方的进程,是相互隔离的。

宿主机上的 Host PID Namespace ,是其他Namespace 的父亲。
可以看到宿主机上的所有进程,编号也是把宿主机上的所有进程放在一起进行编号的。

Namespace是一种隔离机制,主要目的是隔离运行在同一个宿主机上的容器,让容器不能彼此访问。

作用:
1、同一个宿主机上可以运行多个容器
2、安全,不同用户之间不能访问对方的资源

Mount Namespace 保证了每个容器都有自己独立的文件目录结构

还有很多其他的Namespace

cgroup、ipc、network、mount、pid、time、user、uts
在这里插入图片描述

Namespace 保障了容器之间的资源隔离,环境隔离。
是实现容器的两大技术之一。

5、Cgroups 资源隔离

支撑容器的第二大技术Cgroups(Control Groups):
对进程的资源进行限制,例如CPU、内存、IO

没有Cgroups 无法对进程的计算机资源消耗进行限制,不同容器之间的进程就会出现相互影响。

Cgroups 有很多个子系统,分别限制不同的资源。

限制方式是类似的:把相关的一组进程分配到一个控制组里,然后通过树状结构进行管理,每个控制组都设有自己的资源控制参数。

一组进程:可以理解为一个容器的所有进程

常见的Cgroups如下:

  • cpu子系统:用来限制一个控制组可使用的最大的CPU
  • memory子系统:用来限制一个控制组最大的内存使用量
  • pids子系统:用来限制一个控制组里可以运行多个进程
  • cpuset子系统:限制一个控制组里的进程可以在哪几个物理CPU上运行

memory子系统说明

每个启动的容器,都会在Cgroups子系统下建立一个目录,这个目录也被叫做控制组。
例如下图中的 <docker-id1> <docker-id2>

通过设置控制组里的cgroup.procs 参数,来限制容器的内存资源

在这里插入图片描述

举例:设置控制组的Memory 的最大用量为2GB
把 (210241024*1024=2147483648) 值写入容器控制组中的 memory.limit_in_bytes 里。
这样设置后 cgroup.procs 里面所有进程 Memory 使用量之和,最大也不会超出 2GB

cd /sys/fs/cgroup/memory/system.slice/docker-xxxxxxxxxxxxxxx.scope/

# 对应容器中的每个进程的ID
# cat cgroup.procs  
20731
20787
20788
20789

# 容器的最大使用量
# cat memory.limit_in_bytes
2147483648

6、Cgroups的v1、v2版本

v1版本
各个子系统比较独立,每个进程在各个Cgroups子系统中独立配置,可以属于不同的group,比较灵活。
缺点:同一进程的资源协调困难(例如 memory Cgroup 与 blkio Cgroup 之间就不能协作)。主流生产环境中用的还是v1

v2版本
使各子系统可以协调统一的管理资源。
需要较新版本的Linux内核。

Namespace 环境隔离
Cgroups 资源隔离

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值