0
点赞
收藏
分享

微信扫一扫

Docker Container容器镜像技术详解

半秋L 2022-03-14 阅读 193


1 Docker架构概述


  • Docker提供了一个开发、打包、运行app的平台
  • 把app和底层infrastructure隔离开来
    Docker Container容器镜像技术详解_docker

Docker Engine


  • 后台进程
  • REST API Server
  • CLI 接口
    Docker Container容器镜像技术详解_vim_02

Docker架构

Docker Container容器镜像技术详解_centos_03

底层技术支持

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

Docker Container容器镜像技术详解_vim_04



dockerimage结构Docker Container容器镜像技术详解_centos_05
从基本的看起,一个典型的 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 中最基础的两层结构
Docker Container容器镜像技术详解_vim_06
不同的 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 一样。
Docker Container容器镜像技术详解_docker_07



2.2 image的获取

image的获取-1

Docker Container容器镜像技术详解_vim_08

image的获取-2

Docker Container容器镜像技术详解_docker_09

Docker Container容器镜像技术详解_centos_10

Docker Container容器镜像技术详解_docker_11

Docker Container容器镜像技术详解_docker_12

3 DIY Base Image

Docker Container容器镜像技术详解_centos_13

Docker Container容器镜像技术详解_docker_14

Docker Container容器镜像技术详解_docker_15

Docker Container容器镜像技术详解_centos_16

Docker Container容器镜像技术详解_vim_17

Docker Container容器镜像技术详解_vim_18

Docker Container容器镜像技术详解_vim_19

Docker Container容器镜像技术详解_docker_20

Docker Container容器镜像技术详解_vim_21

Docker Container容器镜像技术详解_centos_22

容器镜像

Docker Container容器镜像技术详解_centos_23

1 必备常识


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

Docker Container容器镜像技术详解_vim_24

Dockerfile

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

当前无运行的容器

Docker Container容器镜像技术详解_centos_25

docker container ls -a

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

Docker Container容器镜像技术详解_docker_26

CONTAINER ID

IMAGE

COMMAND

CREATED STATUS PORTS NAMES

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

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

Docker Container容器镜像技术详解_vim_27

这时就想要

2 交互式运行容器

docker run -it centos

Docker Container容器镜像技术详解_centos_28

docker container ls -a

现在查看就是 up 状态了

Docker Container容器镜像技术详解_vim_29


  • 现在退出刚才运行的 centos
    Docker Container容器镜像技术详解_centos_30
  • 再次查看容器状态Docker Container容器镜像技术详解_vim_31
  • 可还发现有很多重复的退出的容器 centos,怎么删除重复的呢Docker Container容器镜像技术详解_docker_32
  • 经过一顿​​docker container rm​​即可
    Docker Container容器镜像技术详解_centos_33

3 构建自定义的 Docker image

  • 先进入原 image centos
    Docker Container容器镜像技术详解_docker_34

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

yum install -y yum

安装完成后,退出该 image

Docker Container容器镜像技术详解_centos_35



提交刚才安装过 vim 的新的image
Docker Container容器镜像技术详解_centos_36



可见的确大点Docker Container容器镜像技术详解_vim_37



我们直接见证 image 的变迁历史即可
Docker Container容器镜像技术详解_vim_38



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

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

FROM centos
RUN yum install -y vim

Docker Container容器镜像技术详解_vim_39

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

Docker Container容器镜像技术详解_docker_40

从日志可见中间有个临时中转生成的 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。



举报

相关推荐

0 条评论