Docker镜像

概念
  • 容器镜像替代传统软件运行之前的环境准备+安装软件阶段
  • 镜像是动态的容器的静态表示,包括容器索要运行的应用代码以及运行时的配置
  • Docker镜像包括一个或多个只读层(read-only layers),因此,镜像一旦创建即不可被修改
  • 容器运行时有一个可写层(writable layer or 容器层container layer),位于只读层之上,任何操作与更新都保存在可写层
  • 因此,容器运行就是通过镜像创建一个实例(同时创建一个可写层),底层的镜像不可修改
镜像概念

container架构

  • 如图所示,Host OS是宿主机操作系统,Docker进程调用操作系统为容器提供服务
  • Guest OS是镜像操作系统,多个容器可以共享同一个镜像(即只读层)
  • Linux发行版包含同一个内核,不同的发行版将各自的userland软件安装在Linux内核上
  • 假设在ubuntu上运行centos容器,则需要从centos获取其userland软件,并运行在Ubuntu内核上,就像是在同一套操作系统上运行不同的userland软件。也因此,Docker不支持在Linux上运行FreeBSD或者Wwindows
    base image与OS的关系
  • docker容器文件系统与host OS是隔离的,容器镜像中的应用该软件无法看到主机文件系统,除非将主机文件系统挂载为容器的卷
  • base image不带Linux内核,也不是base OS,并不包括完整的OS
  • 容器没有虚拟化,而是共享主机上的Linux内核

内核空间与用户空间管理

  • 容器将Linux镜像从内核空间和用户空间进行了分开管理
  • 对于host OS,侧重内核与少量的用户空间
  • 对于Guest OS,侧重(只有)用户空间,包括库文件、编译器、配置文件、以及用户代码
生成镜像
  • 编写Dockerfile,使用docker build创建镜像
  • Dockerfile语法
# 第一行必须为基础镜像
# Usage: FROM [image name]
FROM ubuntu 

# 维护者信息,应放在FROM后面
# Usage: MAINTAINER [name]
MAINTAINER authors_name 

# RUN接收命令并作为参数创建镜像(在commit的层之上形成新的层)
# Usage: RUN [command]
RUN apt-get update 

# 指定运行容器时的用户名或UID
# 临时获取管理员权限用gosu,而不推荐sudo
# Usage: USER [UID]
USER 751

# 创建一个从本地主机或其他容器挂载的挂载点
# 令容器访问宿主机上的目录
# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files", "/app_files"]

# WORKDIR命令用于设置CMD指明的命令的运行目录。
# 格式为 WORKDIR /path/to/workdir 。
# 为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。
# 可以使用多个 WORKDIR 
# 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径
WORKDIR /a 
WORKDIR b 
WORKDIR c 
RUN pwd 
# 最终路径为 /a/b/c 。

# 支持三种格式:
# CMD [“executable” ,”Param1”, “param2”]使用exec执行,推荐
# CMD command param1 param2,在/bin/sh上执行
# CMD [“Param1”, “param2”] 提供给ENTRYPOINT做默认参数。
# 每个容器只能执行一条CMD命令,多个CMD命令时,只最后一条被执行
# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"

# 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持
ENV TZ "Asia/Shanghai"
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8

# ADD有两个参数,源和目标
# usage1:从源系统文件系统上复制文件到目标容器的文件系统
# usage2:如果源是一个URL,那么该资源被下载复制到容器
# usage3:如果文件是可识别的压缩格式,docker会解压缩
# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder 

# COPY 将文件从路径 <src复制添加到容器内部路径 <dest>
COPY <src> <dest>

# 指定在docker允许时指定的端口进行转发
EXPOSE <port>[<port>...]

# 配置容器启动后执行的命令,并且不可被 docker run提供的参数覆盖
# 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中执行)

# ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
ONBUILD
  • 容器镜像包括元数据和文件系统,其中文件系统是指对基础镜像的文件系统的修改,元数据不影响文件系统,只是会影响容器的配置
  • Docker 在需要执行指令时通过创建临时镜像,运行指定的命令,再通过 docker commit 来生成新的镜像
  • Docker 会将中间镜像都保存在缓存中,这样将来如果能直接使用的话就不需要再从头创建了
  • Docker镜像是基于基础镜像的多层叠加,最终构成容器的rootfs根文件系统
  • 创建容器时在基础镜像的容器层之上添加一层可写层,对容器的操作与变化只作用在容器层
  • 通过不拷贝完整的基础镜像,Docker减少了容器所占用的空间,以及减少了容器启动所需时间
COW和镜像大小
  • COW,即copy-on-write技术
  • RUN每次都在保留基础层的同时创建新层,因此新的镜像对文件的操作会更大
  • 为了减少镜像大小,所有文件相关操作,都需要尽可能在一个RUN中运行
镜像的内容
  • docker 镜像中主要就是 tar 文件包和元数据 json 文件
  • docker 镜像的打包过程,其实就是将每一层对应的文件打包过程,最后组成一个单一的 tar 文件
  • docker 镜像的使用过程,其实就是将一层层的 tar 文件接包到文件系统的过程
引用博文
  • https://www.cnblogs.com/sammyliu/p/5877964.html
  • https://www.jianshu.com/p/5f4b1ade9dfc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值