docker镜像构建

Docker镜像原理

Linux系统组成

要了解Docker镜像原理,需要先了解linux操作系统。
操作系统的组成部分分为:进程调度子系统、进程通信子系统、内存管理子系统、设备管理子系统、文件管理子系统、网络通信子系统、作业控制子系统等。从整体层面来说,linux系统都是由不同的文件构成并运行的。
Docker镜像的本质是一个分层文件系统。而linux文件系统由bootfs和rootfs两部分组成(fs:file system的缩写):

  • bootfs:包含bootloader(引导加载程序)和kernel(内核)。bootloader主要是引导加载kernel
  • rootfs:root文件系统,包含的就是Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件

我们经常接触到的linux系统如ubuntu、RedHat、centos等系统,bootfs基本一样,rootfs不同。
在这里插入图片描述

Docker镜像原理

  • Docker镜像是由特殊的文件系统叠加而成的,其最低端使用了主机(宿主机)的bootfs,其他应用是在其基础上一层层往上叠加,提供给用户的就是最顶层文件提供的对接接口。
    以下以tomcat应用进行讲解:
    我们想要运行tomcat服务,需要java可运行的环境(即jdk),jdk和tomcat又需要在linux系统上运行,所以镜像如下图:
    在这里插入图片描述

底层使用宿主机的bootfs,第二层是rootfs(root文件系统,被称base image,即基础镜像),由于tomcat服务是基于jdk开发的,所以需要在实际的tomcat服务之前,叠加jdk镜像,jdk镜像之后,再叠加真正要使用的tomcat镜像(用户使用tomcat提供的服务),所以如果我们本地安装tomcat服务时,下载的安装包只有几十MB,但是tomcat镜像却有400多MB,就是因为实际的tomcat镜像包含了其他镜像,只是对使用者来说,需要的是最顶层的tomcat服务而已,tomcat官网的安装包安装前需要我们自己去安装jdk等内容,而docker镜像是一步到位。
我们在拉取tomcat镜像时,可以看到有多个Pull,就是因为要下载多个镜像(但给用户看到的是最顶层的tomcat镜像)
在这里插入图片描述
我们在tomcat镜像生成的容器中,查看jdk版本和linux版本,是可以查到对应的信息的
在这里插入图片描述
我们也可以通过docker inspect tomcat:latest命令查看该镜像的具体分层信息:
在这里插入图片描述

总结

  • Docker镜像时由特殊的文件系统分层叠加而成
  • Docker容器是基于宿主机的bootfs运行,第2层是rootfs(基础镜像),然后根据需求往上叠加其他镜像文件。
  • Docker镜像使用了联合文件系统(Union File System)技术,该技术能够基于基础镜像,将镜像通过分层并继承的方式制作成一个完整的、统一的镜像,即一次同时加载多个文件系统,但使用者只能看到一个文件系统(可以理解为:对使用者隐藏了顶层以下的镜像文件)。

镜像制作

官方提供的镜像有时候不能满足日常使用,这个时候就需要制作符合自己个性化的镜像,镜像制作有2种方式:

  • 容器转为镜像:拉取镜像,根据镜像生成了docker容器,然后在容器的基础上进行修改,修改完成后,将容器转成镜像,然后分享给其他人。
  • dockerfile构建:在构建文件里指定构建镜像所需的指令和说明,然后通过docker bulid命令生成新的镜像。

容器转为镜像

对于使用者来说,是没有权限去修改镜像文件的(只有只读权限),但是我们可以操作容器啊,镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。
在这里插入图片描述
我们可以在容器内操作,然后根据容器生成镜像:
docker commit 容器id或容器名称 镜像名称:版本号
如果想要分享给其他人,可以将镜像压缩保存(docker save)保存到本地,然后将压缩包分享给他人,他人可以通过装载(docker load)压缩包的方式安装镜像。
镜像压缩到本地:docker save 镜像名称:版本号>路径/xxx.tar
压缩包安装镜像:docker load<路径/xxx.tar

以下以tomcat镜像为例,想要修改tomcat默认打开的页面:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Dockerfile构建镜像

Dockerfile是一个文本文件,包含了一条条的指令,在基于指定的镜像上,一条指令构建一层,最终构建出一个新的镜像。Dockerfile的关键字说明如下:

