Docker 镜像

2019-03-07  本文已影响0人  萧何爱英语

典型的 Linux 文件系统

bootfs(bootfilesystem)

rootfs(rootfilesystem)

对于不同的 Linux 发行版,bootfs 基本是一致的,但 rootfs 会有差别

Docker 的文件系统如何启动

Linux

Docker

AUFS

AUFS 是一种 Union File System,所谓 UnionFS 就是把不同物理位置的目录合并 mount 到同一个目录中。UnionFS 的一个最主要的应用是,把一张CD/DVD 和一个硬盘目录给联合 mount 在一起,然后,你就可以对这个只读的 CD/DVD 上的文件进行修改(当然,修改的文件存于硬盘上的目录里)

AUFS 是将多个目录合并成一个虚拟文件系统,成员目录称为虚拟文件系统的一个分支(branch),每个 branch 可以指定 readwrite/whiteout-able/readonly 权限,只读(ro),读写(rw),写隐藏(wo)。一般情况下,aufs 只有最上层的 branch 具有读写权限,其余 branch 均为只读权限。只读 branch 只能逻辑上修改,AUFS 每层branch 可以动态的增加删除,每增加一层,下层默认置为 ro,最上一层为 rw。删除 branch 是在 aufs 挂载点移除,并未删除挂载目录

AUFS 的文件读写与删除

当需要修改一个文件,而该文件位于低层 branch时,顶层 branch 会直接复制低层 branch 的文件至顶层再进行修改,而低层的文件不变,这种方式即是 CoW 技术(写复制),AUFS 默认支持 Cow 技术,当容器删除一个低层 branch 文件时,只是在顶层 branch 对该文件进行重命名并隐藏,实际并未删除文件,只是不可见,这种方式即 AUFS 的whiteout(写隐藏)

Docker 中的 AUFS

Docker 镜像(Image)是由一个或多个 AUFS branch 组成,并且所有的 branch 均为只读权限。简单来说,AUFS 所有 robranch 按照一定顺序堆积构成 Docker Image 镜像
在运行容器的时候,创建一个 AUFS branch 位于image 层之上,具有 rw 权限,并把这些 branch 联合挂载到一个挂载点下。这就是 Docker 能够一个镜像运行多个容器的原理所在

写时复制(Copy-on-Write)

AUFS 的好处

镜像的定义

镜像(Image)就是一堆只读层(read-only layer)的统一视角
从左边我们看到了多个只读层,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。这些层是 Docker 内部的实现细节,并且能够在主机(译者注:运行 Docker 的机器)的文件系统上访问到。统一文件系统(union file system)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角

镜像与分层

  1. Docker 镜像是多个的,堆叠的分层的只读文件系统
  2. 每一层的变化是基于下一层的
  3. 相邻层之间的改动是有延续性的
  4. 从 docker 1.10 之后,每个镜像层的由一致性的 hash 生成 id,取代了旧版使用随机生成的 UUID
FROM ubuntu:15.10
COPY . /app
RUN make /app
CMD python /app/app.py

镜像命名规则

registry.abc.net/orgname/imagename:tag

docker.io/oracle/mysql:v5.7.1
k8s.gcr.io/kube-apiserver-amd64:v1.11.0

小心 latest,千万别被 latest tag 给误导了。latest 其实并没有什么特殊的含义。当没指明镜像
tag 时,Docker 会使用默认值 latest,仅此而已,所以我们在使用镜像时最好还是避免使用 latest,明确指定某个 tag,比如 httpd:2.3

容器的定义

Dockerfile

dockerfile

FROM debian
RUN apt-get install emacs
RUN apt-get install apache2
CMD ["/bin/bash"]
  1. 新镜像不再是从 scratch 开始,而是直接在 Debian base 镜像上构建
  2. 安装 emacs 编辑器
  3. 安装 apache2
  4. 容器启动时运行 bash

构建过程如下图所示:


Dockerfile 是 docker 构建镜像的基础,也是 docker区别于其他容器的重要特征,正是有了 Dockerfile,docker 的自动化和可移植性才成为可能

编写Dockerfile命令:
FROM:从一个基础镜像构建新的镜像

MAINTAINER:维护者信息

RUN:非交互式运行shell命令

ENV:设置环境变量

WORKDIR /path/to/workdir:设置工作目录

USER:设置用户ID

VOLUME <#dir>:设置volume

EXPOSE:暴露哪些端口

ENTRYPOINT [‘executable’, ‘param1’,’param2’]:执行命令

CMD [“param1”,”param2”]

注意:

Dockerfile 例子

Dockerfile Best Practices

Docker 镜像实操演示

参考 03 Docker 镜像实操演示

上一篇 下一篇

猜你喜欢

热点阅读