要了解Docker镜像原理,需要先了解linux操作系统。
操作系统的组成部分分为:进程调度子系统、进程通信子系统、内存管理子系统、设备管理子系统、文件管理子系统、网络通信子系统、作业控制子系统等。从整体层面来说,linux系统都是由不同的文件构成并运行的。
Docker镜像的本质是一个分层文件系统。而linux文件系统由bootfs和rootfs两部分组成(fs:file system的缩写):
我们经常接触到的linux系统如ubuntu、RedHat、centos等系统,bootfs基本一样,rootfs不同。
底层使用宿主机的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
命令查看该镜像的具体分层信息:
官方提供的镜像有时候不能满足日常使用,这个时候就需要制作符合自己个性化的镜像,镜像制作有2种方式:
对于使用者来说,是没有权限去修改镜像文件的(只有只读权限),但是我们可以操作容器啊,镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。
我们可以在容器内操作,然后根据容器生成镜像:
docker commit 容器id或容器名称 镜像名称:版本号
如果想要分享给其他人,可以将镜像压缩保存(docker save)保存到本地,然后将压缩包分享给他人,他人可以通过装载(docker load)压缩包的方式安装镜像。
镜像压缩到本地:docker save 镜像名称:版本号>路径/xxx.tar
压缩包安装镜像:docker load<路径/xxx.tar
以下以tomcat镜像为例,想要修改tomcat默认打开的页面:
Dockerfile是一个文本文件,包含了一条条的指令,在基于指定的镜像上,一条指令构建一层,最终构建出一个新的镜像。Dockerfile的关键字说明如下:
关键字 | 作用 | 备注 | 格式 |
---|---|---|---|
FROM | 指定父镜像 | 指定基于哪个image开始构建 | FROM 或FROM |
MAINTAINER | 作者或维护者信息 | 标明这个dockerfile是谁写的或维护的 | MAINTAINER xxx xxx |
LABEL | 标签 | 给镜像添加元数据,以键值对的形式,可以理解类似注释 | LABEL |
RUN | 制作镜像时执行的命令 | 构建镜像时运行的指令,默认是/bin/sh | RUN <命令行命令> 或 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 |
ARG | 构建参数 | 用于指定传递给构建运行时的变量(给dockerfile传参),相当于构建镜像时可以在外部为里面传参 | ARG |
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 镜像名称:版本
以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
题目:自定义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去创建并启动容器,验证是否符合预期