关键字作用备注格式
FROM指定父镜像指定基于哪个image开始构建FROM <image>FROM <image>:<tag>
MAINTAINER作者或维护者信息标明这个dockerfile是谁写的或维护的MAINTAINER xxx xxx
LABEL标签给镜像添加元数据,以键值对的形式,可以理解类似注释LABEL <key>=<value> <key>=<value> <key>=<value>
RUN制作镜像时执行的命令构建镜像时运行的指令,默认是/bin/shRUN <命令行命令>
RUN ["可执行文件", "参数1", "参数2"...,"参数n"](相当于:RUN 可执行文件 参数1 参数2 … 参数n)
CMD容器启动时执行的命令运行容器时执行的shell环境。每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。有3种格式:
1.exec执行:CMD ["executable","param1","param2"]
2./bin/sh中执行:CMD command param1 param2
3.提供给 ENTRYPOINT 的默认参数:CMD ["param1","param2"]
ENTRYPOINT入口一般在制作一些执行就关闭的容器中会使用ENTRYPOINT ["executable", "param1", "param2"]
COPY复制文件到镜像中构建的时候复制文件到镜像中COPY 源路径 目标路径(源路径是宿主机的路径,目标路径是容器的路径)
ADD添加文件构建时添加文件到镜像中(即将宿主机的文件添加到容器内),与COPY的区别是ADD会自动解压ADD 源路径 目标路径(源路径是宿主机的路径,目标路径是容器的路径)
ENV环境变量在构建镜像时,设置环境变量,可以在启动容器的时候,通过-e覆盖(即容器内也可以使用)ENV <key> <value>
ARG构建参数用于指定传递给构建运行时的变量(给dockerfile传参),相当于构建镜像时可以在外部为里面传参ARG <name>[=<default value>]
VOLUME定义外部可以挂载的匿名数据卷在启动容器时若忘记挂载数据卷,会自动挂载到匿名卷VOLUME ["/xxx/xx/xxxx", "xxx", ..., "xxx"]
EXPOSE声明容器的服务端口仅仅声明容器的服务端口(及提供服务的端口),帮助使用里理解并使用该端口EXPOSE 端口号
WORKDIR工作目录指定容器的开始工作目录(若没有时会自动创建)。设置之后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行WORKDIR 最好是绝对路径
USER指定容器执行用户指定运行容器时的用户名或ID执行用户USER user

dockerfile的注释符号是#
通过dockerfile构建镜像命令格式为:docker build -f dockerfile文件路径 -t 镜像名称:版本

示例1

以tomcat镜像为例,想要修改tomcat默认打开的页面:
步骤1:编辑dockerfile文件(如tomcat_dockerfile文件):
在这里插入图片描述

父镜像tomcat:jre17-temurin的信息我们可以在docker hub官网
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
选择某个版本,点击之后,跳转到的页面会展示类似dockerfile文件内容的信息,我们可以看到,tomcat设置的工作目录WORKDIR是/usr/local/tomcat,申明的服务端口是8080
在这里插入图片描述

步骤2:生成镜像(docker build)
在这里插入图片描述
注:关于docker build命令末尾的.,本人还是没搞懂,可以参考其他大神的文章:Docker学习:Docker核心命令 | 常用命令 | Docker build . 点的含义 | docker build和docker commit关系 | docker rm 与sleep用法

步骤3:验证镜像
在这里插入图片描述
访问服务器的8080端口,显示了自己编辑的内容
在这里插入图片描述

如果其他人也想使用该tomcat,你可以将镜像打包(docker save)或直接将dockerfile文件发送过去,dockerfile文件构建镜像的时候,还有一个方便的地方就是docker build的dockerfile可以是互联网可访问的文件,可以及时更新,方便访问。
使用互联网url的dockerfile构建镜像的命令是:
docker build url

注意:url不需要定位到具体的文件,要定位到文件所在路径,然后该路径下需要有文件名称是Dockerfile的文件。

示例:
docker build github.com/creack/docker-firefox
在这里插入图片描述
在这里插入图片描述

示例2

题目:自定义centos:7镜像,要求:默认登录路径为/usr;可以使用vim

官网提供的centos:7默认登录路径是根目录,无法使用vim
在这里插入图片描述
默认登录路径可以根据WORKDIR来设置,vim无法使用,是因为没有安装该应用(默认安装了vi),如果需要使用,我们就需要安装vim,所以dockerfile的RUN需要做2件事情:设置WORKDIR、安装vim,dockerfile文件内容如下:

# 基于centos:7的镜像
FROM centos:7
# 维护者信息
MAINTAINER wenxiaoba wenxiaoba@163.com
# 设置初始工作目录
WORKDIR /usr
# 执行centos安装vim命令
RUN yum -y install vim
# 定义容器启动执行的命令
CMD /bin/bash

通过docker build生成镜像
在这里插入图片描述
在这里插入图片描述
我们根据生成的镜像vim_centos:7v去创建并启动容器,验证是否符合预期
在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值