docker原理----镜像

相关概念

  • 镜像是容器的运行基础,容器是镜像运行后的形态。
  • 镜像是一个包含程序运行必要依赖环境和代码的只读文件,镜像的本质是磁盘上一系列文件的集合。创建新的镜像其实也就是对已有镜像文件进行增、删、改操作。说白了就是一个分层的文件系统
  • 容器就是一套程序运行的虚拟环境,镜像就是用来构建虚拟环境的模板。同一个镜像,可以构造出多个相互独立,但是运行环境一样的容器。

结构原理

  • 镜像的最底层是一个称为启动文件系统(bootfs)的镜像,bootfs的上层镜像叫作根镜像(rootfs),通常情况下是一个操作系统,如Ubuntu、CentOS等。用户的镜像必须构建于根镜像之上。
  • 镜像的原理与Git相似,由于Docker的这种文件层叠共享机制(本层镜像可以引用上一层镜像中的文件),才使得镜像占用磁盘空间小、扩展容易。
  • 写时复制机制:通过docker run命令指定镜像创建一个容器时,实际上是在该镜像之上创建一个空的可读写文件系统层级。可将这个文件系统当成一个新的临时镜像,而命令里所指定的镜像称为父镜像。父镜像的内容都是以只读方式挂载进来的,容器会读取共享父镜像的内容。不过一旦需要修改父镜像文件,Docker会从父镜像中复制这个文件到临时镜像中来(也就是最上层的容器),所有的修改均发生的文件系统中,而不会对父镜像造成任何影响,这就是Docker镜像的写时复制机制。用户可以通过commit命令保存该临时镜像所做的修改,从而形成一个真正的镜像。
  • 存储位置
  1. 查看/var/lib/docker/
    在这里插入图片描述

常用命令

  • docker images 列出本机所有的镜像

查看镜像

名称说明
REPOSITORY仓库名称,用来存放同类型的镜像
TAG用于区分同一仓库中的不同镜像
IMAGE ID每个镜像都有长为64位的HashID,用来全网标识一个镜像。该字段只展示前面一部分,因为这一部分已经足以在本机唯一标识一个镜像了
CREATED镜像的创建时间
VIRTUAL SIZE镜像所占用的虚拟大小,该大小包含了所有共享文件的大小
  • docker inspect *** 获取镜像的详细信息
    元数据

构建镜像

commit

  • 类似git的代码提交,需要将修改提交到本地仓库中,才会生成一个全新的镜像
  • docker commit -m="commit Message" --author="daq" 0ddf83b837fe daiaoqi/sqlite3:v1

DockerFile

  • 使用Dockerfile来构建镜像。是把对镜像进行的所有操作全部写到一个名为DockerFile的文件中,然后使用docker build 命令从这个文件中创建镜像。这种方法可以使镜像的创建变得透明和独立化,并且创建过程可以被重复执行。
  • DockerFile示例
# Version: 1.0.1
FROM ubuntu:latest
MAINTAINER xxh "xxh@qq.com"
#设置root用户为后续命令的执行者
USER root
#执行操作
RUN apt-get update
RUN apt-get install -y nginx
#使用&&拼接命令
RUN touch test.txt && echo "abc" >> abc.txt
#对外暴露端口
EXPOSE 80 8080 1038
#添加文件
ADD abc.txt /opt/
#添加文件夹
ADD /webapp /opt/webapp 
#添加网络文件
ADD https://www.baidu.com/img/bd_logo1.png /opt/
#设置环境变量
ENV WEBAPP_PORT=9090
#设置工作目录
WORKDIR /opt/
#设置启动命令
ENTRYPOINT ["ls"]
#设置启动参数
CMD ["-a", "-l" ]
#设置卷
VOLUME ["/data", "/var/www"]
#设置子镜像的触发操作
ONBUILD ADD . /app/src
ONBUILD RUN echo "on build excuted" >> onbuild.txt
  • 各参数的含义
名称说明
FROM指定待扩展的父级镜像。文件开头必须是一个FROM指令,接下来的指令便在这个父级镜像的环境中运行,直到遇到下一个FROM指令。通过添加多个FROM命令,可以在同一个Dockerfile文件中创建多个镜像
MAINTAINER声明创建镜像的作者信息
RUN用来修改镜像的命令,常用来安装库、程序以及配置程序。一条RUN指令执行完毕后,会在当前镜像上创建一个新的镜像层,接下来的指令会在新的镜像上继续执行
EXPOSE指明容器内进程对外开放的端口,多个端口之间使用空格隔开
ADD向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件,也可以是一个文件
VOLUME该命令会在镜像里创建一个指定路径(文件或文件夹)的挂载点,这个路径可以来自主机或者其他容器。多个容器可以通过同一个挂载点共享数据,即便其中一个容器已经停止,挂载点也仍然可以访问,只有当挂载点的容器引用全部消失时,挂载点才会自动删除
WORKDIR为接下来执行的指令指定一个新的工作目录,这个目录可以是绝对目录,也可是相对目录。根据需要,WORKDIR可以被多次指定。当启动一个容器时,最后一条WORKDIR指令所指的目录将作为容器运行的当前工作目录
ENV设置容器运行的环境变量。在运行容器的时候,通过-e参数可以修改这个环境变量值,也可以添加新的环境变量
CMD用来设置启动容器时默认运行的命令,启动容器,也跟着启动容器中的程序
USER为容器的运行及接下来RUN、CMD、ENTRYPOINT等指令的运行指定用户或UID。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值