做项目迟早要学的Docker技术(2)

上一篇讲了一些有关docker的基础知识,这一篇继续深入学习一下其他重要的知识

1 镜像

上一篇中说到过镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,包含了运行某个软件所需的所有内容:代码、运行时、库、环境变量、配置文件。

1.1 UnionFs

UnionFs(联合文件系统)是一种分层、轻量级、高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加。UnionFs是docker镜像的基础。
一个镜像中一次同时加载多个文件系统,但从外面看起来智能看到一个文件系统,通过联合加载,可以把各层文件系统叠加起来最终统一形成镜像。
通俗说生成一个镜像就像是套娃的过程,一层套一层最终呈现出来的就是镜像,而这种一层一层的形式就是由UnionFs构成的
举一个例子,平时我们正常下载一个tomcat用不了多少空间,但是下载一个docker镜像可能会很大,这就是因为这个镜像中可能不止包含着tomcat还有其他一层套一层的东西
在这里插入图片描述
使用这种分层结构的好处:
共享资源,并且镜像的所有层都可以被共享。假如多个镜像都是由同一个base镜像构建而来,那么宿主机就只需要保存一份base镜像,运行时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务。

1.2 镜像加载原理

上一点说到镜像是一层一层构建起来的,其中主要的就是bootfs和rootfs这两层
在这里插入图片描述

  • bootfs(boot file system):看到boot这个单词就应该能很快联想到和启动有关的东西。这一层就是用来加载内核的
  • rootfs(root file system):可以理解为选择不同的操作系统发行版
    综上所述,可以拿Linux举一个例子。bootfs是用来加载Linux内核的,rootfs是用来选择你的Linux是Ubuntu还是centos

这也就能理解为什么下载Ubuntu的虚拟机镜像需要很多G,而下载docker镜像只需要几百M:虚拟机镜像是完全模拟了一台机器,而docker只是一个精简版的系统,底层直接适用宿主机的内核,rootfs也只需要包含基本的命令、工具和程序库即可。

2 容器数据卷

2.1 简介

简单说有时候容器运行产生的数据需要保存下来,如果不保存的话当删除容器后其中发数据也就消失了,类似于断电后内存的数据消失一样。容器数据卷就类似于硬盘,可以用来持久化保存容器运行的内容和共享数据(类似windows局域网的共享文件夹)。

特点:

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 生命周期一直持续到没有容器使用为止

2.2 添加容器数据卷

  • 命令添加
    docker run -it -v /宿主机绝对路径:/容器内路径 镜像名
    带权限(只读):docker run -it -v /宿主机绝对路径:/容器内路径:ro 镜像名
  • DockerFile添加
    使用VOLUME指令添加一个或多个数据卷,但只能在容器内建立,无法自己指定宿主机的路径,但可通过docker inspect查看容器信息中找到
    VOLUME[容器内路径1"", “容器内路径2”]

3 DockerFile

3.1 简介

DockerFile是用来构建镜像的文件,由一系列指令和参数组成。类似于Linux的shell脚本

使用步骤:

  1. 手动编写一个DockerFile文件
    每条指令都必须是大写并且至少跟随一个参数(具体内容,不能空指令)
    指令按照从上到下的顺序依次执行
    注释用 # 表示
    每一条指令都会创建一层镜像层并进行commit,从而实现一层层叠加
  2. 执行docker build命令生成镜像
  3. 执行docker run命令生成容器

3.2 DockerFile执行流程

  1. docker从基础镜像运行一个容器,也就是必须指名一个祖先镜像,类似于Java中所有类都继承object类
  2. 执行一条指令并对容器作出更新
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚刚提交的镜像运行一个新容器
  5. 执行下一条指令直到所有指令都执行完毕

3.3 指令

指令作用
FROM基础镜像,指名当前镜像基于哪个镜像
MAINTAINER提供镜像作者的姓名和邮箱
RUN构建容器时需要运行的命令,构建过程中穿插一些额外的命令
EXPOSE当前容器对外的端口号
WORKDIR指定通过终端登录容器后的默认工作目录
ENV设置环境变量
ADD将宿主机中的文件拷贝到镜像中并可自动解压 和处理URL
COPY类似ADD,但只能拷贝不能解压处理
VOLUME建立容器数据卷
CMD指定容器启动时要运行的命令,可写多个CMD但只有最后一个生效;会被docker run之后的参数替代
ENTRYPOINT功能和CMD相同,但docker run之后的参数会追加不会被替代
ONBUILD当父镜像被子镜像继承后父镜像的ONBUILD指令的内容会触发

3.4 使用例子

比如现在有一个centos的docker镜像,但是这个只是一个精简版的Linux系统,里面并没有vim,如果我想自定义一个想要的centos镜像,那么便可重新写一个dockerfile来执行
需求:

  • 添加vim
  • 改变工作目录到/usr

实现流程:

  • 编写dockerfile,有哪些需求就根据指令实现即可。随便创建一个文件名字随意
FROM centos			# 指出基础镜像是最原始的centos

ENV newPath /usr	# 设置一个环境变量newPath代表了/usr
WORKDIR $newPath	# 设置工作目录为newPath指定的位置

RUN yum -y install vim		# 为这个系统安装vim

CMD /bin/bash
  • 创建镜像:执行docker build -f dockefile路径 -t DIYcentos:1.1 .
  • 创建容器:docker run -it DIYcentos:1.1
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值