zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Docker Container容器镜像技术详解

Docker技术容器镜像 详解 container
2023-09-27 14:19:49 时间

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

image的获取-2
sudo docker pull ubuntu:16.04

官方镜像仓库

3 DIY Base Image

无需再用 sudo 权限




运行结果
vim Dockerfile
docker build -t root/hello-world .

docker run root/hello-world

容器镜像

1 必备常识

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


Dockerfile

FROM scratch
ADD hello /
CMD ["/hello"]
docker container ls

当前无运行的容器

docker container ls -a

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

CONTAINER IDIMAGECOMMANDCREATED STATUS PORTS NAMES
// 如果本地没有,则默认拉取最新的远程镜像
docker run centos

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

这时就想要

2 交互式运行容器

docker run -it centos

docker container ls -a

现在查看就是 up 状态了

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

3 构建自定义的 Docker image

  • 先进入原 image centos

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

yum install -y yum

安装完成后,退出该 image

  • 提交刚才安装过 vim 的新的image

  • 可见的确大点

  • 我们直接见证 image 的变迁历史即可

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

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

FROM centos
RUN yum install -y vim

docker build -t javaedge/centos-vim-new .


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

[+] 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。