Docker学习笔记1 —— 基础概念

最近开发部署用到Docker,在同事的帮助下实现了基本应用,做到了知其然,但并不知其所以然。趁着这两天有点空闲,赶紧找资料恶补基础知识。接下来准备以学习笔记的形式,将一些有用的知识记录下来。

1. 镜像Image

镜像是一个特殊的文件系统。它提供了容器中程序执行需要的所有文件,包括程序的可执行文件、库文件和配置文件。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的root文件系统。容器运行的时候不再依赖宿主机上的文件操作系统类型和配置,可以做到一次配置,到处运行。

2. 容器Container

容器和镜像的关系,可以简单理解为面向对象程序涉及中类和类的实例的关系一样,镜像是静态的定义,容器是镜像运行的实体。容易可被创建、删除、启动、停止、暂停。

3. Dockerfile

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"]

上面这个Dockerfile执行的操作为:从一个centos:8.1.1911的基础镜像安装httpd,然后将对外提供的文件file1和file2.tar.gz拷贝到httpd服务的配置目录下,最后指定容器启动后自动启动的httpd服务。

编辑好Dockerfile之后,可通过docker build来构建镜像:

docker build -t registery/httpd:v1 -f ./Dockerfile .

其中,-t指定镜像名称,格式为“name:tag”, -f指定构建镜像所需的Dockerfile。构建完成后,可通过docker images来查看构建出来的镜像信息。

4. Namespace和Cgroup

我们构建好镜像之后,就可以通过镜像启动一个容器。从用户角度来看,容器和一台独立的机器或者虚拟机没有什么太大的区别,但是它和虚拟机相比,却没有各种复杂的硬件虚拟层,没有独立的 Linux 内核。容器所有的进程调度,内存访问,文件的读写都直接跑在宿主机的内核之上。容器的这种独立运行环境是如何实现的呢?这就 要用到Namespace和Cgroup这两个核心概念了。

Namespace

Namespace 是 Linux 中实现容器的两大技术之一,它的作用是保证容器的相互隔离。Namespace作为一种隔离机制,主要目的是隔离运行在同一个宿主机上的不同容器,让这些容器彼此之间不能互相访问资源。这样的隔离有两个作用,一是可以充分地利用系统资源,使得一台宿主机上可以运行多个用户的容器;二是保证安全性,使得不同容器之间不会互相访问和干扰。

Docker提供了6中Namespace,包括:(1) PID Namespace,负责隔离不同容器的进程;(2) Network Namespace,负责隔离网络环境;(3) Mount Namespace,隔离文件系统;(4) UTS Namespace,隔离主机名和域名;(5) IPC Namespace,隔离信号量、消息队列和共享内存;(6) User Namespace,负责隔离用户和用户组。

拿PID Namespace来说,Linux 在创建容器的时候,会创建出一个 PID Namespace,在这个Namespace中,对PID单独进行编号,编号从1开始。两个不同容器中的Namespace是相互独立的,从一个容器中无法看到另一个容器中的进程编号。但是,如果我们从宿主机上去查询PID,会看到所有的进程号,包括容器中的进程号,但是从宿主机上看到的同一个进程的进程号,和在容器中看到的是不一样的,它是把运行在宿主机上的所有进程放在一起,统一进行编号。

Cgroups

Cgroups就是Control Groups,可以对指定的进程做各种资源的限制,比如限制 CPU 的使用率,内存使用量,IO 设备的流量等等。

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

例如,CPU子系统,用来限制容器里所有进程可使用的最大CPU数量,Memory子系统用来限制容器里所有进程的最大内存使用量,PIDs子系统用来限制容器里最多运行多少个进程,另外还有cpuset 子系统,用来限制一个容器里的进程可以运行在哪几个物理 CPU 上。

举个例子,Memory Cgroups可以用来限制内存使用量,如果我们要设置最大内存使用量为2G,则可以设置控制组(可以理解为容器)中的memory.limit_in_bytes数值为 2147483648(2* 1024 * 1024 * 1024),设置完成后,该容器中的所有进程使用的内存总量就不超过2G了。

文章参考:

docker教程:https://www.runoob.com/docker/docker-tutorial.html

极客时间《容器实战高手课》

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值