1 docker 架构
K8S:CRI(Container Runtime Interface)
Client: 客户端;操作docker服务器的客户端(命令行或者界面)
Docker_Host:Docker主机;安装Docker服务的主机
Docker_Daemon:后台进程;运行在Docker服务器的后台进程
Containers:容器;从镜像创建的运行实例.可以被启动, 开始, 停止, 删除.每个容器都是互相隔离的. 也可以把容器看作是一个简易的linux系统(包括root用户权限,进程空间, 用户空间,网络空间等)和运行在其中的应用程序.
Images:镜像、映像、程序包;Image是只读模板,其中包含创建Docker容器的说明。容器是由Image运
行而来,Image固定不变。
Registries:仓库;存储Docker Image的地方。官方远程仓库地址:https://hub.docker.com/search
2 Docker隔离原理
namespace 6项隔离 (资源隔离)
实际上,Linux 内核实现 namespace 的一个主要目的就是实现轻量级虚拟化(容器)服务。在同一个 namespace 下的进程可以感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,认为自己置身于一个独立的系统中,从而达到隔离的目的。也就是说 linux 内核提供的 namespace 技术为 docker 等容器技术的出现和发展提供了基础条件。
我们可以从 docker 实现者的角度考虑该如何实现一个资源隔离的容器。比如是不是可以通过 chroot 命令切换根目录的挂载点,从而隔离文件系统(Mount)。为了在分布式的环境下进行通信和定位,容器必须要有独立的 IP、端口和路由等,这就需要对网络进行隔离(Network)。同时容器还需要一个独立的主机名以便在网络中标识自己(UTS)。接下来还需要进程间的通信(IPC)、用户权限(User)等的隔离。最后,运行在容器中的应用需要有进程号(PID),自然也需要与宿主机中的 PID 进行隔离。也就是说这六种隔离能力是实现一个容器的基础,下面是linux提供的能力:
cgroups资源限制 (资源限制)
cgroup提供的主要功能如下:
资源限制:限制任务使用的资源总额,并在超过这个 配额 时发出提示
优先级分配:分配CPU时间片数量及磁盘IO带宽大小、控制任务运行的优先级
资源统计:统计系统资源使用量,如CPU使用时长、内存用量等
任务控制:对任务执行挂起、恢复等操作
group资源控制系统,每种子系统独立地控制一种资源。功能如下:
Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。
基础的小linux系统。jdk;一般而言,Dockerfile可以分为四部分:基础镜像信息, 维护者信息, 镜像操作指令, 启动时执行指令。
指令 | 说明 |
---|---|
指令 | 说明 |
FROM | 指定基础镜像 |
NAINTAINER | 指定维护着信息,已经过时,可以使用LABEL maintainer=xxx来替代 |
RUN | 运行命令v |
CMD | 指定启动容器时默认的命令 |
ENTERPOINT | 指定镜像的默认入口,运行命令 |
EXPOSE | 声明镜像内服务监听的端口 |
ENV |
指定环境变量。可以在docker run 的时候使用-e改变,会被固化到image的config里面 |
ADD | 复制指定的src路径下的内容到容器中的dest路径下,src可以为url会自动下载,可以为tar文件会自动解压 |
COPY | 复制本地主机的src路径下的内容到镜像中的dest路径下,但不会自动解压。 |
LABEL | 指定生成镜像的元数据标签信息 |
VOLUME | 创建数据卷挂载点 |
USER |
指定运行容器时的用户名或者UID |
WORKERFDIR | 配置工作目录,为后续的RUN、CMD、ENTERPOINT指定配置工作目录 |
ARG |
指定镜像内使用的参数,可以在build的时候,使用--build-args改变 |
OBBUILD | 配置当创建的镜像作为其他镜像的基础镜像时,所指定的创建操作命令 |
STOPSIGNAL | 容器退出的信号值 |
HEALTHCHRCK | 健康检查 |
SHELL | 指定使用shell时的默认shell类型 |