Docker Container容器镜像技术详解

2021-02-23 15:14:07 浏览数 (1)

1 Docker架构概述

  • Docker提供了一个开发、打包、运行app的平台
  • 把app和底层infrastructure隔离开来

Docker Engine

  • 后台进程
  • REST API Server
  • CLI 接口

Docker架构

底层技术支持

Namespace:做隔离 pid、net、ipc、mnt、uts Control groups:做资源限制 Union file systems:Container 和 image 的分层

2 Docker Image概述

  • 文件和meta data的集合( root filesystem )
  • 分层的,并且每一层都可添加改变
  • 删除文件,成为一个新的image
  • 不同image可共享相同的layer
  • image 本身是 read-only
  • dockerimage结构

从基本的看起,一个典型的 Linux 文件系统由 bootfs 和 rootfs 两部分组成,

  • bootfs(boot file system) 主要包含 bootloader 和 kernel,bootloader 主要用于引导加载 kernel,当 kernel 被加载到内存中后 bootfs 会被 umount 掉
  • rootfs (root file system) 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件
  • docker image 中最基础的两层结构

不同的 linux 发行版(如 ubuntu 和 CentOS ) 在 rootfs 这一层会有所区别,体现发行版本的差异性。 传统的 Linux 加载 bootfs 时会先将 rootfs 设为 read-only,然后在系统自检之后将 rootfs 从 read-only 改为 read-write,然后就可在 rootfs 上进行读写操作了 但 Docker 在 bootfs 自检完毕之后并不会把 rootfs 的 read-only 改为 read-write,而是利用 union mount(UnionFS 的一种挂载机制)将 image 中的其他的 layer 加载到之前的 read-only 的 rootfs 层之上,每一层 layer 都是 rootfs 的结构,并且是read-only 的。所以,我们是无法修改一个已有镜像里面的 layer 的!只有当我们创建一个容器,也就是将 Docker 镜像进行实例化,系统会分配一层空的 read-write 的 rootfs ,用于保存我们做的修改。一层 layer 所保存的修改是增量式的,就像 git 一样。

2.2 image的获取

image的获取-1

image的获取-2

3 DIY Base Image

容器镜像

1 必备常识

  • 通过Image创建( copy )
  • 在Image layer(只读)之上建立一个container layer (可读写)
  • 可类比OOP:类和实例 image 相当于一个类,container 就是每个实例
  • Image负责app的存储和分发,Container负责运行app

Dockerfile

代码语言:javascript复制
FROM scratch
ADD hello /
CMD ["/hello"]
代码语言:javascript复制
docker container ls

当前无运行的容器

代码语言:javascript复制
docker container ls -a

显示所有运行和已退出的容器

CONTAINER ID

IMAGE

COMMAND

CREATED STATUS PORTS NAMES

代码语言:javascript复制
// 如果本地没有,则默认拉取最新的远程镜像
docker run centos

但如果直接这么运行,直接就退出了,啥也看不到。

这时就想要

2 交互式运行容器

代码语言:javascript复制
docker run -it centos
代码语言:javascript复制
docker container ls -a

现在查看就是 up 状态了

  • 现在退出刚才运行的 centos
  • 再次查看容器状态
  • 可还发现有很多重复的退出的容器 centos,怎么删除重复的呢
  • 经过一顿docker container rm即可

3 构建自定义的 Docker image

  • 先进入原 image centos

由于本身没有 vim,我们正好安装下

代码语言:javascript复制
yum install -y yum

安装完成后,退出该 image

  • 提交刚才安装过 vim 的新的image
  • 可见的确大点
  • 我们直接见证 image 的变迁历史即可

但不推荐这种创建新 image 的方式,因为别人不知道这个 image 到底经历了啥,即是否安全呢?

所以我们就常通过创建 Dockerfile 文件明晰 image 变化。

代码语言:javascript复制
FROM centos
RUN yum install -y vim
代码语言:javascript复制
docker build -t javaedge/centos-vim-new .

从日志可见中间有个临时中转生成的 image,最后完成时被删除。

代码语言:javascript复制
[ ] Building 20.9s (6/6) FINISHED
 => [internal] load .dockerignore                                                                                                   0.0s
 => => transferring context: 2B                                                                                                     0.0s
 => [internal] load build definition from Dockerfile                                                                                0.0s
 => => transferring dockerfile: 77B                                                                                                 0.0s
 => [internal] load metadata for docker.io/library/centos:latest                                                                    0.0s
 => [1/2] FROM docker.io/library/centos                                                                                             0.0s
 => => resolve docker.io/library/centos:latest                                                                                      0.0s
 => [2/2] RUN yum install -y vim                                                                                                   20.3s
 => exporting to image                                                                                                              0.5s
 => => exporting layers                                                                                                             0.5s
 => => writing image sha256:6fa5d61ccad62a224b2fd2d8d8526aa52bc12f42c6b27ab31e7df1f62768705d                                        0.0s
 => => naming to docker.io/javaedge/centos-vim-new                                                                                  0.0s

所以以后直接分享 Dockerfile 即可,别人拿到文件就能创建自己想要的 image。

0 人点赞